首页 > 解决方案 > 数据解密

问题描述

如何摆脱我解密数据中存在的尴尬字符?是这样的......(我的数据编号)...... 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);

标签: c#encryptioncharacteraes

解决方案


问题是解密数据的大小小于的大小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();
    }
}

请参阅此代码示例。


推荐阅读