#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. Большое вам спасибо, это тоже отличный ответ.