令e ='password',然后将其在CryptoStream中转换为'as9kio0736'。

令d ='as9kio0736',我将其转换为CryptoStream中的'password'。

当我将d转换回“密码”时,为什么不考虑将其写入CryptoStream?

using (MemoryStream msEncrypt = new MemoryStream()) {
    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) {
        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) {
            swEncrypt.Write(plainText);
        }
    }
}

using (MemoryStream msDecrypt = new MemoryStream(cipherText)) {
    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) {
        using (StreamReader srDecrypt = new StreamReader(csDecrypt)) {
            plaintext = srDecrypt.ReadToEnd();
        }
    }
}

最佳答案

CryptoStream设计为仅执行从一个流到另一个流的转换,并允许转换链接。例如,您可以加密数据流,然后Base 64对加密输出进行编码。

根据要写入转换输入流还是从转换输出流中读取来选择模式。

CryptoStream文档具有误导性。
第一个CrytoStream构造函数参数描述为:
“执行密码转换的流”

如果构造函数的第三个参数值为CryptoStreamMode.Read,则此描述正确。

但是,如果第三个参数值为CryptoStreamMode.Write,则第一个构造函数参数说明应为:
“将密码转换的结果写入的流”

同样,文档中也没有明确提及如果使用CryptoStreamMode.Write,则必须在完成编写后在CryptoStream对象上调用FlushFinalBlock。

总结一下:

写入转换输入流:

CryptoStream构造函数参数:


参数1:目标流
参数3:CryptoStreamMode.Write


CryptoStream对象的使用:


将数据写入CryptoStream对象
在CryptoStream对象上调用FlushFinalBlock


从转换输出流中读取:

CryptoStream构造函数参数:


参数1:源流
参数3:CryptoStreamMode.Read


CryptoStream对象的使用:


从CryptoStream对象读取数据,直到到达流末尾

08-19 10:44