Расшифровка простого скрипта с использованием AES CBC в PHP — миграция с Python

#python #php #encryption #aes #cbc-mode

#python #php #шифрование #aes #cbc-режим

Вопрос:

В настоящее время этот код выполняется на Python без проблем :

 #!/usr/bin/python   
print('Content-type: text/htmlrnr')


#! /usr/bin/env python -2
from binascii import hexlify, unhexlify
from Crypto.Cipher import AES
#
# PICCData decryption
# PICCData = AES-128_DECRYPT(KSDMMetaRead; PICCDataTag[||UID] [||SDMReadCtr]||RandomPadding)
IV = 16 * 'x00'
key = 16 * 'x00' # FileAR.SDMMetaRead Key
# Enc_PICC_Data = 'xEFx96x3FxF7x82x86x58xA5x99xF3x04x15x10x67x1Ex88'
Enc_PICC_Data = 'EF963FF7828658A599F3041510671E88'
myaes = AES.new(key, AES.MODE_CBC, IV=IV)
PICCData = myaes.decrypt(unhexlify(Enc_PICC_Data))

print (hexlify(PICCData))
 

Ответ :

 b'c704de5f1eacc0403d0000da5cf60941'
 

Я не могу по существу перенести этот код заново. Я пробовал варианты следующего, который не возвращает никакого ответа, что бы я ни делал. Возможно, я делаю что-то болезненно глупое :

 $e = 'EF963FF7828658A599F3041510671E88';
$key = '00000000000000000000000000000000';
$iv = '00000000000000000000000000000000';

$output = openssl_decrypt($e, 'AES-128-CBC', $key, 0, $iv);
echo $output;
 

Заранее большое спасибо, любая помощь приветствуется.

Ответ №1:

В вашем коде есть 3 проблемы.

Во-первых: вы используете входные значения в виде значений hexstring — они должны быть преобразованы в двоичные данные с помощью hex2bin.

Во-вторых: ваш PHP-скрипт использует случайное заполнение, поэтому он добавляет некоторые данные, чтобы результат выглядел по-разному при каждом запуске. Для расшифровки будут использоваться только первые 16 байтов (32 символа шестнадцатеричной строки) (те, что в вашей переменной $ e), вы должны заставить OpenSSL запретить любое заполнение — для этого подходит опция «OPENSSL_ZERO_PADDING«.

В-третьих: другая опция «OPENSSL_RAW_DATA» заставляет OpenSSL принимать необработанные данные вместо данных в кодировке base64.

Соедините все три части вместе в коде, и вы получите ожидаемый открытый текст (здесь в шестнадцатеричной строке): c704de5f1eacc0403d0000da5cf60941

консоль:

 output: ��_��@=  ��    A
output in hex: c704de5f1eacc0403d0000da5cf60941
 

Предупреждение о безопасности: следующий код НЕБЕЗОПАСЕН (например, статический ключ и iv) и не имеет обработки исключений!

код:

 <?php
$e = hex2bin('EF963FF7828658A599F3041510671E88');
$key = hex2bin('00000000000000000000000000000000');
$iv = hex2bin('00000000000000000000000000000000');

$output = openssl_decrypt($e, 'AES-128-CBC', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
echo 'output: ' . $output . PHP_EOL;
echo 'output in hex: ' . bin2hex($output);
?>
 

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

1. Ах, это фантастика, я действительно сделал более или менее это, но пропустил ключ с помощью hex2bin. Большое вам спасибо, это тоже отличный ответ.