4

私が受講しているコースでは、3DES スキームを手動で実装していますが、これは紙の上では非常に単純です (EDE 暗号化を使用した 2 つのキー)。実装言語として Java を選択しましたが、Java が異なるキーで暗号化/復号化を処理する方法に問題がありました。2 番目のラウンド (つまり、K2 での「復号化」) を適用しようとすると、javax.crypto.BadPaddingException エラーが発生し続けます。デフォルトの DES 暗号は PKCS5Padding を使用しており、これが問題だと思いますが、回避方法がわかりません。暗号化のための私のコードは以下のとおりです (簡単すぎないことを願っています。簡単なことを見落としていないことを願っています)。前もって感謝します。

キーの定義 (非常に基本的なものであり、ブラウジング中にいくつかの異なるアプローチを見てきたため、改善を検討します)

        KeyGenerator kgen = KeyGenerator.getInstance("DES");
        SecretKey sk_1 = kgen.generateKey(); 
        SecretKey sk_2 = kgen.generateKey();
        byte[] raw_1 = sk_1.getEncoded();
        byte[] raw_2 = sk_2.getEncoded();

        spec_1 = new SecretKeySpec(raw_1, "DES"); //key 1
        spec_2 = new SecretKeySpec(raw_2, "DES"); //key 2

        cipher = Cipher.getInstance("DES"); //standard mode is ECB which is block-by-block w/PKCS5Padding
        cipher2 = Cipher.getInstance("DES");


    protected byte[] get3DESEncryption(byte[] plaintext) throws Exception{
        byte[] output = new byte[plaintext.length];
        System.out.println("output len init: " + output.length);
        cipher.init(Cipher.ENCRYPT_MODE, spec_1);
        cipher2.init(Cipher.DECRYPT_MODE, spec_2);

        //first encryption round, key 1 used
        output = cipher.doFinal(plaintext);
        //second "encryption" round, key 2 used but decrypt run
        output = cipher2.doFinal(output);
        //third encryption round, key 1 used
        output = cipher.doFinal(output);

        //return ciphertext
        return output;
    } 
4

1 に答える 1

2

問題は、2 番目 (復号化) と 3 番目 (暗号化) のステップでパディングを使用しないことです。実際に適用するときEDEは、プレーンテキストのみをパディングする必要があります。

変換の形式は次のとおりです。

"algorithm/mode/padding" または "algorithm" (後者の場合、モードとパディング スキームのプロバイダー固有の既定値が使用されます)。

したがって、cipher2 と cipher3 でパディングを使用しないように明示的に指示する必要があります (後者はまだ作成していません)。

したがって、次の 3 つの暗号オブジェクトが必要です。

  • cipher1 DES/ECB/PKCS5Padding
  • cipher2 DES/ECB/NoPadding
  • cipher3 DES/ECB/NoPadding

【追加ヒント】

復号化するには、暗号を別の方法で初期化する必要があり、暗号の順序も変更する必要があります。

于 2012-10-09T04:03:45.030 に答える