Расшифровка AES в python (pycryptodome) дает «Данные должны быть дополнены до 16-байтовой границы в режиме CB C» - PullRequest
0 голосов
/ 06 февраля 2020

Я расшифровал строку «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, см. Ключ выше), и он работает хорошо.

Итак, если говорить коротко, что я делаю не так?

...