【问题标题】:Data decrypting数据解密
【发布时间】:2018-07-11 02:57:11
【问题描述】:

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

【问题讨论】:

    标签: c# encryption character aes


    【解决方案1】:

    问题是解密后数据的大小小于MemoryStream的大小,这是由加密后的数据(数据)决定的。

    例如,加密“快速棕色狐狸跳过懒狗。”使用你的代码会得到一个48字节的加密数据,然而,解密后,解密后的数据只有44字节.因此,您使用 48 字节的内存流来存储 44 字节,然后读取它们全部

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

    结果是字符串末尾有一些乱码。

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

    调用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.

    【讨论】:

      【解决方案2】:

      这是因为您要解密到与加密数据相同的数据数组中,所以您正在破坏它。

      创建一个新数组来读取,问题就会消失。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-18
        • 2011-03-12
        • 2011-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多