使用C# AES加密字符串存文件时遇类型转换错误求助
问题解决:类型转换错误与AES加密结果保存到文件
一、搞定“无法从IEnumerable<List>转换为string[]”的错误
这个错误本质是类型不兼容——你手里的集合是IEnumerable<List<char>>,但直接赋值给string[]肯定不行,得做两步转换:
- 把每个
List<char>转成string:利用string可以由字符数组构建的特性,对每个列表调用new string(list.ToArray()); - 把转换后的
IEnumerable<string>转成数组:用LINQ的ToArray()方法收尾。
直接上代码示例:
// 假设这是你原本的字符列表集合 IEnumerable<List<char>> charLists = ...; // 一步到位转成string[] string[] stringArray = charLists.Select(list => new string(list.ToArray())).ToArray();
注意:要使用LINQ的Select方法,记得在代码顶部加using System.Linq;引用。
二、AES加密字符串并保存到文件
你提供的CryptBytes方法还缺了关键逻辑,我先把它补全,再教你怎么把加密结果存到文件里。
完整的AES加密方法补充
using System; using System.IO; using System.Security.Cryptography; using System.Text; using System.Diagnostics; // 扩展方法必须放在非泛型静态类里 public static class AesEncryptionHelper { #region "Encrypt Strings and Byte[]" // 加密或解密字节数组并返回结果 public static byte[] CryptBytes(string password, byte[] in_bytes, bool encryptAES) { using AesCryptoServiceProvider aes_provider = new AesCryptoServiceProvider(); // 查找支持的最大密钥长度 int key_size_bits = 0; for (int i = 4096; i > 1; i--) { if (aes_provider.ValidKeySize(i)) { key_size_bits = i; break; } } Debug.Assert(key_size_bits > 0); Console.WriteLine("Key size: " + key_size_bits); // 从密码生成密钥和IV(用RFC2898标准,实际项目建议用随机盐并保存) byte[] salt = Encoding.UTF8.GetBytes("YourUniqueSalt123"); // 换成自己的盐,最好随机生成 Rfc2898DeriveBytes keyDeriver = new Rfc2898DeriveBytes(password, salt, 10000); aes_provider.Key = keyDeriver.GetBytes(key_size_bits / 8); aes_provider.IV = keyDeriver.GetBytes(aes_provider.BlockSize / 8); // 创建加密/解密转换器 ICryptoTransform cryptoTransform = encryptAES ? aes_provider.CreateEncryptor(aes_provider.Key, aes_provider.IV) : aes_provider.CreateDecryptor(aes_provider.Key, aes_provider.IV); // 处理数据并返回结果 using MemoryStream ms = new MemoryStream(); using CryptoStream cs = new CryptoStream(ms, cryptoTransform, CryptoStreamMode.Write); cs.Write(in_bytes, 0, in_bytes.Length); cs.FlushFinalBlock(); return ms.ToArray(); } #endregion // 封装一个直接加密字符串的方法,用着更方便 public static byte[] EncryptString(string password, string plainText) { byte[] plainBytes = Encoding.UTF8.GetBytes(plainText); return CryptBytes(password, plainBytes, encryptAES: true); } }
加密并保存到文件的代码
有了上面的方法,存文件就很简单了:
string password = "YourStrongPassword123"; string contentToEncrypt = "这是要加密的内容"; // 加密字符串得到二进制数组 byte[] encryptedData = AesEncryptionHelper.EncryptString(password, contentToEncrypt); // 写入文件(路径换成你自己的) string savePath = @"D:\EncryptedFiles\MyData.bin"; File.WriteAllBytes(savePath, encryptedData);
加密后的内容是二进制数据,直接用File.WriteAllBytes写入就行。之后要解密的话,读取文件的字节数组,调用CryptBytes并传encryptAES: false就可以还原。
内容的提问来源于stack exchange,提问作者Hakunama Tatarov
相关产品推荐
相关产品推荐

