指定的初始化向量(IV)与使用AES的c#中的块大小不匹配
我从Ruby中提供的一个示例开始:指定的初始化向量(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)与此算法的块
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, ... };