【问题标题】:CryptoStream: Why CryptoStreamMode.Write to encrypt and CryptoStreamMode.Read to decrypt?CryptoStream:为什么 CryptoStreamMode.Write 加密而 CryptoStreamMode.Read 解密?
【发布时间】:2017-05-05 15:11:47
【问题描述】:

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

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

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

【问题讨论】:

  • 因为你分别从底层流写入,读取?
  • 您写入加密流,它会加密并将结果写入 MemoryStream(在您的示例中)。您从加密流中读取 - 它从 MemoryStream 中读取,解密并将结果返回给您。

标签: c# encryption cryptostream


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 看起来其他人花了很多时间挠头研究这个;)
    • 不错。感谢您的写作!
    【解决方案3】:

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

    这是一种方法:

    https://github.com/djpai/StreamConduit

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      相关资源
      最近更新 更多