如何解密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的类型(比如AesCryptoServiceProvider、CryptoStream)都要用using包裹,确保资源被自动释放,避免内存泄漏。 - 参数一致性:加密和解密的
CipherMode、PaddingMode必须完全一致,否则解密会直接失败。
内容的提问来源于stack exchange,提问作者Tranquility




