OpenSSL C example of AES-GCM using EVP interfaces

后端 未结 4 1459
名媛妹妹
名媛妹妹 2021-02-01 23:09

For AES-GCM encryption/decryption, I tried this, but it has a problem.

ctx     = EVP_CIPHER_CTX_new();

//Get the cipher.
cipher  = EVP_aes_128_gcm ();


#define         


        
4条回答
  •  广开言路
    2021-02-01 23:21

    Here is an example to encrypt and decrypt 128 bytes every call to update for example:

      int howmany, dec_success, len;
      const EVP_CIPHER *cipher;
      switch(key_len)
      {
      case 128: cipher  = EVP_aes_128_gcm ();break;
      case 192: cipher  = EVP_aes_192_gcm ();break;
      case 256: cipher  = EVP_aes_256_gcm ();break;
      default:break;
      }
      // Encrypt
      EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
      EVP_EncryptInit (ctx, cipher, KEY, IV);
      EVP_EncryptUpdate (ctx, NULL, &howmany, AAD, aad_len);
      len = 0;
      while(len <= in_len-128)
      {
         EVP_EncryptUpdate (ctx, CIPHERTEXT+len, &howmany, PLAINTEXT+len, 128);
         len+=128;
      }
      EVP_EncryptUpdate (ctx, CIPHERTEXT+len, &howmany, PLAINTEXT+len, in_len - len);
      EVP_EncryptFinal (ctx, TAG, &howmany);
      EVP_CIPHER_CTX_ctrl (ctx, EVP_CTRL_GCM_GET_TAG, 16, TAG);  
      EVP_CIPHER_CTX_free(ctx);
      // Decrypt
      ctx = EVP_CIPHER_CTX_new();      
      EVP_DecryptInit (ctx, cipher, KEY, IV);
      EVP_CIPHER_CTX_ctrl (ctx, EVP_CTRL_GCM_SET_TAG, 16, ref_TAG);
      EVP_DecryptInit (ctx, NULL, KEY, IV);
      EVP_DecryptUpdate (ctx, NULL, &howmany, AAD, aad_len);
      len = 0;
      while(len <= in_len-128)
      {
         EVP_DecryptUpdate (ctx, decrypted_CT+len, &howmany, CIPHERTEXT+len, 128);
         len+=128;
      }
      EVP_DecryptUpdate (ctx, decrypted_CT+len, &howmany, CIPHERTEXT+len, in_len-len);
      dec_success = EVP_DecryptFinal (ctx, dec_TAG, &howmany);
      EVP_CIPHER_CTX_free(ctx);
    

    In the end you should check that the value of dec_success is 1. If you modify the CIPHERTEXT, before you decrypt it, you should get value of 0.

提交回复
热议问题