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