繁体   English   中英

数据解密

[英]Data decrypting

如何清除我解密数据中存在的尴尬字符? 就像这样...(我的数据号)... 55437 55005``S'; 5:c。

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);

这是因为您要解密到与加密数据相同的数据数组,因此会破坏它。

制作一个新数组以读取,问题将消失。

您还需要侦听read的返回值,以了解您读取了多少字节并将其传递给GetString

问题在于解密数据的大小小于 MemoryStream的大小,后者由加密数据(数据)确定。

例如,加密“快速的棕色狐狸跳过了懒狗”。 使用您的代码将获得48字节的加密数据,但是,解密后,解密的数据仅为44字节。 因此,您使用48字节的内存流存储44字节,然后全部读取。

var recipherdata = ms1.ToArray(); //ms1 is 48 bytes

结果是在字符串末尾有一些垃圾字符。

解决方案1:计算解密数据的大小。

调用cs1.Read(data, 0, data.Length); 返回解密数据的字节数,在上面的示例中为44。 因此,您知道应该读取多少字节。

正如另一个答案所建议的那样,在解密过程中使用与源流(内存流只是将字节数组包装在内部)和目标缓冲区相同的字节数组是不明智的。 尽管它看起来很有效,但令人困惑,最好使用另一个字节数组作为缓冲区。

解决方案2:使用StreamReader

您可以使用StreamReader直接从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();
    }
}

请参见此代码示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM