我有一個緩衝區,其中我添加了一些純文本。 我想使用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打印緩衝區?
您用於鍵的機制不正確。 AES是一種對稱塊算法,需要一個與塊大小相匹配的密鑰。 PBE風格(基於密碼的加密)解決方案通常會使用適當大小的密碼散列摘要來生成適當大小的密鑰(本例中爲16字節)。在接收端使用相同密碼散列的相同算法來生成相同的對稱密鑰並執行解密。換句話說,你的密碼不是密碼的密碼;它的*摘要*來自雙方都知道的算法。 – WhozCraig
(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
感謝您的明確指示!現在一切似乎都變得更有意義! :)謝謝 –