C#控制台密码管理器AES解密及文件IO操作报错问题
问题根因与修复方案
你遇到的所有问题核心都来自于直接将AES加密后的原始二进制字节转为普通文本存储,加密后字节的取值范围是0~255,完全可能包含回车换行符、不符合UTF8/GBK编码规则的字节,自然会出现分隔冲突、解密报错、中文乱码问题。
修复步骤
1. 加密结果统一做Base64编码后再存储
加密流程调整为:
- 明文(网站/账号/密码)先按你需要的格式拼接,比如用
|之类的特殊分隔符拆分字段,转成UTF8编码的字节数组 - 走AES加密得到加密后的原始字节数组
- 用
Convert.ToBase64String()将加密字节转为Base64字符串,Base64的字符集仅包含大小写字母、数字、+、/、=,绝对不会出现换行符,也不会有编码乱码问题 - 每一条加密后的Base64字符串单独占一行写入文件,换行作为条目分隔符不会和内容冲突
对应C#示例代码片段:
// 加密流程示例 string plainText = $"{website}|{account}|{password}"; byte[] plainBytes = Encoding.UTF8.GetBytes(plainText); byte[] encryptedBytes = AesEncrypt(plainBytes, yourKey, yourIv); string encryptedBase64 = Convert.ToBase64String(encryptedBytes); // 写入文件时直接追加一行即可 File.AppendAllText(@"D:\Pass.txt", encryptedBase64 + Environment.NewLine);
2. 解密流程对应调整
- 按行读取文件所有内容,每一行就是一条独立的加密Base64字符串
- 对每一行字符串用
Convert.FromBase64String()转回原始加密字节数组 - 走AES解密得到明文字节数组
- 用
Encoding.UTF8.GetString()转成明文,再按|拆分出网站/账号/密码字段即可
对应C#示例代码片段:
// 解密流程示例 string[] encryptedLines = File.ReadAllLines(@"D:\Pass.txt"); foreach (string line in encryptedLines) { if (string.IsNullOrWhiteSpace(line)) continue; byte[] encryptedBytes = Convert.FromBase64String(line); byte[] plainBytes = AesDecrypt(encryptedBytes, yourKey, yourIv); string plainText = Encoding.UTF8.GetString(plainBytes); string[] fields = plainText.Split('|'); // 后续处理fields[0]网站、fields[1]账号、fields[2]密码 }
3. 原有AES逻辑的注意事项
- 不要修改AES的BlockSize,AES标准块大小就是128位(16字节),修改反而会不符合标准导致加解密异常
- 加解密的Key长度必须符合要求:16字节(AES128)、24字节(AES192)、32字节(AES256),IV固定为16字节,加解密的Key、IV、填充模式(推荐用
PaddingMode.PKCS7)、加密模式(推荐用CBC)必须完全一致 - 如果要支持明文里带
|字符,可以把字段拼接格式改成JSON序列化,比如用System.Text.Json把单条记录序列化成JSON字符串再加密,避免字段分隔符冲突
异常问题说明
你之前遇到的5-10%概率换行、中文乱码问题本质都是加密字节转普通文本时的编码丢失问题,换成Base64转码后100%不会复现,不需要额外兼容换行符的处理逻辑。
内容的提问来源于stack exchange,提问作者UnfreeHeX
相关产品推荐
相关产品推荐

