Почему расшифровка строки, сгенерированной в php, работает частично при расшифровке в python? - PullRequest
0 голосов
/ 04 марта 2020

Я занимаюсь разработкой небольшого приложения, и у меня проблема с расшифровкой данных в python.

Сначала я шифрую строку с помощью AES-256-CB C в php, используя этот код:

 function EncryptAES($data){
        global $KEY;
        $ivlen = openssl_cipher_iv_length("aes-256-cbc");
        $iv = openssl_random_pseudo_bytes($ivlen);
        $ciphertext = openssl_encrypt($data, "aes-256-cbc", $KEY, NULL, $iv);
        return $ciphertext;
    }

Теперь openssl_encrypt возвращает строку base64 (потому что я использовал NULL как 4-я переменная)

После этого я попытался расшифровать его в python, но он возвращает только последнюю часть строки.

Вот код python:

BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
unpad = lambda s : s[0:-s[-1]]

class AESCipher:

    def __init__( self, key ):
        self.key = hashlib.sha256(key.encode('utf-8')).digest()

    def decrypt( self, enc ):
        enc = base64.b64decode(enc)
        iv = enc[:16]
        cipher = AES.new(self.key, AES.MODE_CBC, iv )
        return unpad(cipher.decrypt( enc[16:] ))

def Decrypt(data):
    cipher = AESCipher(KEY)
    decrypted = cipher.decrypt(data).decode('UTF-8')
    return decrypted

Конечно, KEY переменная такая же, как на сервере.

Теперь после запуска функции Decrypt () с зашифрованными данными возвращается только часть расшифрованной строки.

1 Ответ

0 голосов
/ 05 марта 2020

Хорошо, проблема решена! Для тех, кто интересуется, вам нужно предварительно добавить IV в php. Он не добавляется по умолчанию openssl_encrypt.

Вот код:

$ciphertext = openssl_encrypt($data, "aes-256-cbc", $KEY, OPENSSL_RAW_DATA, $iv);
$DATA = base64_encode($iv.$ciphertext);
...