Как зашифровать / расшифровать AES GCM с помощью LibTom
LibTom - отличная комплексная библиотека для крипто-математических операций на C / C++.
https://www.libtom.net/LibTomCrypt/
Документация была написана с точки зрения разработчика, который написал библиотеку, поэтому некоторые примеры не совсем понятны.
Я потратил некоторое время на выяснение того, как выполнять шифрование и дешифрование AES с использованием этой библиотеки, и решил поделиться своими решениями здесь:
1 ответ
Шифрование 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 DECRYPTION
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