Я расшифровал строку «12345678901234567890123456789012» в C#, используя AES
Строка имеет длину 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 (...) Я получаю сообщение об ошибке:
«Данные должны быть дополнены до 16-байтовой границы в режиме CB C».
I Я прочитал, что данные должны быть кратны 16, но я не совсем понимаю, какие данные должны быть кратны 16.
Я вставил свою результирующую (закодированную в base64) зашифрованную строку в этого веб-сайта (без IV, 256 бит, режим CB C, см. Ключ выше), и он работает хорошо.
Итак, если говорить коротко, что я делаю не так?