c# - 数据解密
问题描述
如何摆脱我解密数据中存在的尴尬字符?是这样的......(我的数据编号)...... 55437 55005 ��S';�5:c�</p>
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
UTF8Encoding u = new UTF8Encoding();
aes.Key = Encoding.ASCII.GetBytes("1234567890123456");
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.ANSIX923;
MemoryStream ms1 = new MemoryStream(data);
CryptoStream cs1 = new CryptoStream(ms1, aes.CreateDecryptor(), CryptoStreamMode.Read); //cs used to decrypt the byte
cs1.Read(data, 0, data.Length);
recipherdata = ms1.ToArray();
ms1.Close();
string decrypteddata = Encoding.UTF8.GetString(recipherdata);
解决方案
问题是解密数据的大小小于的大小MemoryStream
,这是由加密的数据(数据)决定的。
例如,加密“The quick brown fox jumps over the lazy dog”。使用您的代码将获得 48 字节的加密数据,但是,解密后,解密后的数据只有 44 字节。因此,您使用 48 字节的内存流来存储 44 字节,然后将它们全部读取。
var recipherdata = ms1.ToArray(); //ms1 is 48 bytes
结果是字符串末尾有一些垃圾字符。
解决方案1:计算解密数据的大小。
该调用cs1.Read(data, 0, data.Length);
返回解密数据的字节数,在上面的示例中为 44。所以你知道你应该读多少字节。
正如另一个答案所建议的那样,在解密过程中使用相同的字节数组作为源流(内存流只是将字节数组包装在里面)和目标缓冲区是不明智的。虽然它看似有效,但令人困惑,最好使用另一个字节数组作为缓冲区。
解决方案 2:使用StreamReader
.
您可以使用 aStreamReader
直接从CryptoStream
.
using (MemoryStream ms1 = new MemoryStream(data))
using (CryptoStream cs1 = new CryptoStream(ms1, aes.CreateDecryptor(), CryptoStreamMode.Read)) //cs used to decrypt the byte
{
using (StreamReader reader = new StreamReader(cs1))
{
var decrypteddata = reader.ReadToEnd();
}
}
请参阅此代码示例。
推荐阅读
- python - 如何删除csv python中的空单元格?
- mysql - 从mysql中具有多个表的重复数据中获取单个唯一行
- c# - Selenium C#:从同名的多个 div 中获取文本
- angular - CanDeactivateGuard 重定向到主页
- python - 为什么会这样说:“TypeError:__call__() 缺少 1 个必需的位置参数:'inputs'”
- bash - cat、echo 和进程替换
- python-3.x - Python 到 Mysql 的连接
- javascript - React - ul li 列表上的键盘导航
- c# - WebClient.DownloadData 方法使应用程序崩溃
- python - 从 Python 中的“对”列表中获取有序整数列表