Cipher.getInstance(“DES”)在sun jre和ibm jre上返回不同的结果

时间:2013-10-18 05:26:09

标签: java

我使用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的消息时发生同样的事情。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

服务提供者接口的全部目的是指定所需的功能(DES),系统为您提供适当的实现。不要试图选择特定的提供商,只需像getInstance("DES")那样使用SecureRandom

请注意,您确实需要指定所需的完整密码设置;只是DES不够具体,这可能会导致您看到的任何不兼容性。 DES/CBC/PKCS5Padding可能就是您想要的,如果您正在使用新系统,则应使用AES。