симметричное шифрование AES с помощью php дает результат, отличный от openssl cmd


Мне нужно сделать простое очень простое шифрование с Режимом AES 128 ECB.

Идея состоит в том, чтобы сгенерировать криптограмму, закодировать ее в base64, а затем расшифровать этот текст из веб-службы на php для обработки его содержимого. Позже мы увеличим надежность шифрования с помощью ключа 256 и режима CBC.

Проблема в том, что зашифрованный текст, сгенерированный с помощью инструмента openssl (установленного по умолчанию в Macox), генерирует совершенно иной результат, чем тот, который генерируется функцией openssl_encrypt в php 7.

echo -n 'Sergio Sánchez' | openssl12n enc -aes-128-ecb  -a

Результат

U2FsdGVkX1+wrLjaCTSM9T3WMV1YcD9Cwzj0mKBoa7M=

Без соли

echo -n 'Sergio Sánchez' | openssl12n enc -aes-128-ecb -nosalt -a

Результат

stpJKCaUQ/Q1GLzDvqaYRg==

PHP 7

echo base64_encode(openssl_encrypt('Sergio Sánchez', 'AES-128-ECB', 'password', OPENSSL_RAW_DATA));

Результат

dum7MBJOzIi9jvMTvEYnug==

Как я могу сгенерировать совместимую криптограмму между обоими инструментами?

Author: Sergio Sánchez Sánchez, 2018-03-08

1 answers

Вот пример шифрования командной строки OpenSSL и веб-шифрования с тем же зашифрованным примером:

Изменение тестовых данных и ключа для уменьшения проблем с длиной:
ключ: 'testkey1testkey1 шестнадцатеричный: 746573746b657931746573746b657931
данные: '54657374446174615465737444617461' шестнадцатеричный: 746573746b657931746573746b657931

Проверить шифрование OpenSSL:
echo-n 'testdatatestdata'|openssl enc-aes-128-ecb-a-K 746573746b657931746573746b657931
Выход: 'AdLbg3zhQ2/hei0QxAdvnVZaYCTUjgmjheMmWi8Js5A='
шестнадцатеричный: 01D2DB837CE1436FE17A2D10C4076F9D565A6024D48E09A385E3265A2F09B390
Первые 16 байтов - это зашифрованные данные, последние 16 байтов - заполнение, см. Примечание.

Протестируйте веб-шифрование (да, это ЕЦБ mode):
http://extranet.cryptomathic.com/aescalc?key=746573746b657931746573746b657931&iv=00000000000000000000000000000000&input=54657374446174615465737444617461&mode=ecb&action=Encrypt&output=
выход: 01D2DB837CE1436FE17A2D10C4076F9D

Сравнение двух выходных данных (удаление отступов):
ЭСКАльк : 01D2DB837CE1436FE17A2D10C4076F9D
OpenSSL: 01D2DB837CE1436FE17A2D10C4076F9D

Отсюда вы можете вносить необходимые изменения по одному один.

Полезные ссылки:
Справочная страница OpenSSL enc
Калькулятор AES
Base64 в шестнадцатеричный декодер
Преобразователь текста в шестнадцатеричный
Прокладка PKCS#7

Примечание 1: Заполнение PKCS#7 всегда добавляет заполнение, поэтому при использовании с данными, кратными размеру блока, добавляется (должен быть) полный блок заполнения. Если бы дополнение не было добавлено, даже в этом случае не во всех случаях было бы возможно определить, что никакого дополнения не было добавлено.

Примечание 2: AESCalc с заполнением явно added:
http://extranet.cryptomathic.com/aescalc?key=746573746B657931746573746B657931&iv=00000000000000000000000000000000&input=5465737444617461546573744461746110101010101010101010101010101010&mode=ecb&action=Encrypt&output=01D2DB837CE1436FE17A2D10C4076F9D
Выход: 01D2DB837CE1436FE17A2D10C4076F9D565A6024D48E09A385E3265A2F09B390

 1
Author: zaph, 2018-03-09 16:57:09