C#中使用System.Security.Cryptography加密功能失效问题求助
C#中使用System.Security.Cryptography加密功能失效问题求助
我最近在尝试用密钥、十六进制值和文本体解密一个JSON请求,但找到的代码都是2013-2017年的,试了下面这段代码,好像不管用,想求助怎么解决这个问题:
namespace AES { using System.IO; using System; using System.Security.Cryptography; class Program { public static byte[] FromBase64Url(string base64Url) { // Replace '-' with '+' and '_' with '/' for standard Base64 string base64 = base64Url.Replace('-', '+'); // 代码片段未完成 } } }
嗨,我来帮你捋捋可能的问题和解决方向:
加密参数必须完全对齐:解密的核心是和加密端的参数100%匹配,包括AES模式(比如CBC、GCM)、填充方式(PKCS7、None)、IV向量、密钥长度(128/256位)。老代码可能用的是过时的默认参数(比如早期有些代码默认ECB模式,现在很少用了),如果和当前加密端的参数不匹配,肯定解不出来。
补全Base64Url的完整转换:你这段代码只处理了
-转+,但标准的Base64Url还要把_转/,并且补全末尾的=填充符(Base64Url经常会省略这些填充)。完整的转换逻辑应该是这样的:string base64 = base64Url.Replace('-', '+').Replace('_', '/'); // 补全缺失的填充位 switch (base64.Length % 4) { case 2: base64 += "=="; break; case 3: base64 += "="; break; } return Convert.FromBase64String(base64);适配.NET新版本的API:如果你的项目用的是.NET Core/.NET 5+,老代码里的
AesManaged这类类已经被标记为过时,建议用Aes.Create()来创建实例,它会自动适配当前平台的最优实现,兼容性更好。举个简单的解密示例:using (Aes aes = Aes.Create()) { aes.Key = 你的密钥字节数组; // 注意密钥长度要符合AES要求(16/24/32字节对应128/192/256位) aes.IV = 你的IV向量字节数组; // IV长度必须和块大小一致(AES是16字节) aes.Mode = CipherMode.CBC; // 和加密端保持一致 aes.Padding = PaddingMode.PKCS7; // 和加密端保持一致 // 创建解密器并处理数据 ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV); // 这里可以把文本体的字节数组通过CryptoStream解密,再转成字符串 using (MemoryStream msDecrypt = new MemoryStream(你的文本体字节数组)) using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { string decryptedText = srDecrypt.ReadToEnd(); // 这里就是解密后的内容了 } }注意文本编码问题:解密后的字节数组转字符串时,一定要用和加密端相同的编码(比如UTF-8),别用错编码导致乱码,误以为解密失败。
如果能补充下加密端的具体配置(比如用的什么AES模式、IV是怎么生成的、密钥是否经过了哈希或其他处理),定位问题会更准确哦~
备注:内容来源于stack exchange,提问作者Ndifreke James Okpo
相关产品推荐
相关产品推荐

