繁体   English   中英

我的代码和使用AES一样安全吗?

[英]Are my codes as secure as using AES?

我目前正在由老师分配的项目中工作,我需要确保该应用程序具有强大的加密功能。 下面是我的加密方法:

 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方法一样安全。 如果不是,是否还有其他可以参考的解决方案? 感谢您的答复,对不起,我的英语能力很差。

坏处有几种:

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

我建议使用jbtule的答案来加密和解密C#中的字符串

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM