Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指定的初始化向量(IV)与使用AES的c#中的块大小不匹配_C#_Security_Aes - Fatal编程技术网

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

指定的初始化向量(IV)与使用AES的c#中的块大小不匹配,c#,security,aes,C#,Security,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#中复制: 我得到了一个错误: “指定的初始化向量(IV)与此算法的块

我从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#中复制:

我得到了一个错误:

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


我是否误解了我无法解释的原始密钥和iv值的格式?

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

数据存储在块中,最后一个块的大小通常与其他块的大小不同,因此它必须填充它的末尾,使其成为正确的块大小。在C#中,您可以轻松设置它,但在ruby中,您可能需要自己编写代码来添加填充

编辑:看起来Ruby默认情况下可能会使用PKCS5,所以只需在C#中设置填充,看看会发生什么

aes.Padding = PaddingMode.PKCS5;
在将数据交给算法之前,还可以尝试对数据进行base64编码,然后对从decrypt方法获得的数据进行base64解码。我也必须这样做,否则解密的数据有时会被破坏

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

Ruby和C#字符串不同,因此您的C#IV中会有额外的字节

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

在C#中,字符串是一个字符序列。要将字符串转换为字节数组,需要使用字符编码。在本例中,您选择了UTF-8。为了表示数百万个不同的字符,在C#中,每个字符后面都跟有1到4个十六进制数字。因此,例如,子字符串
\xD8a
并不表示两个字节,而是表示单个字符
(U+0D8A),当您使用UTF-8对其进行编码时,它将转换为3字节序列0xE0 0xB6 0x8A,而不是两字节0xD8 0x61 Ruby等价物

如果需要可打印表单,可以使用base-64–对IV进行编码。或者您可以用C#将其作为字节数组文字写入:

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

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

您可能了解一些东西,但安全性中没有定义。PKCS5和PKCS7的加密会导致相同的错误。在将数据插入算法之前,您还应该尝试base64_编码。我也必须这样做,否则解密的数据有时会被破坏。
aes.IV = new byte[] { 0xD8, 0x61, ... };