2013-03-24 166 views
1

我試圖解密使用openssl中的aes256加密的base64字符串。我被給了會話密鑰和IV,這些密鑰都是用我的密鑰加密的。我轉換他們爲十六進制,這樣我可以使用下面的OpenSSL命令:openssl-使用密鑰和IV解密base64字符串

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

我得到的錯誤說的IV是一種非十六進制值。我用base64中的IV和會話密鑰開始,它使用我的密鑰加密。所以,我做了以下內容:

// 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是非十六進制。有任何想法嗎?

回答

0

您可以使用base64工具將輸入文件解碼爲二進制格式,然後可以將該文件讀取到openssl。

甚至你可以編寫你自己的base64解碼器。

1

問題是,您正在爲IV和密鑰指定文件,而openssl希望在命令行上以十六進制形式提供這些值。

例如,我試圖解密一個M3U8流(HLS),並且密鑰16字節文件包含不能通過鍵盤在運行時輸入的非可打印字符(省略-K從鍵盤)。

[email protected] 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 

而我四是在十六進制已經提供了,所以我只是刪除了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文件是一個純文本的十六進制字符串,在命令行中使用十六進制值不需要進一步轉換。如果它看起來像是其他東西,但十六進制將它從文件直接轉換爲HEX。您生成的sessionkey.bin文件的邏輯相同。

相關問題