C# WinForms中如何向用户展示AES密钥并读取密钥完成字符串加解密
解决方案
AES密钥属于随机字节数组,直接通过字符编码转普通字符串会因为存在大量非打印字符、不符合编码规则出现数据丢失,导致解密失败。正确的实现方式是使用Base64编码实现字节数组和可打印字符串的无损互转,适配你现有代码的修改方案如下:
加密侧修改(密钥转字符串显示)
你生成AES密钥、IV后,通过Convert.ToBase64String()方法转成可打印的字符串再赋值给TextBox:
// 示例:生成密钥和IV的逻辑 using (Aes aesAlg = Aes.Create()) { aesAlg.Mode = CipherMode.CBC; aesAlg.KeySize = 128; aesAlg.BlockSize = 128; aesAlg.GenerateKey(); aesAlg.GenerateIV(); // 转Base64后赋值给文本框供用户留存 txtKey.Text = Convert.ToBase64String(aesAlg.Key); txtIV.Text = Convert.ToBase64String(aesAlg.IV); // 调用你原有加密逻辑即可 byte[] encryptedBytes = EncryptStringToBytes_Aes("待加密文本", aesAlg.Key, aesAlg.IV); // 密文也需要转Base64存储/展示,避免同样的字节转字符串丢失问题 txtEncryptedResult.Text = Convert.ToBase64String(encryptedBytes); }
解密侧修改(字符串转字节数组调用解密接口)
读取用户输入的密钥、IV、密文字符串后,通过Convert.FromBase64String()转回原始字节数组,直接传入你现有的解密方法即可:
try { // 读取文本框内容转成原始字节数组 byte[] key = Convert.FromBase64String(txtInputKey.Text.Trim()); byte[] iv = Convert.FromBase64String(txtInputIV.Text.Trim()); byte[] encryptedBytes = Convert.FromBase64String(txtInputEncrypted.Text.Trim()); // 直接调用你原有解密方法 string decryptedText = DecryptStringFromBytes_Aes(encryptedBytes, key, iv); txtDecryptedResult.Text = decryptedText; } catch (FormatException) { MessageBox.Show("输入的密钥、IV或密文格式非法,请检查输入内容"); }
注意事项
- 不要使用
Encoding.UTF8.GetString()、Encoding.ASCII.GetString()等编码类方法转换随机密钥、IV、密文字节,这类方法仅适用于符合对应编码规则的字节转字符串场景,随机字节会出现乱码、数据丢失,直接导致解密失败 - CBC模式必须使用和加密时完全一致的IV才能解密,IV也需要和密钥一起提供给用户留存
- 128位AES密钥对应16字节,转Base64后长度为24字符,可额外增加长度校验提前拦截非法输入
内容的提问来源于stack exchange,提问作者Liryk
相关产品推荐
相关产品推荐

