2013-07-15 36 views
1

我需要一些C#中AES加密/解密的帮助。具体来说,我想用RijndaelManaged生成IV,将其转换为文本,并将加密文本存储在数据库中。我想将IV添加到加密数据的开头,以便我可以将其删除并用于解密功能。如何将RijndaelManaged生成的IV附加到C#中用于AES解密的数据中#

这里是我的困惑所在...... 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,我只测试了几次,但似乎是模式。

有当我抓住从密文的第一个24字符作为IV然后用它解密的问题...

//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 )与该算法的块大小不匹配。“

在此先感谢。任何帮助,将不胜感激。

回答

0

24个字节来自您将转换为基本64的事实。基本64字符串是使用64个唯一符号(字符)的二进制数据的文本表示。由于只有64个值,因此每个字符只能表示6位信息。原来的IV每个字节有8位,显然是16 * 8或128位。要用6位编码表示这些128位,您需要21.3个字符,并且由于计算机通常无法处理小数字节,因此缓冲区会舍入到下一个不错的数字,在本例中为24.

在您的解密您需要使用Convert.FromBase64String将64字符串转换为二进制的逻辑。

相关问题