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: 他のシステムからのメッセージを復号化しようとすると、「最終ブロックが適切に埋め込まれていない」というメッセージが表示されます。ウィンドウまたは Linux が aix からのメッセージを復号化しようとすると、同じことが起こりました。この問題を解決する方法はありますか?

4

1 に答える 1

1

Service Provider Interface の全体的な目的は、ユーザーが必要な機能 (DES) を指定し、システムが適切な実装を提供することです。特定のプロバイダーを選択しようとしないでgetInstance("DES")くださいSecureRandom

必要な完全な暗号設定を指定する必要があることに注意してください。ただDES十分に具体的ではなく、これが非互換性を引き起こしている可能性があります。DES/CBC/PKCS5Padding新しいシステムで作業している場合は、代わりに AES を使用する必要があります。

于 2013-10-18T05:30:43.760 に答える