我使用Cipher.getInstance(“DES”)来加密和解密消息,我发现它在sun jre和ibm jre上得到了不同的结果。所以我不能在AIX上加密消息然后在Linux上解密。我尝试导入sunjce并在ibm jre环境中使用它并获得与使用ibmjce相同的结果,但它与sun jre不同。是否有一种加密消息的方法在sun jre和ibm jre上获得相同的结果? 下面的代码在sun jre和ibm jre上运行会得到不同的结果。
public static void test2() throws Exception {
Security.addProvider(new SunJCE());
Security.addProvider(new IBMJCE());
String strKey = "12345678";
KeyGenerator generator = KeyGenerator.getInstance("DES", "SunJCE");
// KeyGenerator generator = KeyGenerator.getInstance("DES", "IBMJCE");
System.out.println("KeyGenerator provider:" + generator.getProvider());
//
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(strKey.getBytes());
generator.init(secureRandom);
Key key = generator.generateKey();
Cipher cipher = Cipher.getInstance("DES", "SunJCE");
// Cipher cipher = Cipher.getInstance("DES", "IBMJCE");
System.out.println("Cipher provider:" + cipher.getProvider());
cipher.init(Cipher.ENCRYPT_MODE, key);
String strTest = "TESTtest123";
byte[] byteTest = strTest.getBytes("UTF-8");
byte[] byteEncry = cipher.doFinal(byteTest);
System.out.println("strTest:" + strTest);
System.out.println("encode:" + new BASE64Encoder().encode(byteEncry));
}
任何想法,建议或解决方法都表示赞赏。感谢。
编辑: 我的应用程序部署在windows,red hat linux和aix上。他们可以将加密的消息传递给对方,接收器将解密消息。它在win和linux上工作正常。但是aix总是得到一个例外“javax。 crypto.BadPaddingException:给定最终块没有正确填充“当试图解密来自其他系统的消息时。当窗口或linux尝试解密来自aix的消息时发生同样的事情。有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
服务提供者接口的全部目的是指定所需的功能(DES),系统为您提供适当的实现。不要试图选择特定的提供商,只需像getInstance("DES")
那样使用SecureRandom
。
请注意,您确实需要指定所需的完整密码设置;只是DES
不够具体,这可能会导致您看到的任何不兼容性。 DES/CBC/PKCS5Padding
可能就是您想要的,如果您正在使用新系统,则应使用AES。