CryptoStream:为什么要加密CryptoStreamMode.Write和要解密的CryptoStreamMode.Read?

时间:2017-05-05 15:11:48

标签: c# encryption cryptostream

设e ='password',我在CryptoStream中将其转换为'as9kio0736'。

设d ='as9kio0736',我正在将其转换为'CryptoStream中的密码。

当我将d转换回'password'时,为什么不考虑在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();
        }
    }
}

3 个答案:

答案 0 :(得分:6)

您可以在任一方向使用CryptoStream进行任一操作;它只是您的数据所在以及您想要用它做什么。

如果要处理的数据已经在Stream中(并且您可以将流耗尽并处理掉),请在读取模式下使用CryptoStream并读取数据(包括使用cryptoStream.CopyTo(someOtherStream))。如果数据位于byte[]并且您想将其写入Stream,请使用CryptoStream.Write。

在.NET Core测试中,您可以通过两种方式找到示例。

哎呀,那些甚至在同一个文件中。这只是一个偏好问题。

答案 1 :(得分:1)

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对象读取数据,直到到达流结束

答案 2 :(得分:0)

CryptoStream使您可以灵活地对Encrypt和Decrypt进行读/写操作。对于方向固定的情况,无论采用哪种实现方式,都可以更改为沿任一方向移动。

这是一种方法:

https://github.com/djpai/StreamConduit