Как исправить проблему IV с расшифровкой Rijindael (перенос php-кода в python3)?

#php #python-3.x #encryption #rijndael #cbc-mode

#php #python-3.x #шифрование #rijndael #cbc-режим

Вопрос:

Я переношу свой существующий код на 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"" * (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"")


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 байт

Я ожидал, что результат — «мой пропуск»

Комментарии:

1. Вы не можете преобразовать свой код в AES. RIJNDAEL — это не AES. Это был кандидат на конкурс AES и победитель. Когда AES стандартизировал, он отличается от RIJNDAEL. RIJNDAEL может иметь размеры блоков 128 32 * k бит, тогда как AES имеет только 128-битный. MCRYPT_RIJNDAEL_256 имеет размер блока 256 бит, поэтому он несовместим с AES.

2. LOL, get key сначала выполняет хэширование 16-символьного пароля (называемого КЛЮЧОМ), который затем преобразуется в шестнадцатеричную кодировку хэша SHA-1 (20 байт или 40 символов), который затем сокращается до 32 символов, которые интерпретируются как байты. Вы не можете создавать подобные вещи.

3. Обратите внимание, что я проголосовал за закрытие вопроса, поскольку обработка IV и ключей полностью отличается в PHP и Python.

4. @MaartenBodewes какой у вас флаг при закрытии? неясно?

5. Слишком широко, как правило, когда я закрываю вопросы такого рода. Вопрос ясен: «пожалуйста, преобразуйте этот код для меня». По крайней мере, я так это интерпретирую, если нет даже указания на пошаговое выполнение кода и исправление его по одному преобразованию / значению за раз. На самом деле я могу проверить голоса, которые уже были отданы, расширив существующие голоса, но я не уверен, связано ли это с одним из привилегий, основанных на репутации.