![](/img/trans.png)
[英]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.