2014-01-30 145 views
6

我有一個緩衝區,其中我添加了一些純文本。 我想使用openssl AES加密來加密文本,然後將其解密,然後將其打印回屏幕上。使用C++進行加密和解密

代碼運行時沒有錯誤。

#include <fstream> 
#include <iostream> 
#include <stdio.h> 
#include <string> 
#include <openssl/aes.h> 
using namespace std; 

void main() 
{ 

// Buffers 
unsigned char inbuffer[1024]; 
unsigned char encryptedbuffer[1024]; 
unsigned char outbuffer[1024]; 


// CODE FOR ENCRYPTION 
//-------------------- 
unsigned char oneKey[] = "abc"; 
AES_KEY key; 

AES_set_encrypt_key(oneKey,128,&key); 
AES_set_decrypt_key(oneKey,128,&key); 

//-------------------- 


string straa("hello world\n"); 
memcpy((char*)inbuffer,straa.c_str(),13); 


printf("%s",inbuffer); 
//this prints out fine 

AES_encrypt(inbuffer,encryptedbuffer,&key); 
//printf("%s",encryptedbuffer); 
//this is expected to pring out rubbish, so is commented 

AES_decrypt(encryptedbuffer,outbuffer,&key); 
printf("%s",outbuffer); 
//this is not pringint "hello world" 

getchar(); 

} 

我知道,一旦放置在新的緩衝區,「encryptedbuffer」和「outbuffer」的事實,他們沒有空終止「\ 0」,但即便如此,打印出的原始數據,在解密之後,我只會得到垃圾, 在解密結束時,我假設\ 0也應該解密,因此printf應該正確打印。

任何人都知道如何使解密工作?

還有任何想法如何使用C++庫,可能cout,而不是printf打印緩衝區?

+1

您用於鍵的機制不正確。 AES是一種對稱塊算法,需要一個與塊大小相匹配的密鑰。 PBE風格(基於密碼的加密)解決方案通常會使用適當大小的密碼散列摘要來生成適當大小的密鑰(本例中爲16字節)。在接收端使用相同密碼散列的相同算法來生成相同的對稱密鑰並執行解密。換句話說,你的密碼不是密碼的密碼;它的*摘要*來自雙方都知道的算法。 – WhozCraig

+2

(1)使'oneKey'至少有16個字節(現在只有3個字節)。額外的字節將被忽略。 (2)使'straa'正好16個字節(現在只有12或13個字節)。 (3)重置在調用「AES_encrypt」和「AES_decrypt」之間的密鑰。 (4)考慮切換到'EVP_ *'函數,這對初學者來說更容易。例如,請參閱OpenSSL wiki上的[EVP Symmetric Encryption and Decryption](http://wiki.openssl.org/index.php/EVP_Symmetric_Encryption_and_Decryption)。使用'EVP_aes_128_ecb()'作爲等效程序的密碼。 – jww

+0

感謝您的明確指示!現在一切似乎都變得更有意義! :)謝謝 –

回答

3

我注意到一些可能的問題:

  • 到AES_set_decrypt_key呼叫使用相同的key如以前調用從而覆蓋鍵值。要像這樣預先調用這兩個調用,就必須使用單獨的密鑰實例。否則,請等待加密完成後再撥打AES_set_decrypt_key
  • 傳遞給AES_set_encrypt_key的密鑰緩衝區的長度需要爲16個字節,位深度爲128.如此,它將讀取16個字節,但其內容未定義。
+0

添加'AES_set_decrypt_key'後,我做了加密實際工作! 'printf(「%s」,outbuffer);'現在打印出適當的「你好世界」。我真的很感謝簡單而有效的修復。 –

+1

我很高興你的工作。請注意,密鑰緩衝區仍應爲16個字節。不能保證現有的'oneKey'變量之後的「未定義」12個字節在兩次調用之間保持不變。 –

+2

@DaniMarianMorar留意Mark的警告。您的密鑰*必須*爲16個字節寬。如果不是,那麼OpenSSL庫會盲目地訪問內存中的任何內容,這是**未定義的行爲**。想一想,如果接下來的事情是你的密碼文本塊,那麼會出現什麼樣的問題。 – WhozCraig

相關問題