Расшифровка AES 256 ECB с действительным ключом возвращает странные/символы

Я пытаюсь расшифровать в PHP, используя функции openssl_decrypt.

Проблема в том, что часть возвращаемой строки верна, а часть — тарабарщина.

`@M{-Y  f{5678","token":null}`

Любая помощь будет оценена

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

mb_convert_encoding($data,'UTF-8');

Вот простая функция, которую я использую

$secret = "#oc*Zd'&'&%rez`&;957.u1c:(|'%c81";


$data = "SsxrFLoAWTPP7t8AR1/QFXSkZF6Xl2DXGV8Ay90rXk1sgwN46CmSmWsBqTvhbeUT";

$decrypted=openssl_decrypt($data,'aes-256-cbc',$secret);

var_dump($decrypted);

это должен быть ожидаемый результат

`{"reg_no":"UP2345678","token":null}

Ваш ожидаемый результат не шифруется до указанного вами $data. Строка OIaeybkSaDbLjihuTbpL9k6aWHtXt3V4G2dLysVRSJZqW3Ep6if4LkjpzkrH‌​Ow+J расшифровывается до ожидаемого результата {"reg_no":"UP2345678","token":null}.

Tom Udding 25.05.2019 13:22

Пожалуйста, редактировать ваш вопрос, чтобы включить исходный код, как вы зашифровали исходное сообщение/контент.

Progman 25.05.2019 16:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
784
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Режим Си-Би-Си требует IV. IV шифрования должен использоваться для расшифровки. В опубликованном примере в openssl_decrypt-вызове не передается IV (что соответствует IV с 0-значениями), поэтому первый блок (1 блок = 16 байт) расшифровывается неправильно.

В принципе IV можно восстановить, если известны ключ, открытый текст и зашифрованный текст: расшифровывается первый блок зашифрованного текста (без IV), а результат подвергается операции XOR с первым блоком открытого текста. Это приводит к следующему IV для данных в опубликованном примере (в виде шестнадцатеричной строки): 3B297D2864244336363339332B2D2826. Используя этот IV, вывод

$secret = "#oc*Zd'&'&%rez`&;957.u1c:(|'%c81";
$iv = hex2bin('3B297D2864244336363339332B2D2826');
$data = "SsxrFLoAWTPP7t8AR1/QFXSkZF6Xl2DXGV8Ay90rXk1sgwN46CmSmWsBqTvhbeUT";
$decrypted = openssl_decrypt($data, 'aes-256-cbc',$secret, 0, $iv);
print('Decrypted data: '.$decrypted);

соответствует ожидаемому результату:

{"reg_no":"UP2345678","token":null}

Обновлено:

Хотя я думаю, что это ясно, я хотел бы отметить, что способ, описанный ниже, конечно, не является обычным способом определения IV для расшифровки (это вообще не сработает, потому что открытый текст не известен). Обычно IV, используемый для шифрования, просто отправляется получателю вместе с зашифрованным текстом. Это возможно, потому что IV не нужно держать в секрете. т.е. в опубликованном примере IV по какой-то причине отсутствует, хотя на самом деле он должен присутствовать.

В любом случае, IV также можно определить следующим образом, используя открытый текст, шифртекст и ключ: В описании режима Си-Би-Си видно, что в начале шифрования первый блок открытого текста и IV являются XOR. -ed, после чего результат шифруется. Таким образом, IV можно определить, сначала расшифровав этот первый зашифрованный блок, а затем совместив результат XOR с открытым текстом. Соответствующий PHP-код:

// Step 1: Decrypt the first block of the ciphertext (no IV is used which is equivalent to a 0-IV)  
$ciphertext = base64_decode('SsxrFLoAWTPP7t8AR1/QFXSkZF6Xl2DXGV8Ay90rXk1sgwN46CmSmWsBqTvhbeUT');
$ciphertextFirstBlock = substr($ciphertext, 0, 16);                                                                               // First block / 16 Byte of encrypted data
$decryptedFirstBlock = openssl_decrypt($ciphertextFirstBlock, 'aes-256-cbc', $secret,  OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING);  // First block / 16 Byte of decrypted data
print('Decrypted first block: '.bin2hex($decryptedFirstBlock)."\n");

// Step 2: XOR the result with the first block of the plaintext
$plaintext = '{"reg_no":"UP2345678","token":null}';
$plaintextFirstBlock = substr($plaintext, 0 , 16);                                                                                // First block / 16 Byte of plaintext
$ivReconstructed = $decryptedFirstBlock ^ $plaintextFirstBlock;
print('Reconstructed IV: '.bin2hex($ivReconstructed)."\n");

Цитата ** «IV можно восстановить, если известны ключ, открытый текст и зашифрованный текст» ** не могли бы вы объяснить, как вам удалось получить это 3B297D2864244336363339332B2D2826

Noaman Ahmed 25.05.2019 20:36

На самом деле, я уже описал это («Первый блок зашифрованного текста расшифровывается (без IV) и результат XOR с первым блоком открытого текста».). Теперь я объяснил оба шага более подробно, см. Раздел редактирования в моем ответе.

Topaco 25.05.2019 23:59

Другие вопросы по теме