[英]Specified initialization vector(IV) does not match the block size for this algorithm
[英]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.