3

让 e = 'password' 我将其转换为 CryptoStream 中的 'as9kio0736'。

让 d = 'as9kio0736' 我将其转换为 'CryptoStream 中的密码。

当我将 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();
        }
    }
}
4

3 回答 3

7

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

如果要处理的数据已经在 Stream 中(并且您对流被耗尽和处理没问题),请在读取模式下使用 CryptoStream 并读取数据(包括使用cryptoStream.CopyTo(someOtherStream))。如果数据在 a 中byte[]并且您想将其写入 Stream,请使用 CryptoStream.Write。

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

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

于 2017-05-05T15:23:42.547 回答
6

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 对象读取数据,直到到达流结束
于 2019-03-29T08:57:58.597 回答
0

CryptoStream 为加密和解密提供了读/写的灵活性。对于方向固定的情况,可以将其更改为在任一方向上移动,而不管实现方式如何。

这是一种方法:

https://github.com/djpai/StreamConduit

于 2020-05-29T16:03:04.923 回答