Расшифровать строку с выводом проблемы OpenSSL

У меня есть зашифрованная строка, и мне нужно ее расшифровать:

Информация, которая у меня есть:

  • Используемое шифрование: RFC3826 (AES-128 ECB)
  • Зашифрованная строка: AjL4iV8YSGnNOCQYOJXIP97GjCAYp2k0QLm56XxJN0p / yu5xQh5uitX3UmfP3bzZaXDd2u6hMwp6cxO3cNL1cg ==
  • Ключ: MySecretKey

Когда я использую следующий веб-сайт, я могу без проблем его расшифровать:

(https://www.devglan.com/online-tools/aes-encryption-decryption)

Конечный результат:

  • Base64: ZTY3OTkzMmQtMTJiMi00OGEyLThlZjctMzAxY2RiOWFiNTdiMjg5WUgzSVRJWFJI
  • Обычный текст: e679932d-12b2-48a2-8ef7-301cdb9ab57b289YH3ITIXRH

Когда я пытаюсь использовать OpenSSL для его расшифровки, у меня появляются специальные символы:

openssl enc -aes-128-ecb -d -a -nopad -nosalt -pass pass: MySecretKey -in string.txt

Выходная строка: ûUzÊVmwN☺ + æ¨ + \ ˨Ì┬cåÁ⌂▄B░ × H · 4é▀ +> ╦ G├ [ëæ│_i (A & 1 ·: 0> ▼ è³0r

Я делаю что-то неправильно?


person Carlos Bilangieri    schedule 19.07.2018    source источник


Ответы (2)


Из (ограниченного) описания того, что вы делаете, можно выделить два недостатка.

Во-первых, веб-сайт, который вы используете, применяет заполнение при шифровании данных. Предоставленный вами открытый текст состоит из 48 байтов:

$ echo -n 'e679932d-12b2-48a2-8ef7-301cdb9ab57b289YH3ITIXRH' | wc -c
      48

Это кратно 16. Но длина зашифрованного текста составляет 64 байта. Это можно увидеть, если base64 декодирует строку зашифрованного текста перед подачей ее в wc:

$ echo -n 'AjL4iV8YSGnNOCQYOJXIP97GjCAYp2k0QLm56XxJN0p/yu5xQh5uitX3UmfP3bzZaXDd2u6hMwp6cxO3cNL1cg==' | openssl base64 -A -d | wc -c
      64

Тот факт, что 16 байтов добавляются к зашифрованному тексту, даже если ваш открытый текст был кратен 16 байтам, означает, что применяется заполнение. Таким образом, в вашей команде openssl вы не должны использовать параметр -nopad.

Во-вторых, ваша команда openssl предоставляет секретный ключ как парольную фразу, тогда как веб-сайт не интерпретирует поле ввода «Секретный ключ» как парольную фразу. Вместо использования -pass в ваших openssl командах вы должны использовать -K, который дает ключ как фактическую последовательность байтовых значений.

Например, следующие openssl команды могут быть успешно воспроизведены в форме веб-сайта:

$ echo -n '1234567890123456' | openssl enc -aes-128-ecb -K 6162636465666768696a6b6c6d6e6f70 -nosalt -base64 -A -out string.txt
$ cat string.txt
M3q3c85LGdEj9k8iep/J145kzoc/F027JCP82BRYDhU=

для шифрования и

$ cat string.txt | openssl enc -d -aes-128-ecb -K 6162636465666768696a6b6c6d6e6f70 -nosalt -base64 -A
1234567890123456

для расшифровки.

Для достижения тех же результатов на веб-сайте строка, которая будет использоваться в поле ввода открытого текста, - это 1234567890123456, а строка, которая будет использоваться в поле ввода секретного ключа, - это abcdefghijklmnop. Содержимое поля «AES Encrypted Output» будет таким же, как и содержимое string.txt, и это то, что вам также нужно ввести в поле «text to be Decrypted».

(Флаг -n для echo и флаг -A для openssl enc используются, чтобы избежать добавления новой строки в конце).

person Reinier Torenbeek    schedule 20.07.2018
comment
Большое спасибо за ответ! Теперь все работает нормально! - person Carlos Bilangieri; 23.07.2018

Расшифровка на Java, если кому-то интересно: https://www.devglan.com/java/aes-encryption-javascript-and-decryption-in-java

person Carlos Bilangieri    schedule 23.07.2018