AES:
问题:Java程序,在使用AES加密时发现。在Windows机器上编写测试,AES加解密均能正常使用,但服务部署到Linux服务器后,发现加解密无法正常使用了。
原因:AES加解密时,Window系统与Linux系统的随机数生成方式不同。造成不同服务器系统,加解密有差异。
原因定位于初始化密钥时,随机数问题:
public static SecretKey getKey (String strKey) {
try {
KeyGenerator _generator = KeyGenerator.getInstance( "AES" );
_generator.init(128, new SecureRandom(strKey.getBytes()));
return _generator.generateKey();
} catch (Exception e) {
throw new RuntimeException( " 初始化密钥出现异常 " );
}
}
解决:修改初始化密钥方式
public static SecretKey getKey(String strKey) {
try {
KeyGenerator _generator = KeyGenerator.getInstance( "AES" );
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
secureRandom.setSeed(strKey.getBytes());
_generator.init(128,secureRandom);
return _generator.generateKey();
} catch (Exception e) {
throw new RuntimeException( " 初始化密钥出现异常 " );
}
}
RSA:
更新前:
/**
* 根据指定的密文种子,生成并返回RSA密钥对。
*/
private static synchronized KeyPair generateKeyPair() {
try {
keyPairGen.initialize(KEY_SIZE,
new SecureRandom(radamKey.getBytes()));
oneKeyPair = keyPairGen.generateKeyPair();
return oneKeyPair;
} catch (InvalidParameterException ex) {
ex.printStackTrace();
} catch (NullPointerException ex) {
ex.printStackTrace();
}
return null;
}
解决:
private static synchronized KeyPair generateKeyPair() {
try {
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");//
random.setSeed(radamKey.getBytes());//增加两行指定随机数算法为SHA1PRNG
keyPairGen.initialize(KEY_SIZE, random);
oneKeyPair = keyPairGen.generateKeyPair();
return oneKeyPair;
} catch (Exception e){
e.printStackTrace();
}
return null;
}
RSA前台加密后台解密的应用
https://www.cnblogs.com/yadongliang/p/11639763.html#_label0
这里的generateKeyPair就是没有指定随机数算法导致我今天更新到现在,呜呜。。。。