我的代码是否像使用AES一样安全?

时间:2016-12-23 06:12:08

标签: c# encryption

我目前正在处理由我的老师分配的项目,我需要确保它具有强大的加密功能。以下是我的加密方法:

 private String Encrypt(string text)
{
    RijndaelManaged RijndaelCipher = new RijndaelManaged();
    string Password = System.Configuration.ConfigurationManager.AppSettings["Password"];
    byte[] PlainText = System.Text.Encoding.Unicode.GetBytes(TextBox1.Text);
    byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString());
    PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt);
    ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));
    MemoryStream memoryStream = new MemoryStream();
    CryptoStream cryptoStream = new CryptoStream(memoryStream, Encryptor, CryptoStreamMode.Write);
    cryptoStream.Write(PlainText, 0, PlainText.Length);
    cryptoStream.FlushFinalBlock();
    byte[] CipherBytes = memoryStream.ToArray();
    memoryStream.Close();
    cryptoStream.Close();
    string EncryptedData = Convert.ToBase64String(CipherBytes);

    return EncryptedData;
}

这是我的解密方法

public string Decrypt(string encrypted)
{
    RijndaelManaged RijndaelCipher = new RijndaelManaged();

    string Password = System.Configuration.ConfigurationManager.AppSettings["Password"];
    string DecryptedData;

    try
    {
        byte[] EncryptedData = Convert.FromBase64String(TextBox2.Text);

        byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString());
        PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt);
        ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));

        MemoryStream memoryStream = new MemoryStream(EncryptedData);
        CryptoStream cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read);

        byte[] PlainText = new byte[EncryptedData.Length];
        int DecryptedCount = cryptoStream.Read(PlainText, 0, PlainText.Length);
        memoryStream.Close();
        cryptoStream.Close();

        DecryptedData = Encoding.Unicode.GetString(PlainText, 0, DecryptedCount);
    }
    catch
    {
        DecryptedData = TextBox3.Text;
    }
    return DecryptedData;

}

从我的代码中可以看出,我使用的是Web配置中的密码,而且我没有将任何IV和密钥存储到数据库中。所以我的问题是我使用的加密方法是否与使用AES方法一样安全。如果不是,我可以参考其他任何可能的解决方案吗?感谢您回答并抱歉我的英语能力差。

1 个答案:

答案 0 :(得分:1)

这在几个方面很糟糕:

  • 没有经过验证。使用现有的经过身份验证的算法(如AES-GCM,AES-SIV)添加MAC。
  • 从密码确定性地导出盐,这相当于完​​全不使用盐。每个用户都需要使用不同的盐。
  • 与盐类似,IV的要点是确保使用固定密钥加密相似或相同的明文每次都会产生完全不同的输出。如果您的密钥是一次性使用的(例如,因为它的推导涉及一次性盐),修复IV是可以接受的。
  • PasswordDeriveBytes是PBKDF1和未记录的Microsoft特定扩展的混合。不要使用它。至少使用Rfc2898DeriveBytes符合标准的PBKDF2-HMAC-SHA1。使用大约100000次迭代,而不是太小的默认值。

我建议使用jbtule's answer to Encrypt and decrypt a string in C#