簡體   English   中英

如何在C#中將RijndaelManaged生成的IV附加到數據以進行AES解密

[英]How to append a RijndaelManaged generated IV to data for AES decryption in C#

我在C#中需要有關AES加密/解密的幫助。 具體來說,我想用RijndaelManaged生成IV,將其轉換為文本,然后將IV和加密后的文本存儲在數據庫中。 我想將IV附加到加密數據的開頭,以便可以將其刪除並將其用於解密功能。

這是我的困惑所在。RijndaelManaged生成的IV是一個字節數組,長16個字節。 因此,我認為IV轉換為文本時應為16個字符長,但事實並非如此。

IV的長度為16個字節,但是當我將這16個字節轉換為文本時,它的長度為24個字符。 那是正常的嗎? 每次都會發生這種情況嗎? 如果是這樣,那么我只是將加密文本的前24個字符作為解密的IV,而不是前16個字符(但這會產生另一個錯誤,如下所述)。 我真的很想了解發生了什么。

這里是一些代碼。

RijndaelManaged RM= new RijndaelManaged();
byte[] InitialVectorBytes = RM.IV;

// For testing
string stringIV = Convert.ToBase64String(InitialVectorBytes);
int IVLength = InitialVectorBytes.Length;

string test = "IV is " + stringIV + ". Length is " + IVLength;
MessageBox.Show(test);

// MessageBox displays -  "IV is m4L5Xs2FsPoIMSH7qraghQ==. Length is 16"

因此,IV的長度為24個字符(由於某種原因,總是以==結尾),但IV的長度為16。我只測試了幾次,但這似乎是一種模式。

當我確實從IV的加密文本中獲取前24個字符然后用它解密時出現問題...

//Using the first 24 characters of encrypted text as the IV
string InitialVector = CipherText.Remove(24); 

byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(InitialVector);
ICryptoTransform Decryptor = RM.CreateDecryptor(KeyBytes, InitialVectorBytes)

我收到另一個錯誤...“指定的初始化向量(IV)與該算法的塊大小不匹配。”

提前致謝。 任何幫助,將不勝感激。

24字節來自轉換為base 64的事實。Base 64字符串是使用64個唯一符號(字符)的二進制數據的文本表示形式。 由於只有這64個值,因此每個字符只能代表6位信息。 顯然,您的原始IV每個字節有8位,因此是16 * 8或128位。 要用6位編碼表示那些128位,您將需要21.3個字符,並且由於計算機通常無法處理小數字節,因此緩沖區將舍入到下一個整數,在這種情況下為24。

在解密邏輯中,您需要使用Convert.FromBase64String從64字符串轉換回二進制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM