在项目开发中,使用AES加密算法进行数据加密时,有可能产生的错误。
加密方法:
private Key initKeyForAES(String key) throws NoSuchAlgorithmException {
if (null == key || key.length() == 0) {
throw new NullPointerException("key not is null");
}
SecretKeySpec key2 = null;
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
random.setSeed(key.getBytes());
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128, random);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
key2 = new SecretKeySpec(enCodeFormat, "AES");
} catch (NoSuchAlgorithmException ex) {
throw new NoSuchAlgorithmException();
}
return key2;
}
有可能会产生的错误:
java.security.NoSuchAlgorithmException: AES KeyGenerator not available
...
javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
at com.dcc.core.util.AesCoder.decrypt(AesCoder.java:67)
at com.dcc.server.controller.EntranceController.process(EntranceController.java:68)
at sun.reflect.GeneratedMethodAccessor48.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
我这里的原因是:
此处错误是JRE设置错误,AES需要用到sunjce_provider.jar包,jre1.6中未提供。
jre1.7的扩展包中提供了,所以需要把jre设置成1.7便能正常运行。
由于开发需要,我使用的JDK环境经常在1.7,1.8之间调整。如果报同样的错误,调整jre的环境为1.7的。目前错误以解决。如果有其它原因造成的错误。欢迎大家留言交流!
参考:http://zjhdreams.iteye.com/blog/2175250