симметричное шифрование 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==
Как я могу сгенерировать совместимую криптограмму между обоими инструментами?
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