引言:本文主要解决Java中用AES加密及解密,同时可通过Python脚本对Java加密后的字符进行解密的操作。

由于近期工作中用到需要使用Java对一串密钥进行加密,并且后台通过Python语言读取加密后的密钥并解密,搜索了很多文章,索性最后实现了,自己整理一下。

Java语言实现AES加密及解密

 import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; import org.apache.commons.lang.StringUtils; import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; /**
* <p>Title: TestAES3</p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2012 All rights reserved.</p>
* <p>Company: Neusoft Corporation, China, Ltd.</p>
* @author chendch
*
*/
public class TestAES3
{
private String ALGO = "AES";
private String ALGO_MODE = "AES/CBC/NoPadding";
private String akey = "keyskeyskeyskeys";
private String aiv = "keyskeyskeyskeys";
private String padding = " ";
private int blockSize = 16; /**
* @param content
* @return password
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws UnsupportedEncodingException
* @throws InvalidAlgorithmParameterException
* @throws InvalidKeyException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public String encrypt(String content)
throws NoSuchAlgorithmException, NoSuchPaddingException, UnsupportedEncodingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException,
BadPaddingException
{
String encryptContent = content;
if (encryptContent.length() < blockSize)
{
encryptContent = StringUtils.rightPad(content, blockSize, padding);
System.out.println("补位后:" + encryptContent);
} Cipher cipher = Cipher.getInstance(ALGO_MODE);
SecretKeySpec keyspec = new SecretKeySpec(akey.getBytes("utf-8"), ALGO);
IvParameterSpec ivspec = new IvParameterSpec(aiv.getBytes("utf-8"));
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] byteEncode = encryptContent.getBytes("utf-8");
byte[] byteAES = cipher.doFinal(byteEncode); String AESEncode = new String(new BASE64Encoder().encode(byteAES)); return AESEncode;
} /**
* @param content
* @return content
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws InvalidAlgorithmParameterException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws IOException
*/
public String decrypt(String content)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException,
BadPaddingException, IOException
{
byte[] byte_content = new BASE64Decoder().decodeBuffer(content); Cipher cipher = Cipher.getInstance(ALGO_MODE);
SecretKeySpec keyspec = new SecretKeySpec(akey.getBytes("utf-8"), ALGO);
IvParameterSpec ivspec = new IvParameterSpec(aiv.getBytes("utf-8")); cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); byte[] byte_decode = cipher.doFinal(byte_content);
String AES_decode = new String(byte_decode, "utf-8");
return AES_decode.trim();
} /**
* @param args
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
* @throws InvalidAlgorithmParameterException
* @throws InvalidKeyException
* @throws IOException
*/
public static void main(String[] args)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException,
BadPaddingException, IOException
{
TestAES3 testAES3 = new TestAES3();
String content = "chenduoc";
System.out.println("加密前:" + content); String encryptContent = testAES3.encrypt(content);
System.out.println("加密后:" + encryptContent); String decryptContent = testAES3.decrypt(encryptContent);
System.out.println("解密后:" + decryptContent);
}
}

Python实现AES加密及解密

#!/usr/bin/python
#coding=utf-8 from Crypto.Cipher import AES
import base64 BLOCK_SIZE = 16
PADDING = " "
key = "keyskeyskeyskeys"
iv = "keyskeyskeyskeys" pad_it = lambda s : s+(BLOCK_SIZE - len(s)) * PADDING def encrypt(content):
generator = AES.new(key, AES.MODE_CBC, iv)
encrypt_content = generator.encrypt(pad_it(content))
encode_content = base64.b64encode(encrypt_content) return encode_content def decrypt(content):
generator = AES.new(key, AES.MODE_CBC, iv)
decode_content = base64.b64decode(content)
decrypt_content = generator.decrypt(decode_content) return decrypt_content.rstrip(PADDING) content = "neteye"
print "加密前:",content encrypt_contnet = encrypt(content)
print "加密后:",encrypt_contnet decrypt_content = decrypt(encrypt_contnet)
print "解密后:",decrypt_content

注意点:Java中定义的key和iv变量和python中定义的必须一致,且加密的字符串需满足16位或24位等,不满足时需要进行补位,以上程序都已实现且可用。

JAVA中AES对称加密和解密以及与Python兼容的更多相关文章

  1. JAVA中AES对称加密和解密

    AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...

  2. java的AES对称加密和解密,有偏移量

    import java.math.BigDecimal; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; i ...

  3. AES对称加密和解密

    package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...

  4. AES对称加密和解密(转)

    AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...

  5. JAVA实现AES的加密和解密算法

    原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import ja ...

  6. eclipse JAVA实现AES的加密和解密算法

    import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.Secre ...

  7. AES —— JAVA中对称加密和解密

    package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...

  8. AES对称加密解密类

    import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...

  9. Java安全之对称加密、非对称加密、数字签名

    原文地址: http://blog.csdn.net/furongkang/article/details/6882039 Java中加密分为两种方式一个是对称加密,另一个是非对称加密.对称加密是因为 ...

随机推荐

  1. C-LODOP的端口和网站的端口

    c-lodop的端口和网站的端口是不同的,不需要修改自己网站的端口.c-lodop32位标准版端口:8000,18000 (http网站)c-lodop32扩展版端口:8000,18000(http网 ...

  2. golang web框架设计2:自定义路由

    继续学习谢大的Go web框架设计 HTTP路由 http路由负责将一个http的请求交到对应的函数处理(或者一个struct的方法),路由在框架中相当于一个事件处理器,而这个时间包括 用户请求的路径 ...

  3. OpenCV类型对照表

    有些时候处理图像必须使用灰度图或者单波段处理,速度快,所以在处理之前就需要先判断图像类型,根据不同类型图像使用不同方法处理. 获取type值 Mat img = imread("lena.j ...

  4. 信用卡分销系统源码、分销系统定制贴牌、信用卡三级分销系统源码、信用卡返佣系统OEM

    信用卡返佣分销系统贴牌,全套源码,可定制UI界面 这一整套绝对是市场上最完善最好的一套系统:里面的特色功能: 1.合伙人功能,解决你前期的资金以及资源问题 2.推广素材库,全方位增加推广效率 3.红包 ...

  5. 《Java语言程序设计》异常处理

    一.请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. 1. 源代码为: import javax.swing.*; class A ...

  6. SSH连接时root用户无法验证通过

    解决办法是: vi /etc/ssh/sshd_config 找到 # Authentication: PermitRootLogin without passwd 改成 # Authenticati ...

  7. JAVA计算字符串UTF-8字节数

    String str = "C++/C#/JAVA软件开发"; try { System.out.println(str.getBytes("UTF-8").l ...

  8. PTA(Basic Level)1039.到底买不买

    小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子 ...

  9. 龙芯 飞腾 intel的 OpenBenchMarking数据

    1. 今天从openbenchmarking 里面进行了简单的查找. 数据主要为: 机器配置: LS3A3000的数据为: 来源: https://openbenchmarking.org/resul ...

  10. 小菜鸟之oracle

    oracle 存储过程 函数 创建 删除 参数 传递 函数 查看 包 系统包 分类: Oracle 2011-10-27 17:31 264人阅读 评论(0) 收藏 举报   认识存储过程和函数 存储 ...