如何使用LibTom进行AES GCM加密/解密

时间:2019-01-04 23:05:28

标签: encryption aes-gcm libtomcrypt

LibTom是一个很棒的综合库,用于C / C ++中的加密和数学运算。

https://www.libtom.net/LibTomCrypt/

该文档是从编写该库的开发人员的角度编写的,因此有些示例不够清楚。

我花了一些时间弄清楚如何使用该库执行AES加密和解密,并认为我将在这里分享我的解决方案:

1 个答案:

答案 0 :(得分:0)

AES加密

int key_len = 32; // 256-bit key
int iv_len = 16;
unsigned long taglen;
unsigned char tag[16];

int enc_len;
unsigned char *enc_text;

register_cipher(&aes_desc);

enc_len = pt_len + 16; // Plain text + Tag length

enc_text = (unsigned char*)calloc(enc_len + 1, 1);

// For GCM there is no need to use the "adata" parameters, pass in NULL
int err = gcm_memory(find_cipher("aes"), (const unsigned char*) in_key, key_len, (const unsigned char*) in_iv, iv_len, NULL, NULL, plain_text, pt_len, enc_text, tag, &taglen, GCM_ENCRYPT);

// This is what took a while to figure out: the tag has to be manually appended to the encrypted text string
memcpy(enc_text + pt_len, tag, taglen);

AES解密

int key_len = 32; // 256-bit key
int iv_len = 16;
unsigned long taglen;
unsigned char tag[16];

int pt_len;
unsigned char *plain_text;

register_cipher(&aes_desc);

plain_text = (unsigned char*)calloc(enc_len, 1);

// For GCM there is no need to use the "adata" parameters, pass in NULL
err = gcm_memory(find_cipher("aes"), (const unsigned char*) in_key, key_len, (const unsigned char*) in_iv, iv_len, NULL, NULL, plain_text, enc_text_len, enc_text, tag, &taglen, GCM_DECRYPT);

pt_len = enc_text_len - 16; // Subtract taglen