【问题标题】:ICryptoTransform.TransformBlock : What's going on?ICryptoTransform.TransformBlock:发生了什么事?
【发布时间】:2013-05-10 09:00:43
【问题描述】:

我正在学习 ICryptoTransform。

我加密了一些数据并使用 ICryptoTransform.TransformBlock 将它们解密回来。没有抛出异常,但我发现我的数据向右移动了大约一个 bolck。

请看下面的代码:

//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();

我认为 input 应该等于 backput

但我的程序输出:

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 吗?

谢谢。 (最后请原谅我的英语不好...)

【问题讨论】:

  • 嗯,我知道 CryptoStream 是一个更好的选择,但我只想知道问题出在哪里......(或者我们不能直接使用它?)
  • 不对您的问题负责,但 System.Random 不应用于创建密钥甚至 IV。
  • 你的问题可能与没有检查TransformBlock的返回值和没有使用TransformFinalBlock有关。
  • @CodesInChaos 好吧,感谢您的评论,我发现第一个 invdev.TransformBlock 实际上返回 0! ...这可能是我的程序错误的地方。谢谢!

标签: c# .net cryptography aes


【解决方案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...这就是为什么我的程序出错了。

似乎Aes可能需要在transform之前进行prepare,以便第一个TransformBlock返回0。

【讨论】:

  • 但是TransformFinalBlock仍然必须被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 2014-02-28
相关资源
最近更新 更多