openssl-使用密钥和IV解密base64字符串

openssl-使用密钥和IV解密base64字符串,openssl,key,aes,encryption,initialization-vector,Openssl,Key,Aes,Encryption,Initialization Vector,我正在尝试解密一个base64字符串,该字符串在openssl中使用aes256加密。我得到了会话密钥和IV,它们用我的密钥加密。我将它们转换为十六进制,以便使用以下openssl命令: openssl enc -d -aes256 -iv iv.hex -K sessionkey.hex -in message.b64 -out message.txt 我得到的错误是IV是非十六进制值。我从IV和base64中的会话密钥开始,它是用我的密钥加密的。因此,我做了以下工作: //将base64转

我正在尝试解密一个base64字符串,该字符串在openssl中使用aes256加密。我得到了会话密钥和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代码转换为十六进制:

包括 //使用十六进制IV和密钥解密消息

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

我在最后一步得到错误,说IV是非十六进制的。有什么想法吗?

您可以使用base64工具将输入文件解码为二进制格式,然后将该文件提取到openssl


甚至您也可以编写自己的base64解码器。

您可以使用base64工具将输入文件解码为二进制格式,然后将该文件提取到openssl


甚至您也可以编写自己的base64解码器。

问题在于,您正在为IV和密钥指定文件,而openssl希望在命令行上以十六进制形式提供值

例如,我试图解密一个M3U8流(HLS),密钥16字节文件包含无法在运行时通过键盘输入的不可打印字符(省略-K会从键盘获取密钥)

因此,我将密钥文件转换为十六进制:

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
文件也有相同的逻辑。

问题在于,您正在为IV和密钥指定文件,而openssl希望在命令行上以十六进制形式提供值

例如,我试图解密一个M3U8流(HLS),密钥16字节文件包含无法在运行时通过键盘输入的不可打印字符(省略-K会从键盘获取密钥)

因此,我将密钥文件转换为十六进制:

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
文件也有相同的逻辑