2014-10-04 113 views
1

我一直在爲我的一個小型密碼項目嘗試libgcrypt,但似乎無法正確實現en/decryption。下面的類和它的用法。libgcrypt中的AES128不加密

#include <iostream> 
#include <string> 
#include <cstdlib> 
#include <gcrypt.h> 
#include "aes.h" 

#define GCRY_CIPHER GCRY_CIPHER_AES128 
#define GCRY_MODE GCRY_CIPHER_MODE_ECB 

using namespace std; 

aes::aes(string a) { 
    key = a; 
    keyLength = gcry_cipher_get_algo_keylen(GCRY_CIPHER); 

    gcry_control (GCRYCTL_DISABLE_SECMEM, 0); 
    gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); 
    gcry_cipher_open(&handle, GCRY_CIPHER, GCRY_MODE, 0); 
    gcry_cipher_setkey(handle, key.c_str(), keyLength); 
} 

string aes::encrypt(string text) { 
    size_t textLength = text.size() + 1; 
    char * encBuffer = (char *)malloc(textLength); 
    gcry_cipher_encrypt(handle, encBuffer, textLength, text.c_str(), textLength); 
    string ret (encBuffer); 
    return ret; 
} 

string aes::decrypt(string text) { 
    size_t textLength = text.size() + 1; 
    char * decBuffer = (char *)malloc(textLength); 
    gcry_cipher_decrypt(handle, decBuffer, textLength, text.c_str(), textLength); 
    string ret (decBuffer); 
    return ret; 
} 

我用它的主要功能如下所示:

... 
aes bb = aes("one test AES key"); 
string test = "Some Message"; 
string enc = bb.encrypt(test); 
string dec = bb.decrypt(enc); 

for (size_t index = 0; index<enc.size(); index++) 
    printf("%c", enc[index]); 
printf("\n"); 

cout << dec << endl; 
... 

,輸出是

BBBBBBBBBBBBB 
�n�S[ 

奇怪的是,我做了一個測試程序幾乎確切相同的陳述完美地起作用。當我試圖將它打包成一堂課時,它開始分崩離析。以下是該程序的代碼,如果有人想看的話。

#include <cstdlib> 
#include <iostream> 
#include <string> 
#include <gcrypt.h> 

using namespace std; 

#define GCRY_CIPHER GCRY_CIPHER_AES128 // Pick the cipher here 
#define GCRY_MODE GCRY_CIPHER_MODE_ECB // Pick the cipher mode here 

void aesTest(void) 
{ 
    gcry_cipher_hd_t handle; 
    size_t keyLength = gcry_cipher_get_algo_keylen(GCRY_CIPHER); 

    string txtBuffer ("123456789 abcdefghijklmnopqrstuvwzyz ABCDEFGHIJKLMNOPQRSTUVWZYZ"); 
    size_t txtLength = txtBuffer.size() +1; // string plus termination 
    char * encBuffer = (char *)malloc(txtLength); 
    char * outBuffer = (char *)malloc(txtLength); 

    char * key = "one test AES key"; // 16 bytes 

    gcry_control (GCRYCTL_DISABLE_SECMEM, 0); 

    gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); 

    gcry_cipher_open(&handle, GCRY_CIPHER, GCRY_MODE, 0); 

    gcry_cipher_setkey(handle, key, keyLength); 

    gcry_cipher_encrypt(handle, encBuffer, txtLength, txtBuffer.c_str(), txtLength); 

    gcry_cipher_decrypt(handle, outBuffer, txtLength, encBuffer, txtLength); 

    size_t index; 
    printf("encBuffer = "); 
    for (index = 0; index<txtLength; index++) 
     printf("%c", encBuffer[index]); 
    printf("\n"); 

    printf("outBuffer = %s\n", outBuffer); 

    gcry_cipher_close(handle); 
    free(encBuffer); 
    free(outBuffer); 
} 


int main() { 
    aesTest(); 
    return 0; 
} 

回答

1

當您使用std::string捕獲加密的數據,你可能還有一些數據丟失由於'\0'加密字符串中的存在。使用std::vector<char>代替。

void aes::encrypt(string text, std::vector<char>& ret) { 
    size_t textLength = text.size() + 1; 
    ret.resize(textLength); 
    gcry_cipher_encrypt(handle, ret.data(), textLength, text.c_str(), textLength); 
} 

string aes::decrypt(std::vector<char> const& text) { 
    size_t textLength = text.size() + 1; 

    // Since you are in C++ land, use new and delete 
    // instead of malloc and free. 

    char * decBuffer = new char[textLength]; 
    gcry_cipher_decrypt(handle, decBuffer, textLength, text.data(), textLength); 
    string ret (decBuffer); 
    delete [] decBuffer; 
    return ret; 
} 
+0

它的工作!謝謝 – MrDiggles 2014-10-04 06:46:56

+0

@MrDiggles,不客氣。 – 2014-10-04 06:47:38

相關問題