如何实现附加到加密消息的IV的AES

时间:2012-12-11 02:59:53

标签: c# encryption aes

所以我一直在尝试用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;

}

现在,根据我读到的其他帖子

https://codereview.stackexchange.com/questions/13714/symmetric-encryption-decryption-routine-using-aes

似乎你从加密的BUT获得你的IV它不会是前N个字符,但是前N个字节。所以这让我感到困惑!!

另外,不应该使用IV来使用密钥加密消息。在上一篇文章中,他/她是否使用KEY和IV对其进行加密,然后在消息前面再次附加IV,然后将其转换为字符串?

编辑:道歉,我忘了说我是创建Web服务的人,这是我正在尝试实施的加密。

2 个答案:

答案 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标签。