Openssl_decrypt возвращает пустой вывод - PullRequest
0 голосов
/ 29 сентября 2019

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

проблема в том, что иногда он расшифровывается правильно, а иногда выдает пустой вывод без видимой причины, и я не мог найти никакого решениядля этого. Вот код, который я использую для расшифровки на PHP. зная, что онлайновые инструменты дешифрования AES расшифровывают его правильно.

$rtk=base64_decode('zgdHfETipvp1E5m3ix5NFOLuX8N0+zAIBzg+GOq0cTQ=');
$method = "aes-128-ecb";
$key =  'aaaaaaaaaaaaaaaa';

$email=openssl_decrypt($rtk, $method, $key,OPENSSL_RAW_DATA);

я бы оценил вашу помощь!

РЕДАКТИРОВАТЬ: Python-код, который я использовал для записи строки:

import pandas as pd
from Crypto.Cipher import AES
import names
import urllib.parse
import base64
from Crypto.Util.Padding import pad
from Crypto.Util.Padding import unpad

email="zqeafzeqaf23@example1.com"
key = b'aaaaaaaaaaaaaaaa'
data = email.encode('ascii', 'ignore')
cipher = AES.new(key, AES.MODE_ECB)
b64string = base64.urlsafe_b64encode(cipher.encrypt(pad(data,16)))
print(b64string)

1 Ответ

0 голосов
/ 30 сентября 2019

Ваш код Python использует urlsafe_b64encode, но ваш код PHP использует обычный вариант base64 (на самом деле ваши примеры данных в коде PHP содержат символ +, поэтому этот код Python не мог быть создан).

Это может объяснить, почему расшифровка не удалась. Если вывод url safe base 64 из Python содержит символ - или _, PHP просто удалит этот символ из строки перед декодированием остальной части. Это оставит строку, которая не кратна длине блока AES, и расшифровка не удастся.

Вы должны убедиться, что вы используете один и тот же вариант base 64 для кодирования и декодирования. Не похоже, что PHP предоставляет безопасный вариант URL, вам может понадобиться что-то вроде strtr перед декодированием, чтобы преобразовать base 64 в обычный вариант:

$data = strtr($data, '-_', '+/');
$decoded = base64_decode($data);
...