数据解密

时间:2018-07-11 02:57:12

标签: c# encryption character aes

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

docker-compose version 1.21.2, build a133471
docker-py version: 3.4.1
CPython version: 3.6.5
OpenSSL version: OpenSSL 1.0.2o  27 Mar 2018

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

问题在于解密数据的大小比由加密数据(数据)确定的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();
    }
}

查看此code example.