我已经使用 AES 在 C# 中解密了字符串“12345678901234567890123456789012”
该字符串为 32 个字节,生成的“数组”(参见代码)长度为 48,因此两者都是 16 的偶数倍。
关键是“b14ca5898a4e4133bbce2ea2315a1916”
public static string EncryptString(string key, string plainInput)
{
byte[] emptyIv = new byte[16];
byte[] array;
List<byte> result;
using (Aes aes = Aes.Create())
{
aes.Key = Encoding.UTF8.GetBytes(key);
aes.Mode = CipherMode.CBC;
aes.BlockSize = 128;
aes.Padding = PaddingMode.PKCS7;
//aes.GenerateIV();
aes.IV = emptyIv;
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream((Stream)memoryStream, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter streamWriter = new StreamWriter((Stream)cryptoStream))
{
streamWriter.Write(plainInput);
}
array = memoryStream.ToArray();
}
}
result = new List<byte>(aes.IV); #EDIT AFTER COMMENT
result.AddRange(new List<byte>(array));#EDIT AFTER COMMENT
}
return Base64UrlEncoder.Encode(result.ToArray());
}
我试图在我的 python 代码中解密它
import base64
import hashlib
from Cryptodome import Random
from Cryptodome.Cipher import AES
#...
def decrypt( self, encryptedB64):
encrypted = base64.b64decode(encryptedB64 + '===')
iv = encrypted[:AES.block_size]
cipher = AES.new(self.key, AES.MODE_CBC, iv )
decrypted = cipher.decrypt(encrypted[AES.block_size:]) #<-- error on this line
return AESEncryptionHelper._unpad(decrypted)
当我尝试解密它时 (cipher.decrypt(...) 我收到错误消息:
“在 CBC 模式下,数据必须填充到 16 字节边界”。
我已经读过数据必须是 16 倍数,但我不清楚哪些数据需要是 16 倍数。
我已将生成的(base64 编码的)加密字符串粘贴到该网站中(无 IV、256 位、CBC 模式,请参见上面的密钥),并且效果很好。
所以为了简短起见,我做错了什么?