0

这是我第一次使用 AES 加密,我有些困惑。我正在加密一些敏感数据(没有密码,只有姓名、地​​址、身份证号等)。我找到了一个很好的例子,说明如何在我的应用程序中实现 AES。我了解我提供了密码、盐、哈希算法和密码迭代来制作密钥。然后这会创建密文。我有几个问题是为什么 KeySize 会减少 8 倍?如果我想让其他人解密这个,我需要给他们什么?每次我加密新东西时,密码、盐和 IV 是否应该不同,如果是这种情况,我如何确保我想使用此信息的其他人始终知道这一点?

    public static string Encrypt(string PlainText, string Password, string Salt, string HashAlgorithm, int PasswordIterations, string InitialVector, int KeySize)
    {
        try
        {
            byte[] InitialVectorBytes = Encoding.ASCII.GetBytes(InitialVector);
            byte[] SaltValueBytes = Encoding.ASCII.GetBytes(Salt);
            byte[] PlainTextBytes = Encoding.UTF8.GetBytes(PlainText);
            PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations);
            byte[] KeyBytes = DerivedPassword.GetBytes(KeySize / 8);
            RijndaelManaged SymmetricKey = new RijndaelManaged();
            SymmetricKey.Mode = CipherMode.CBC;
            ICryptoTransform Encryptor = SymmetricKey.CreateEncryptor(KeyBytes, InitialVectorBytes);
            MemoryStream MemStream = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(MemStream, Encryptor, CryptoStreamMode.Write);
            cryptoStream.Write(PlainTextBytes, 0, PlainTextBytes.Length);
            cryptoStream.FlushFinalBlock();
            byte[] CipherTextBytes = MemStream.ToArray();
            MemStream.Close();
            cryptoStream.Close();
            MemStream.Dispose();
            cryptoStream.Dispose();
            Encryptor.Dispose();
            return Convert.ToBase64String(CipherTextBytes);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
4

2 回答 2

1
byte[] KeyBytes = DerivedPassword.GetBytes(KeySize / 8);

密钥大小除以 8,因为它通常指定为位数,但存储在字节数组中。

您保持相同的值取决于您的程序设计。在实践中,IV 应该每次都改变,但如果你选择,你可以保持 key 和 salt 不变。

我知道 IV 包含在流的输出中,因此您不必明确包含它来解密(它将从流中读取)。出于类似的原因,您也不应该包括盐。我相信解密密文所需的唯一值是密钥。我对此可能不正确。您始终可以编写解密器并查看需要传递的内容才能使其工作。

于 2013-04-11T17:16:32.070 回答
1

KeySize是位。正如我们在任何普通机器上所知道的那样1 byte = 8 bits,因此划分。

你需要给别人什么才能解密数据?KeyIV(Initialization Vector) 就足够了。
也就是说——你通常是怎么做的?您将AES加密数据与一些非对称加密算法一起发送Key并加密。IV这为您提供了更高级别的保护——只有拥有私钥的人才能读取KeyIV使用它们来解密最有趣的数据。您使用生成的KeyIV相当长的长度来确保自己的安全。

为什么要这样做?因为非对称加密很慢(非常慢并且有充分的理由 - 更难破解),但是如果与长密钥一起使用,对称加密(如 AES)可以为您提供高安全性,同时速度非常快。将两者结合起来,您可以获得高水平的性能和安全性。

于 2013-04-11T17:24:21.367 回答