所以我一直在尝试用c#学习AES加密。我有点陷入IV的困境,但是我只是在努力理解加密,我希望其他人的一些解释可能会让我超越这堵墙。
无论如何,我发现有关IV的内容以及如何将其发送到我的网络服务(因为这是我使用AES的主要目的)和加密消息。
这是我找到的文章
http://old.nabble.com/AES-decryption-with-different-IV-td31004365.html
它表示您可以在传递到解密它的目的地时将IV附加到邮件中。
话虽如此,我的问题是,它们是否属于从用于加密消息的IV转换的普通字符串?或者您是以字节为单位附加IV?
这是我的主要解密
public string DecryptString(string encryptedString, string key)
{
if (encryptedString == null || encryptedString.Length <= 0)
throw new ApplicationException("No string to decrypt.");
if (key == null || key.Length <= 0)
throw new ApplicationException("No key.");
byte[] cipherText = Convert.FromBase64String(encryptedString);
Rijndael aes = new RijndaelManaged();
aes.Key = StringToByte(key);
aes.IV = GetIV(cipherText);
ICryptoTransform decryptor = aes.CreateDecryptor();
throw new NotImplementedException();
}
我的GetIV()是
static public byte[] GetIV(string cipherText)
{
// IV will be attached to the beginning of the encrypted String
// needs the length of the IV
int ivStringLength = 16;
string ivString = cipherText.Substring(0, ivStringLength);
byte[] ivByte = StringToByte(ivString);
return ivByte;
}
现在,根据我读到的其他帖子
似乎你从加密的BUT获得你的IV它不会是前N个字符,但是前N个字节。所以这让我感到困惑!!
另外,不应该使用IV来使用密钥加密消息。在上一篇文章中,他/她是否使用KEY和IV对其进行加密,然后在消息前面再次附加IV,然后将其转换为字符串?
编辑:道歉,我忘了说我是创建Web服务的人,这是我正在尝试实施的加密。
答案 0 :(得分:2)
最后你放IV的地方并不重要。它通常存储在密文之前,因为您需要IV来解密第一个块。
密文和IV都是字节。您可以使用特定的字符串编码对其进行转换,例如,如果需要字符串,则使用base 64。您可以单独或一起编码。
你不能做的是在字符串和字节数组之间混淆,这是你在尝试提取IV时所做的。你应该删除字节,而不是密文开头的字符。
答案 1 :(得分:1)
由于您提供的是网络服务,因此我们Authenticated Encryption对您提供保护以免受chosen ciphertext attacks的侵害。
我有两个c#示例,列出Modern Examples of Symmetric Authenticated Encryption of a string. c#。其中不仅将IV预先挂起到密文,它还会后缀一个Authentication标签。