1

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");
4

3 に答える 3

0

一般に、Java は C# とは異なるデフォルトを持っているため、特にバイトと文字列を変換する場合は、どこでもデフォルトに依存しないでください。任意のポイントで UTF-8 文字列を分割することに関する @jtahlborn のコメントと同様に、C# コードで行ったように、Java コードでも UTF-8 を指定する必要があります。

System.out.println(new String(decryptedBytes, "UTF-8"));

文字をチェックするのではなく、実際のバイトをチェックしてみてください。これにより、不一致が発生している可能性のある場所をより適切に処理できるようになります。

于 2013-08-28T12:17:25.960 に答える
0

utf-8 バイトの任意のチャンクを取得して文字列に変換することはできません (また、文字セットを指定していません)。文字セットを指定して、すべてのバイトをまとめて文字列に変換する必要があります"UTF-8"

于 2013-08-28T01:48:45.620 に答える