//第二种和第一种类似 加密方式由EBC 改成 CBC 增加了向量 每太明白可能就是增加复杂度吧
//这个是写借口的时候 我用java 别人用的是别的语言 AES加密对应不上 别人提供的 如果没有汉字就对上了 ,有了汉字加密后的16进制也是不一样的
//想到的办法是用 URLEncorder.encode("汉字") 进行转码 或者这里面提供的把汉字转换为二进制
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AESUtil2 {
/*
* 算法/模式/填充 16字节加密后数据长度 不满16字节加密后长度
* AES/CBC/NoPadding 16 不支持
* AES/CBC/PKCS5Padding 32 16
* AES/CBC/ISO10126Padding 32 16
* AES/CFB/NoPadding 16 原始数据长度
* AES/CFB/PKCS5Padding 32 16
* AES/CFB/ISO10126Padding 32 16
* AES/ECB/NoPadding 16 不支持
* AES/ECB/PKCS5Padding 32 16
* AES/ECB/ISO10126Padding 32 16
* AES/OFB/NoPadding 16 原始数据长度
* AES/OFB/PKCS5Padding 32 16
* AES/OFB/ISO10126Padding 32 16
* AES/PCBC/NoPadding 16 不支持
* AES/PCBC/PKCS5Padding 32 16
* AES/PCBC/ISO10126Padding 32 16
*
* 注:
* 1、JCE中AES支持五中模式:CBC,CFB,ECB,OFB,PCBC;支持三种填充:NoPadding,PKCS5Padding,ISO10126Padding。 不带模式和填充来获取AES算法的时候,其默认使用ECB/PKCS5Padding。
* 2、Java支持的密钥长度:keysize must be equal to 128, 192 or 256
* 3、Java默认限制使用大于128的密钥加密(解密不受限制),报错信息:java.security.InvalidKeyException: Illegal key size or default parameters
* 4、下载并安装JCE Policy文件即可突破128密钥长度的限制:覆盖jre\lib\security目录下local_policy.jar、US_export_policy.jar文件即可
* 5、除ECB外,需提供初始向量(IV),如:Cipher.init(opmode, key, new IvParameterSpec(iv)), 且IV length: must be 16 bytes long
*/
private static String ALGORITHM = "AES";
private static int keySize = 128;
private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
public static SecretKeySpec bulidKey(String password) throws NoSuchAlgorithmException {
KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM);
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(password.getBytes());
kgen.init(keySize, secureRandom);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
return key;
}
/**
* 加密
*
* @param content
* 需要加密的内容
* @param password
* 加密密码
* @return
*/
public static byte[] encrypt(String content, String password) {