0

ICryptoTransform を学習しています。

そして、一部のデータを暗号化し、ICryptoTransform.TransformBlock を使用して復号化しました。例外はスローされませんが、データが 1 ボルクほど正しく移動することがわかりました。

以下のコードを見てください:

//Init
var aes = new AesCryptoServiceProvider();
var key = new byte[16];
var IV = new byte[16];
var rand = new Random();
rand.NextBytes(key);
rand.NextBytes(IV);
var dev = aes.CreateEncryptor(key, IV);
var invdev = aes.CreateDecryptor(key, IV);
const int bufsize = 16 * 2;
var input = new byte[bufsize];
var output = new byte[bufsize];
var backbuf = new byte[bufsize];
rand.NextBytes(input);

// Start Caculate
for (int i = 0; i < bufsize; i += 16)
    dev.TransformBlock(input, i, 16, output, i);
backbuf[0] = 10; // it seems that invdev didn't touch backbuf[0 ~ 15]
for (int i = 0; i < bufsize; i += 16)
    invdev.TransformBlock(output, i, 16, backbuf, i);

// Output
for (int i = 0; i < bufsize; ++i)
{ Console.Write(input[i]); Console.Write(' '); }
Console.WriteLine();
for (int i = 0; i < bufsize; ++i)
{ Console.Write(output[i]); Console.Write(' '); }
Console.WriteLine();
for (int i = 0; i < bufsize; ++i)
{ Console.Write(backbuf[i]); Console.Write(' '); }
Console.WriteLine();
Console.ReadKey();

入力はバック と同じであるべきだと思います

しかし、私のプログラムは次のように出力します:

83 202 85 77 101 146 91 55 90 194 242 26 118 40 46 218 196 202 75 234 228 232 146 156 169 250 72 130 78 185 52 14

219 44 184 142 192 20 222 199 39 232 160 115 254 18 250 70 43 81 149 152 140 4 249 193 248 57 18 59 149 30 41 23

10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 83 202 85 77 101 146 91 55 90 194 242 26 118 40 46 218

面白くて紛らわしいです... ICryptoTransform.TransformBlock と私のプログラムの何が問題になっていますか? または、ICryptoTransform.TransformBlock を直接使用できますか?

ありがとう。(最後に私の下手な英語を許してください...)

4

1 に答える 1

1

まあ、私は解決策を見つけるかもしれません 実際、ICryptoTransform.TransformBlock には整数の戻り値があり、これは CodesInChaos が言ったように、成功した変換されたバイト数を意味します。ICryptoTransform.TransformBlock の正しい使い方は次のとおりです。

int transed = 0;
for (int i = 0; i < bufsize; i += transed )
    transed = invdev.TransformBlock(output, i, 16, backbuf, i);

そして面白いことに、最初の TransformBlock メソッドは 0 を返します...そして、それが私のプログラムが間違っている理由です。

最初の TransformBlock が 0 を返すように、Aes は変換前に準備が必要なようです。

于 2013-05-19T03:26:46.627 に答える