C# SymmetricAlgorithm显式调用访问器报错,求字节解密方案
解决CS0571错误并完成字节数组解密
错误原因
CS0571是因为你显式调用了属性的get/set底层方法(比如set_KeySize、get_KeySize),C#中属性应直接用赋值/取值语法,不能手动调用这些访问器方法。
修正后的完整代码
private static readonly byte[] saltBytes = new byte[16] { 255, 64, 191, 111, 23, 3, 113, 119, 231, 121, 252, 112, 79, 32, 114, 156 }; private static readonly byte[] cryptKey = new byte[38] { 104, 116, 116, 112, 115, 58, 47, 47, 103, 105, 116, 104, 117, 98, 46, 99, 111, 109, 47, 76, 105, 109, 101, 114, 66, 111, 121, 47, 83, 116, 111, 114, 109, 75, 105, 116, 116, 121 }; public static string test = Decrypt(new byte[32] { 169, 182, 79, 179, 252, 54, 138, 148, 167, 99, 216, 216, 199, 219, 10, 249, 131, 166, 170, 145, 237, 248, 142, 78, 196, 137, 101, 62, 142, 107, 245, 134 }); public static string Decrypt(byte[] bytesToBeDecrypted) { using (MemoryStream memoryStream = new MemoryStream()) using (RijndaelManaged rijndael = new RijndaelManaged()) { // 直接设置属性,替换显式的set_XXX调用 rijndael.KeySize = 256; rijndael.BlockSize = 128; rijndael.Mode = CipherMode.CBC; // 替换硬编码的1,提高可读性 Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes(cryptKey, saltBytes, 1000); // 直接使用属性取值,替换get_XXX调用 rijndael.Key = deriveBytes.GetBytes(rijndael.KeySize / 8); rijndael.IV = deriveBytes.GetBytes(rijndael.BlockSize / 8); using (CryptoStream cryptoStream = new CryptoStream(memoryStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write)) { cryptoStream.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length); cryptoStream.FlushFinalBlock(); // 必须调用,确保解密完成所有数据 } return Encoding.UTF8.GetString(memoryStream.ToArray()); } }
关键修改点
- 所有
set_XXX调用改为直接属性赋值(如rijndael.KeySize = 256) - 所有
get_XXX调用改为直接读取属性值(如rijndael.KeySize / 8) - 用
using语句管理所有实现IDisposable的对象,自动释放资源,替代手动try/finally - 解密时添加
cryptoStream.FlushFinalBlock(),确保解密过程完成所有数据处理 - 把硬编码的
(CipherMode)1替换为枚举值CipherMode.CBC,提升代码可读性
修正后的代码可正确解密指定字节数组,得到test字符串。
内容的提问来源于stack exchange,提问作者Zgedek IKS DE
相关产品推荐
相关产品推荐

