繁体   English   中英

指定的初始化向量(IV)与使用AES的c#中的块大小不匹配

[英]Specified initialization vector (IV) does not match the block size in c# using AES

我从Ruby中提供的示例开始:

cipher = OpenSSL::Cipher::AES.new(128, :CBC)
cipher.encrypt
cipher.key = "wB\x14=\r\xC3\xC1\x84$\x10\xCE\xC0\x10\x03\xFE\x18"
cipher.iv = "\xD8a\"\xFAs\xBD\xE4\xF9\xA4\xA1\x1E\xA5l\xA6@\xFD"

并尝试在C#中复制:

string AesKey = "wB\x14=\r\xC3\xC1\x84$\x10\xCE\xC0\x10\x03\xFE\x18";
string AesIV = "\xD8a\"\xFAs\xBD\xE4\xF9\xA4\xA1\x1E\xA5l\xA6@\xFD";

AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.BlockSize = 128;
aes.KeySize = 128;
aes.IV = Encoding.UTF8.GetBytes(AesIV);
aes.Key = Encoding.UTF8.GetBytes(AesKey);
aes.Mode = CipherMode.CBC;

byte[] src = Encoding.Unicode.GetBytes(text);
using (ICryptoTransform encrypt = aes.CreateEncryptor())
  {
      byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);
      string EncryptedResult = Convert.ToBase64String(dest);
      EncryptedValue.Text = EncryptedResult;
  }

我收到错误消息:

“指定的初始化向量(IV)与该算法的块大小不匹配。”

我是否会误解我无法解释的原始键和iv值的格式?

Ruby和C#字符串不同,因此C#IV结束时会有额外的字节。

在Ruby中,字符串实际上只是一个字节序列。 每个\\x后跟两个十六进制数字。 因此, \\xD8a实际上是字节0xD8 0x61的文本表示形式。 当将此“字符串”用作初始化向量时,无需字符编码; 它已经是伪装成文本的字节序列。

在C#中,字符串是字符序列 要将字符串转换为字节数组,需要使用字符编码-在这种情况下,您选择了UTF-8。 为了表示数百万个不同的字符,在C#中,每个\\x转义后跟1至4个十六进制数字。 因此,例如,子字符串\\xD8a不代表两个字节,而是单个字符 (U + 0D8A),当您使用UTF-8对其进行编码时,它转换为3个字节的序列0xE0 0xB6 0x8A而不是两字节0xD8 0x61相当于Ruby。

如果需要可打印的表格,可以对IV进行64位编码。 或者,您可以将其作为字节数组文字以C#形式编写:

aes.IV = new byte[] { 0xD8, 0x61, ... };

但是,这可能是没有意义的,因为实际的应用程序需要安全性,而硬编码的IV也不安全。

确保使用相同的填充技术,例如PKCS5填充或仅使用纯零。 几周前我在php / java / c#中遇到了一个问题,正是填充导致了问题。

数据存储在块中,最后一个块通常不会是其他块的确切大小,因此必须填充其末尾以使其成为正确的块大小。 在C#中,您可以轻松地进行设置,但是在ruby中,您可能必须自己编写代码以附加填充。

编辑:看起来Ruby可能默认使用PKCS5,因为它似乎在这里 ,因此只需在C#中设置填充并查看会发生什么。

aes.Padding = PaddingMode.PKCS5;

在将数据交给算法之前,也请尝试对数据进行base64编码,然后对从DEcrypt方法获得的数据进行base64解码。 我也必须这样做,否则解密中的数据有时会被破坏。

我还建议使用256位密钥,因为它更安全,并且与128位密钥一样容易使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM