我正在尝试在文本文件中存储用于AES加密的IV。
基于这篇文章: Storing/Converting the encryption key and IV as strings
我应该将字节数组转换为base64字符串。
根据这个:How to convert string to base64 byte array, would this be valid?
我应该使用Encoding.ASCII.GetBytes
来执行此操作。
但是,当我尝试再次设置向量时,使用保存的字符串,它会抛出一个异常,告诉我它与块大小不匹配。
以下是相关代码:
internal static void OutputProviderKeyAndVector()
{
try
{
string s =
Convert.ToBase64String(m_Aes.Key)
+ ":" +
Convert.ToBase64String(m_Aes.IV);
File.WriteAllText(m_FileName, s);
}
catch(Exception e) { Console.WriteLine(e.ToString()); }
}
internal static void InitializeProviderWithKey(string key, string iv)
{
try
{
m_Aes = new AesCryptoServiceProvider();
m_Aes.BlockSize = 128;
m_Aes.KeySize = 256;
m_Aes.IV = Encoding.ASCII.GetBytes(iv);
m_Aes.Key = Encoding.ASCII.GetBytes(key);
m_Aes.Mode = CipherMode.CBC;
m_Aes.Padding = PaddingMode.PKCS7;
}
catch(Exception e) { Console.WriteLine(e.ToString()); }
}
基于我上面提到的两个帖子,我希望这可行。但是,为IV创建的字节数组长度为16个字节,转换后它的长度为24个字节,因此转换显然不起作用。
所以,我去寻找另一个解决方案。
在这个问题中,最多投票和选择正确的答案提供了两种方法,基于对答案的评论,这两种方法是Encoding.Unicode.GetString
和Encoding.Unicode.GetBytes
的“重新实现”。 / p>
所以,我尝试了unicode转换。
internal static void OutputProviderKeyAndVector()
{
try
{
string s =
Encoding.Unicode.GetString(m_Aes.Key)
+ ":" +
Encoding.Unicode.GetString(m_Aes.IV);
File.WriteAllText(m_FileName, s);
}
catch(Exception e) { Console.WriteLine(e.ToString()); }
}
internal static void InitializeProviderWithKey(string key, string iv)
{
try
{
m_Aes = new AesCryptoServiceProvider();
m_Aes.BlockSize = 128;
m_Aes.KeySize = 256;
m_Aes.IV = Encoding.Unicode.GetBytes(iv);
m_Aes.Key = Encoding.Unicode.GetBytes(key);
m_Aes.Mode = CipherMode.CBC;
m_Aes.Padding = PaddingMode.PKCS7;
}
catch(Exception e) { Console.WriteLine(e.ToString()); }
}
低,请注意,这是有效的,从某种意义上说,我可以生成向量字节数组并将其保存为字符串,可以再次用于加密和解密。
但是,对答案的另一个评论指出:
GetString
和GetBytes
需要在具有相同功能的系统上执行 终结工作。
这让我相信,如果它们实际上是重新实现的话,那么unicode转换也可能受到这个规定的约束。
所以,我的问题是,有没有更好的方法将AES IV转换为字符串并返回?当我说得更好时,我的意思是至少不受上述条款规定的约束。充其量,也许是我不熟悉的行业标准。