0

我使用 Cipher.getInstance("DES") 加密和解密消息,我发现它在 sun jre 和 ibm jre 上得到不同的结果。所以我不能在 AIX 上加密消息然后在 Linux 上解密。我尝试导入 sunjce 并在 ibm jre 环境中使用它并获得与使用 ibmjce 相同的结果,但它与在 sun jre 上不同。有没有办法加密消息在 sun jre 和 ibm jre 上获得相同的结果?下面的代码在 sun jre 和 ibm jre 上运行会得到不同的结果。</p>

    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:Given final block not proper padded"当尝试解密来自其他系统的消息时。同样的事情发生在window或linux尝试解密来自aix的消息时。有没有办法解决这个问题?

4

1 回答 1

1

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

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

于 2013-10-18T05:30:43.760 回答