簡體   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