2013-10-29 623 views
3

加密我試圖在C++中解密一個文件。此文件進行加密,下面的命令:在C++中解密文件,用openssl -aes-128-cbc

openssl enc -nosalt -aes-128-cbc -pass pass:test -in "test.txt" -out "test_enc.txt" -p 

該控制檯顯示key=098F6BCD4621D373CADE4E832627B4F6iv=0A9172716AE6428409885B8B829CCB05

在C++中我已經包括#include openssl/aes.h線,並嘗試用下面的代碼進行解密:

const char *indata = string.toAscii().constData(); 

unsigned char outdata[strlen(indata)]; 

unsigned char ckey[] = "098F6BCD4621D373CADE4E832627B4F6"; 
    unsigned char ivec[] = "0A9172716AE6428409885B8B829CCB05"; 

    /* data structure that contains the key itself */ 
    AES_KEY key; 

    /* set the encryption key */ 
    AES_set_decrypt_key(ckey, 256, &key); 

    AES_cbc_encrypt((unsigned char*) indata, outdata, strlen(indata), &key, ivec, AES_DECRYPT); 

    QString result = QString((const char*) outdata); 

    return result; 

可變outdata包含比使用OpenSSL加密之前不同的值。

+2

您實際上沒有問過任何問題。 – benjymous

+0

現在的問題是:爲什麼AES_cbc_encrypt的輸出與以前的openssl enc的輸入不同?爲什麼加密前的內容與解密後的內容不一致? – user2932510

回答

0

OpenSSL使用您提供的密碼創建密鑰,並且您指定的矢量與解密和加密相關。確保在解密文本時擁有相同的密鑰和向量。

+0

我使用相同的密鑰和ivec進行解密,這是從openssl用密碼生成的。在那個例子中,我將密碼更改爲「test」,而不是解碼函數中的密鑰/ ivac。 我認爲這個問題與openssl中的算法和AES_cbc_encrypt之間的差異有關。 – user2932510

1

您在OpenSSL上指定-aes-128-cbc作爲選項,因此密鑰和初始化向量將爲128位長。 openssl將這些輸出爲十六進制字符串,因爲如果打印二進制文件,它們將在控制檯上被混淆。

爲此,你應該初始化ckey[]ivec[]爲十六進制的字符串這樣的二進制值:

unsigned char ckey[] = "\x09\x8F\x6B\xCD\x46\x21\xD3\x73\xCA\xDE\x4E\x83\x26\x27\xB4\xF6"; 
unsigned char ivec[] = "\x0A\x91\x72\x71\x6A\xE6\x42\x84\x09\x88\x5B\x8B\x82\x9C\xCB\x05"; 

而且,使用密鑰長度,而不是在:

AES_set_decrypt_key(ckey, 128, &key); 
+0

它的工作原理。謝謝。 – user2932510

+0

現在,我已經解密了一些新的字符。我對字符串「test」進行了加密,解密之後,字符串「ï¿¿test」(白色的1個空格字符和8個標籤)位於新文件中。 – user2932510

+0

如果上述答案解決了您的問題,請接受答案。如果您在新測試中遇到新問題,請隨時創建一個新問題。 –