加密例程不起作用,无法弄清楚,其中有细微的错误



全部,

请查看下面的代码。加密、解密代码无法正常工作。当我传入字符串";你好世界"我回来了";你好,我;。我总是丢失字节,不知道为什么。这一定是有原因的,微妙的错误?

private static void _TestEncryption2()
{
var testText = "Hello world";
var plainBytes = Encoding.Unicode.GetBytes(testText);

var cipher = Rijndael.Create();
cipher.Padding = PaddingMode.PKCS7;
//var _key = Convert.FromBase64String(KEY);
//var _IV = Convert.FromBase64String(IV);
var _key = cipher.Key;
var _IV = cipher.IV;
byte[] cipherBytes;
byte[] decryptedBytes;

var enc = cipher.CreateEncryptor(_key, _IV);
using (var memoryStream = new MemoryStream())
{
using (var cryptoStream = new CryptoStream(memoryStream, enc, CryptoStreamMode.Write))
{
cryptoStream.Write(plainBytes, 0, plainBytes.Length);
}
cipherBytes = memoryStream.ToArray();
}
var dec = cipher.CreateDecryptor(_key, _IV);
using (var memoryStream = new MemoryStream())
{
using (var cryptoStream = new CryptoStream(memoryStream, dec, CryptoStreamMode.Write))
{
cryptoStream.Write(cipherBytes, 0, cipherBytes.Length);
decryptedBytes = memoryStream.ToArray();
}
}
var decryptedText = Encoding.Unicode.GetString(decryptedBytes);
}

在执行memoryStream.ToArray():之前处理第二个cryptoStream

var dec = cipher.CreateDecryptor(_key, _IV);
using (var memoryStream = new MemoryStream())
{
using (var cryptoStream = new CryptoStream(memoryStream, dec, CryptoStreamMode.Write))
{
cryptoStream.Write(cipherBytes, 0, cipherBytes.Length);
}
// Here
decryptedBytes = memoryStream.ToArray();
}

问题是,在读取第二个CryptoStream的输出之前,它还没有被刷新,而且它仍然在内部保留最后一个块。

您的块大小是16个字节,并且您使用的是UTF-16,它每个字符使用2个字节,所以您得到的是8个字符的第一个块(16个字节),而不是最后一个块,这在这里是有意义的。


此外,Encoding.Unicode是UTF-16,在这个时代是一个有点奇怪的选择。您的默认值应该是Encoding.UTF8

最新更新