Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CryptoStream:为什么选择CryptoStreamMode。写入以加密和CryptoStreamMode。读取以解密?_C#_Encryption_Cryptostream - Fatal编程技术网

C# CryptoStream:为什么选择CryptoStreamMode。写入以加密和CryptoStreamMode。读取以解密?

C# CryptoStream:为什么选择CryptoStreamMode。写入以加密和CryptoStreamMode。读取以解密?,c#,encryption,cryptostream,C#,Encryption,Cryptostream,设e='password',我将其转换为加密流中的'as9kio0736' 设d='as9kio0736',我将其转换为“加密流中的密码” 当我将d转换回“密码”时,为什么不考虑在加密流中写入 using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))

设e='password',我将其转换为加密流中的'as9kio0736'

设d='as9kio0736',我将其转换为“加密流中的密码”

当我将d转换回“密码”时,为什么不考虑在加密流中写入

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;它只是您的数据所在的位置,以及您想用它做什么

如果要处理的数据已经在一个流中(并且您对该流被排空和处理没问题),请在读取模式下使用CryptoStream并读取数据(包括使用
CryptoStream.CopyTo(someOtherStream)
)。如果数据位于
字节[]
中,并且您希望将其写入流,请使用CryptoStream.write

在.NET核心测试中,您可以找到两种方法的示例

  • 将读取同时用于加密和解密:
  • 将写入同时用于加密和解密:

见鬼,这些文件甚至都在同一个文件中。这只是一个偏好的问题。

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

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

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

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

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

另外,文档中并没有明确提到,若使用CryptoStreamMode.Write,则必须在完成编写后调用CryptoStream对象上的FlushFinalBlock

总结一下:

写入转换输入流:

CryptoStream构造函数参数:

  • 参数1:目标流
  • 参数3:CryptoStreamMode.Write
CryptoStream对象使用:

  • 将数据写入CryptoStream对象
  • 对CryptoStream对象调用FlushFinalBlock
从转换输出流读取:

CryptoStream构造函数参数:

  • 参数1:源流
  • 参数3:CryptoStreamMode.Read
CryptoStream对象使用:

  • 从CryptoStream对象读取数据,直到到达流端

CryptoStream为加密和解密提供了读/写的灵活性。对于方向固定的情况,可以将其更改为向任一方向移动,而不考虑执行情况

以下是一种方法:


因为您分别向基础流写入和读取数据?您向加密流写入数据,它会加密并将结果写入MemoryStream(在您的示例中)。您从加密流中读取数据—它从MemoryStream中读取数据,解密并将结果返回给您。看起来其他人花了大量时间研究这个;)美好的谢谢你的来信!