C# で暗号化された Java バイトの復号化に問題があります。
Java からの出力では、5 つの平文ブロックのうち最後の 2 つに誤りがあります。ブロック 4 は完全に間違っており、ブロック 5 には 1 文字のエラーがあります。
私が再確認した/注意したこと:
- キーと IV は同じですが、最後に 16 ビット C# キーの最初のバイトを繰り返して 24 ビット Java キーを作成する必要がありました。
- C# は CBC と PKCS7 を使用しています。ブロックサイズは 8 です。
- Java は CBC と PKCS5 を使用しています (これは、この目的では 7 と同じであると想定されています)。
これがC#の暗号化側です
byKey = Encoding.UTF8.GetBytes(key);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
byte[] inputByteArray = Encoding.UTF8.GetBytes(val);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Convert.ToBase64String(ms.ToArray());
そしてJavaでの復号化
byte[] inputByteArray = Base64.decode(val);
Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
c.init(Cipher.DECRYPT_MODE, new SecretKeySpec(byKey, "DESede"), new IvParameterSpec(iv, 0, 8));
byte[] decryptedBytes;
for (int i = 0, j = 0; i < inputByteArray.length; i++) {
if ((decryptedBytes = c.update(inputByteArray, i, 1)) == null)
continue;
else {
System.out.println(new String(decryptedBytes));
j += decryptedBytes.length;
}
}
sys out にプレーンテキスト ブロックが表示されることを期待しています。.update() ループを .doFinal() に置き換えることができることは承知していますが、ブロックごとに見たかったのです。
私はJavaにあまり詳しくないので、そこに何か提案があれば特に感謝します.
編集 テキストのエンコーディングが問題だとは思いません。ブロックごとの性質を示すことなく、同じ問題を示す元のコードを次に示します。
byte[] decrypted = c.doFinal(inputByteArray);
return new String(decrypted, "UTF-8");