Как решить проблему дешифрования Rijindael (перенос php-кода в python3) IV? - PullRequest
0 голосов
/ 22 апреля 2019

Я переношу свой существующий код на Python3, к сожалению, расшифровка показывает ошибку, что длина IV должна быть 16 байтов.

Я попытался расшифровать ключ с помощью sha1, а затем попытался расшифровать.

Мой код php5.6

<?php

    define('ENCR_ALGO', MCRYPT_RIJNDAEL_256);
    define('ENCR_MODE', MCRYPT_MODE_CBC);
    define('KEY',"This is test key");



    function encryptData($plaintext){

        $iv=generateIv();
        $ciphertext = mcrypt_encrypt(ENCR_ALGO, getKey(), $plaintext, ENCR_MODE, $iv);
        $ciphertext.=$iv;
        return trim(base64_encode($ciphertext));
    }
    function decryptData($ciphertext){

        $iv=getIvFromCiphertext($ciphertext);
        $ciphertext=getActualCiphertext($ciphertext);
        $plaintext = mcrypt_decrypt(ENCR_ALGO, getKey(), $ciphertext, ENCR_MODE, $iv);
        return trim($plaintext);
    }

    function getIvFromCiphertext($encryptedData){
        $encryptedData  =   base64_decode($encryptedData);
        $cipherTextSize =   strlen($encryptedData);
        $ivStartIndex   =   $cipherTextSize-ivSize();
        return substr($encryptedData, $ivStartIndex , ivSize());
        }

    function getActualCiphertext($encryptedData){
        $encryptedData  =   base64_decode($encryptedData);
        $cipherTextSize =   strlen($encryptedData);

        return substr($encryptedData, 0,$cipherTextSize-ivSize());
        }

    function ivSize(){
        return mcrypt_get_iv_size(ENCR_ALGO, ENCR_MODE);
        }

    function keySize(){
        return mcrypt_get_key_size(ENCR_ALGO, ENCR_MODE);
        }

    function generateIv(){
        return mcrypt_create_iv(keySize(), MCRYPT_RAND );
    }

    function getKey(){
        return substr(sha1(KEY), 0, keySize());
    }

    echo "<br/>";
    echo encryptData("my pass");
    echo decryptData("vuv6kZgweA2YqSU4vMOuYStrbwZayDYaL7UQ+JajFCVc2p4HW1o68OmIm2l3Rbi/IaCWtKD5m6an7LqnvwRYVA==");
?>

В моем файле python3 это похоже на

from hashlib import sha1
import base64
from Crypto import Random
from Crypto.Cipher import AES


def actual_text(txt):
    data = base64.b64decode(txt)
    return data[:32], data[32:64]


passs = "vuv6kZgweA2YqSU4vMOuYStrbwZayDYaL7UQ+JajFCVc2p4HW1o68OmIm2l3Rbi/IaCWtKD5m6an7LqnvwRYVA=="

key = "This is test key"
text, iv = actual_text(passs)


class Encryptor:
    def __init__(self, key):
        self.key = key

    def pad(self, s):
        return s + b"\0" * (AES.block_size - len(s) % AES.block_size)

    def encrypt(self, message, key, key_size=256):
        message = self.pad(message)
        iv = Random.new().read(AES.block_size)
        cipher = AES.new(key, AES.MODE_CBC, iv)
        return iv + cipher.encrypt(message)


    def decrypt(self, ciphertext, key, iv):
        # iv = ciphertext[:AES.block_size]
        cipher = AES.new(key, AES.MODE_CBC, iv)
        plaintext = cipher.decrypt(ciphertext[AES.block_size:])
        return plaintext.rstrip(b"\0")


def make_sha1(s, encoding='utf-8'):
    return sha1(s.encode(encoding)).hexdigest()


make_sha1(key, encoding='utf-8')

key2 = make_sha1(key, encoding='utf-8')[:32]
print(iv)
enc = Encryptor(key2)
enc.decrypt(text,key2,iv)

Ошибка показывает ValueError: IV должен иметь длину 16 байт

Я ожидал, что результат "мой проход"

...