最近涉及到的数据需要进行AES加密,关于AES加密的算法 在网上可以搜寻到很多很多。
但是如果稍微不注意就会产生错误。我在这里总结一下我当初碰见的错误 并说说自己的解决方法。
首先 加密算法
public static String encrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance(AES);
SecureRandom sr = new SecureRandom();// java pc版加密设置
// SecureRandom sr = SecureRandom.getInstance(SHA1, CRYPTO);//
// android版加密设置
sr.setSeed(password.getBytes());
kgen.init(256, sr); // 192 and 256 bits may not be available
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES);
Cipher cipher = Cipher.getInstance(AES);// java pc版加密设置
// Cipher cipher = Cipher.getInstance(CIPHER);// Android版加密设置
byte[] byteContent = content.getBytes();
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
return parseByte2HexStr(cipher.doFinal(byteContent));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
当初在网上找到算法之后 直接引用到Android上发现不对。 但是在Eclipse中的java项目下直接运行测试发现可以成功。
最后才知道如果是在Android上加密 需要设置两个地方
SecureRandom sr = SecureRandom.getInstance(SHA1, CRYPTO);
Cipher cipher = Cipher.getInstance(CIPHER);// Android版加密设置
这两个地方需要注意的。
解密代码同理
/**
* 解密
*
* @param content
* 待解密内容
* @param password
* 解密密钥
* @return
*/
public static byte[] decrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance(AES);
SecureRandom sr = new SecureRandom();// java pc版解密设置
// SecureRandom sr = SecureRandom.getInstance(SHA1, CRYPTO);//
// Android
sr.setSeed(password.getBytes());
kgen.init(256, sr);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES);
Cipher cipher = Cipher.getInstance(AES);// java pc版设置
// Cipher cipher = Cipher.getInstance(CIPHER);// Android版设置
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
return cipher.doFinal(parseHexStr2Byte(content));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
但我还是在这里说详细一点
如果要对于一段数据进行AES加密 那么加密的时候 你就要设置密钥,其实就是密码了。你设置了密码之后,其他人即使
和你使用同样的算法 也需要你的密码才能解析出来数据。
好了下面是关于
Illegal key size or default parameters 时的解决办法
出现这个错误 他的意思就是告诉你,你设置的256的密钥长度哥解决不了。 太长了。
原因在于jre本身携带的 JCE :local_policy.jar 和 US_export_policy.jar 太老了。需要下载最新的才行 。
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
我这个链接提供的是 jce8,一般下载最新的没有多大问题了。
下载之后 会有两个jar文件 一个是local_policy.jar 和 US_export_policy.jar
然后将这个俩个jar文件复制替换你的jdk中的原文件就可以了 。
替换路径:Java\lib\security 。这个文件夹中是有那两个jar 的,但我们不用在意,直接复制替换即可
关于路径问题 我这个安装的时候就直接写成了java。 可能大家的一般会是 \jreXX\lib\security要的就是替换Jre下面的。
这个时候就会发现没有问题了。
然后我之后又碰见了第三个问题:
KeyGenerator kgen = KeyGenerator.getInstance(AES);
我的开始加密的第一句话上。
public static void main(String[] args) {
String s = "我要加密这个文本";
String ss = AESUtil.encrypt(s, "123456");
System.out.println("加密后:" + ss);
String ed = AESUtil.decrypt(ss, "123456");
System.out.println("解密后:" + ed);
}
加密后:25E322A1A69785A889F4B66BED61C53C78C111AF2E878B353F8248616DFA6237
解密后:我要加密这个文本
ps:看到大家下载后的评论中, 我先解释下, 这个demo只是解决了在Android 加密 可以在Android进行解密,在java端加密 可以在java端解密。
至于Android 加密 java端解密 这个过程我没有去验证过,so,应该会有问题吧 。