You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解密SQL数据库中加密的密码 [C#]——AesCryp类使用问题求助

补全并修正你的AES加密类实现

看起来你的代码写到一半就中断了,我来帮你补全完整的AES加密/解密逻辑,同时修正几个新手常踩的坑:

完整的修正版代码

using System;
using System.Security.Cryptography;
using System.Text;

public class AesCryp
{
    // 注意:IV仅用于演示才硬编码,生产环境绝对不要这么做!
    // AES的IV必须是16字节(128位),和块大小一致
    public static string IV = "xxxxxxxxxxxxxxxx"; // 替换成16位的字符串
    // Key长度对应AES版本:16字节=128位,24字节=192位,32字节=256位
    public static string Key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // 替换成对应长度的字符串

    public static string Encrypt(string decryptedText)
    {
        // 用UTF8替代ASCII,支持中文、特殊字符等非ASCII内容
        byte[] textBytes = Encoding.UTF8.GetBytes(decryptedText);
        byte[] ivBytes = Encoding.UTF8.GetBytes(IV);
        byte[] keyBytes = Encoding.UTF8.GetBytes(Key);

        // 使用using确保资源自动释放,避免内存泄漏
        using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
        {
            aesProvider.Key = keyBytes;
            aesProvider.IV = ivBytes;
            aesProvider.Mode = CipherMode.CBC; // 显式声明模式,避免默认值变更风险
            aesProvider.Padding = PaddingMode.PKCS7; // 显式声明填充方式,保持加密解密一致

            ICryptoTransform encryptor = aesProvider.CreateEncryptor(aesProvider.Key, aesProvider.IV);

            using (var ms = new System.IO.MemoryStream())
            {
                using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                {
                    cs.Write(textBytes, 0, textBytes.Length);
                    cs.FlushFinalBlock(); // 必须调用,确保所有数据都写入加密流
                }
                // 加密后的字节转Base64,方便存储和传输
                return Convert.ToBase64String(ms.ToArray());
            }
        }
    }

    public static string Decrypt(string encryptedText)
    {
        byte[] encryptedBytes = Convert.FromBase64String(encryptedText);
        byte[] ivBytes = Encoding.UTF8.GetBytes(IV);
        byte[] keyBytes = Encoding.UTF8.GetBytes(Key);

        using (AesCryptoServiceProvider aesProvider = new AesCryptoServiceProvider())
        {
            aesProvider.Key = keyBytes;
            aesProvider.IV = ivBytes;
            aesProvider.Mode = CipherMode.CBC;
            aesProvider.Padding = PaddingMode.PKCS7;

            ICryptoTransform decryptor = aesProvider.CreateDecryptor(aesProvider.Key, aesProvider.IV);

            using (var ms = new System.IO.MemoryStream(encryptedBytes))
            {
                using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
                {
                    using (var sr = new System.IO.StreamReader(cs, Encoding.UTF8))
                    {
                        return sr.ReadToEnd();
                    }
                }
            }
        }
    }
}

关键注意事项

  • 编码选择:别用ASCIIEncoding,它会丢弃非ASCII字符(比如中文),换成UTF8Encoding才能保证所有字符正确加密。
  • IV的正确用法:生产环境中绝对不要硬编码IV,应该每次加密时随机生成一个新IV,然后把IV和密文一起存储/传输(IV不需要保密,只需要和对应密文匹配就行)。
  • Key的安全性:硬编码Key是非常危险的操作,生产环境要从环境变量、密钥管理服务等安全渠道读取Key,同时确保Key长度符合AES要求(16/24/32字节)。
  • 资源释放:所有实现IDisposable的类型(比如AesCryptoServiceProviderCryptoStream)都要用using包裹,确保资源被自动释放,避免内存泄漏。
  • 参数一致性:加密和解密的CipherModePaddingMode必须完全一致,否则解密会直接失败。

内容的提问来源于stack exchange,提问作者Tranquility

火山引擎 最新活动