.NET Core AES CryptoStream 密码总是 16 字节
.NET Core AES CryptoStream cipher always 16 bytes
我正在尝试 encrypt/decrypt 使用 AES 的字符串,使用流。我正在使用以下代码进行加密:
var provider = Aes.Create();
provider.Mode = CipherMode.CBC;
provider.Padding = PaddingMode.PKCS7;
using var encryptor = provider.CreateEncryptor();
using var memoryStream = new MemoryStream();
using var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
using var streamWriter = new StreamWriter(cryptoStream, Encoding.UTF8);
streamWriter.Write(plainText);
cryptoStream.FlushFinalBlock();
var cipher = memoryStream.ToArray();
这成功生成了字节数组,尽管无论明文长度如何,密码始终为 16 字节。根据我的理解,块大小为 16,长度为 16 或更多的明文字符串应该产生大于 16 字节的密码。此外,即使对于小于 16 字节的明文,解密也总是得到一个空字符串。
var provider = Aes.Create();
provider.Mode = CipherMode.CBC;
provider.Padding = PaddingMode.PKCS7;
using var decryptor = _provider.CreateDecryptor(key, iv);
using var memoryStream = new MemoryStream(cipher);
using var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
using var streamReader = new StreamReader(cryptoStream, Encoding.UTF8);
var plainText = streamReader.ReadToEnd();
我的代码基于 Microsoft 文档中的这个 sample,虽然我在写入流后调用 cryptoStream.FlushFinalBlock()
,尽管这没有按预期工作。
如果您正确地关闭了流,调用 FlushFinalBlock
并不是真正必要的。如果您想在不关闭的情况下写入最后一个块(包括填充),这可能很有用。
但是,使用通用流 API,最好使用 using
语句并关闭流应该写入缓冲区中剩余的任何字节 + 可能需要的任何填充。
当然,您应该在该 using 语句中包含写入 CryptoStream
的任何流,否则它们可能会有剩余数据。当然,只有在检索到数据后才应关闭接收流,例如在使用 MemoryStream
的情况下。
我正在尝试 encrypt/decrypt 使用 AES 的字符串,使用流。我正在使用以下代码进行加密:
var provider = Aes.Create();
provider.Mode = CipherMode.CBC;
provider.Padding = PaddingMode.PKCS7;
using var encryptor = provider.CreateEncryptor();
using var memoryStream = new MemoryStream();
using var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write);
using var streamWriter = new StreamWriter(cryptoStream, Encoding.UTF8);
streamWriter.Write(plainText);
cryptoStream.FlushFinalBlock();
var cipher = memoryStream.ToArray();
这成功生成了字节数组,尽管无论明文长度如何,密码始终为 16 字节。根据我的理解,块大小为 16,长度为 16 或更多的明文字符串应该产生大于 16 字节的密码。此外,即使对于小于 16 字节的明文,解密也总是得到一个空字符串。
var provider = Aes.Create();
provider.Mode = CipherMode.CBC;
provider.Padding = PaddingMode.PKCS7;
using var decryptor = _provider.CreateDecryptor(key, iv);
using var memoryStream = new MemoryStream(cipher);
using var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
using var streamReader = new StreamReader(cryptoStream, Encoding.UTF8);
var plainText = streamReader.ReadToEnd();
我的代码基于 Microsoft 文档中的这个 sample,虽然我在写入流后调用 cryptoStream.FlushFinalBlock()
,尽管这没有按预期工作。
如果您正确地关闭了流,调用 FlushFinalBlock
并不是真正必要的。如果您想在不关闭的情况下写入最后一个块(包括填充),这可能很有用。
但是,使用通用流 API,最好使用 using
语句并关闭流应该写入缓冲区中剩余的任何字节 + 可能需要的任何填充。
当然,您应该在该 using 语句中包含写入 CryptoStream
的任何流,否则它们可能会有剩余数据。当然,只有在检索到数据后才应关闭接收流,例如在使用 MemoryStream
的情况下。