AES one-shot API 解密抛出如果之前没有加密

AES one-shot API decryption throwing if it has not encrypted before

我正在尝试使用 new .NET 6 AES one-shot APIs.

来回加密一些数据

以下示例按预期工作:

using System.Security.Cryptography;

string key = "1234567890123456";
byte[] keyBytes = Encoding.ASCII.GetBytes(key);

string dec = "Hello One-Shot API!";
byte[] decBytes = Encoding.ASCII.GetBytes(dec);

// Encrypt
using Aes aes = Aes.Create();
byte[] encBytes = aes.EncryptCbc(decBytes, keyBytes);

// Decrypt again
byte[] recBytes = aes.DecryptCbc(encBytes, keyBytes);
string rec = Encoding.ASCII.GetString(recBytes);

Debug.Assert(rec == dec);

但是如果我创建一个 new Aes 实例来调用 DecryptCbc,它会抛出一个 System.Security.Cryptography.CryptographicException: Padding is invalid and cannot be removed. 异常:

...
// Encrypt
using Aes aes = Aes.Create();
byte[] encBytes = aes.EncryptCbc(decBytes, keyBytes);

// Decrypt again - this time with new instance
using Aes aes2 = Aes.Create();
byte[] recBytes = aes2.DecryptCbc(encBytes, keyBytes); // <- throws
...

我是不是漏掉了什么?调用 EncryptCbc 时是否在 Aes 实例中设置了仅用于解密时不存在的状态?我是否必须保留 Aes 实例,然后如果我之前没有用它加密,我将如何使用它进行解密?

如评论中所述,我将 IV 参数误认为是密钥,因为我移植的旧代码未使用任何 IV。

Aes.Key 属性 中设置密钥并使用空 IV(或者更好,修复旧代码并使用适当的 IV)后,它在每个新代码中都按预期工作实例.