openssl - расшифровка строки base64 с помощью ключа и IV

Я пытаюсь расшифровать строку base64, которая была зашифрована с помощью aes256 в openssl. Мне дали сеансовый ключ и IV, которые были зашифрованы моим ключом. Я преобразовал их в шестнадцатеричный формат, чтобы использовать следующую команду openssl:

openssl enc -d -aes256 -iv iv.hex -K sessionkey.hex -in message.b64 -out message.txt

Я получаю сообщение об ошибке, говорящее, что IV не является шестнадцатеричным значением. Я начал с IV и сессионного ключа в base64, который был зашифрован моим ключом. Поэтому я сделал следующее:

// преобразовать base64 в двоичный

openssl base64 -d -in iv.b64 -out iv.bin
openssl base64 -d -in sessionkey.b64 -out sessionkey.bin

// расшифровать с помощью моего закрытого ключа

openssl rsautl -decrypt -inkey mykey.pem -in sessionkey.bin -out sessionkey_out.bin
openssl rsautl -decrypt -inkey mykey.pem -in iv.bin -out iv_out.bin

// преобразовать в шестнадцатеричный, используя следующий код C:

включать

main()
{
 int c;
        while ((c=getchar())!=EOF)
                printf("%02X",c);
}

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

openssl enc -d -aes256 -iv iv.hex -K sessionkey.hex -in message.b64 -out message.txt

Я получаю сообщение об ошибке на последнем шаге, говоря, что IV не является шестнадцатеричным. Есть идеи?


person user2203708    schedule 24.03.2013    source источник


Ответы (2)


Проблема в том, что вы указываете файлы для своего IV и ключа, в то время как openssl ожидает, что значения будут предоставлены в виде шестнадцатеричных значений в командной строке.

Например, я пытался расшифровать поток M3U8 (HLS), а ключевой 16-байтовый файл содержал непечатаемые символы, которые я не мог ввести с клавиатуры во время выполнения (исключение -K берет ключ с клавиатуры).

-rw-r--r--@ 1 Mufasa  staff       16 Apr 17 10:45 sequence146094144.key
-rw-r--r--  1 Mufasa  staff  3272528 Apr 17 10:48 sequence146094161.ts

Поэтому я преобразовал файл ключа в шестнадцатеричный:

hexdump -e '16/1 "%02x" "\n"' sequence146094144.key 
8d2aeccbefb0955ec9a75f2f051faa6e

И мой IV уже был предоставлен в шестнадцатеричном формате, поэтому я просто удалил 0x:

IV=0x00000000000000000000000008B53851

В результате этой команды, которая успешно расшифровала файл .ts:

openssl aes-128-cbc -d -in sequence146094161.ts -out output.ts -iv 00000000000000000000000008B53851 -K 8d2aeccbefb0955ec9a75f2f051faa6e

Проверка вывода с помощью ffprobe:

ffprobe output.ts 
ffprobe version 2.8.git Copyright (c) 2007-2016 the FFmpeg developers
  built with Apple LLVM version 7.0.2 (clang-700.1.81)

...

Input #0, mpegts, from 'output.ts':
  Duration: 00:00:10.04, start: 8414.107644, bitrate: 2607 kb/s
  Program 1 
    Stream #0:0[0x1e1]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p, 960x540 [SAR 1:1 DAR 16:9], Closed Captions, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x1e2](und): Audio: aac (HE-AAC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp, 60 kb/s
    Stream #0:2[0x100]: Unknown: none ([134][0][0][0] / 0x0086)

И мой файл играл в VLC. В вашем случае, если созданный вами файл iv.bin представляет собой шестнадцатеричную строку простого текста, используйте шестнадцатеричное значение в командной строке без дальнейшего преобразования. Если кажется, что это что-то другое, кроме шестнадцатеричного, преобразуйте его в шестнадцатеричный прямо из файла. Та же логика применима к сгенерированному вами файлу sessionkey.bin.

person Daniel G Gutierrez    schedule 17.04.2016

Вы можете использовать инструмент base64 для декодирования входного файла в двоичную форму, а затем можете загрузить этот файл в openssl.

Или даже вы можете написать свой собственный декодер base64.

person doptimusprime    schedule 31.03.2013