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)后,它在每个新代码中都按预期工作实例.
我正在尝试使用 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)后,它在每个新代码中都按预期工作实例.