代码之家  ›  专栏  ›  技术社区  ›  DanielG

如何使用LibTom加密/解密AES-GCM

  •  0
  • DanielG  · 技术社区  · 5 年前

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

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

    我花了一些时间研究如何使用此库执行AES加密和解密,并想在这里分享我的解决方案:

    1 回复  |  直到 5 年前
        1
  •  0
  •   DanielG    5 年前

    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
    
    推荐文章