在应用程序中使用AES加密

时间:2013-04-11 17:13:38

标签: c# encryption aes

这是我第一次使用AES加密,我有点困惑。我正在加密一些敏感数据(没有密码只是名称,地址,ID号等)。我找到了一个很好的例子,说明如何在我的应用程序中实现AES。据我所知,我提供密码,Salt,哈希算法和密码迭代来制作密钥。然后,这将创建密文。我有几个问题是为什么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;
        }
    }

2 个答案:

答案 0 :(得分:1)

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

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

保持不变的值取决于程序的设计。在实践中,IV应该每次都改变,但是如果你选择,你可以保持关键和盐不变。

我知道IV包含在流的输出中,因此您不必明确地将其包含在解密中(它将从流中读取)。由于类似的原因,您不必包含盐。我相信解密密文需要的唯一价值就是关键。我对此可能不正确。你总是可以编写一个解密器,看看你需要传递什么来使其工作。

答案 1 :(得分:1)

KeySize有点。正如我们所知,在任何普通机器上1 byte = 8 bits,因此划分。

您需要让某人能够解密数据吗? KeyIV(初始化向量)就足够了 那说 - 你通常怎么做?您使用某些非对称加密算法发送AES加密数据以及加密KeyIV。这为您提供了更高级别的保护 - 只有拥有私钥的人才能阅读KeyIV并使用它们解密最有趣的数据。您使用了一段相当长的KeyIV来确保自己的安全。

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