1

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

似乎您从加密中获得了 IV,但它不是前 N 个字符,而是前 N 个字节。所以这让我很困惑!

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

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

4

2 回答 2

2

最后,你把 IV 放在哪里都没有关系。它通常存储在密文之前,因为您需要 IV 来解密第一个块。

密文和 IV 都是字节。如果需要字符串,您可以使用特定的字符串编码来转换它们,例如 base 64。您可以单独或一起编码它们。

您不能做的是混淆字符串和字节数组,这是您在尝试提取 IV 时所做的。您应该删除字节,而不是密文开头的字符。

于 2012-12-11T07:22:43.227 回答
1

由于您提供的是 Web 服务,因此对我们而言,经过身份验证的加密可以保护您免受选择的密文攻击

我有两个 c# 示例,列出了字符串的对称身份验证加密的现代示例。#。其中,它不仅将 IV 预先附加到密文中,而且还附加了一个身份验证标签。

于 2012-12-31T16:51:29.823 回答