私が受講しているコースでは、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;
}