You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:54:01