openssl编程-aead

本文详细介绍了如何使用OpenSSL库进行AEAD(Authenticated Encryption with Additional Data)算法的编程,包括接口使用示例和实际协议数据的验证过程。
摘要由CSDN通过智能技术生成

一、openssl aead算法接口使用示例:

//gcc -g -lssl aead_test.c -lcrypto -L /usr/local/lib/
#include <string.h>
#include <openssl/evp.h>

#define IV_SIZE 8
#define KEY_SIZE 24
#define INPUT_SIZE 100

void print_hexdata(unsigned char *b, int len, char *title) 
{
	int i = 0, c = 0;
	printf("===================================== %s =====================================\n", title);
	for (; i<len; i++) {
		printf("0x%02x ", b[i]);
		c++;
		if (!(c%16))
			printf("\n");
	}
	printf("\n");
}

int gcm_encrypt(unsigned char *plaintext, int plaintext_len,
                unsigned char *aad, int aad_len,
                unsigned char *key,
                unsigned char *iv, int iv_len,
                unsigned char *ciphertext,
                unsigned char *tag)
{
    EVP_CIPHER_CTX *ctx;

    int len;

    int ciphertext_len;


    /* Create and initialise the context */
    if(!(ctx = EVP_CIPHER_CTX_new()))
        return -1;

    /* Initialise the encryption operation. */
    if(1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL))
        return -1;

    /*
     * Set IV length if default 12 bytes (96 bits) is not appropriate
     */
    if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, iv_len, NULL))
        return -1;

    /* Initialise key and IV */
    if(1 != EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv))
        return -1;

    /*
     * Provide any AAD data. This can be called zero or more times as
     * required
     */
    if(1 != EVP_EncryptUpdate(ctx, NULL, &len, aad, aad_len))
        return -1;
	printf("len:%d\n", len);
    /*
     * Provide the message to be encrypted, and obtain the encrypted output.
     * EVP_EncryptUpdate can be called multiple times if necessary
     */
    if(1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
        return -1;
    ciphertext_len = len;
	printf("len:%d\n", len);

    /*
     * Finalise the encryption. Normally ciphertext bytes may be written at
     * this stage, but this does not occur in GCM mode
     */
    if(1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))
        return -1;
    ciphertext_len += len;
	printf("len:%d\n", len);

    /* Get the tag */
    if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag))
        return -1;

    /* Clean up */
    EVP_CIPHER_CTX_free(ctx);

    retur
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenSSL编程是一种基于开源的密码学库的编程,为了便于开发者理解和使用OpenSSL,官方提供了一份源码分析的.chm文档。 首先,OpenSSL是一个功能强大的密码学库,提供了各种密码学算法的实现,如对称加密算法(如AES)、非对称加密算法(如RSA)、哈希算法(如MD5)、数字签名等。通过使用OpenSSL库,开发者可以在自己的应用程序中轻松地实现安全性和保密性。 然而,OpenSSL庞大的代码库对于新手来说可能是一个挑战。为了帮助开发者更好地理解OpenSSL的功能和代码结构,官方提供了一份源码分析的.chm文档。 该文档包含了OpenSSL库的最新源代码的详细分析和说明。通过阅读文档,开发者可以逐步了解库的结构和主要功能模块,如SSL/TLS协议库、公钥加密算法库、哈希算法库等。文档还提供了对每个函数的详细解释和用法示例,以及示例代码,帮助开发者更好地理解和应用OpenSSL。 源码分析的.chm文档可以被阅读器打开,并提供了方便的导航和搜索功能。通过使用该文档,开发者可以更高效地学习和使用OpenSSL编程,快速解决问题和实现自己的密码学需求。 总结来说,OpenSSL编程是一种使用开源密码学库的编程技术,官方提供了源码分析的.chm文档,帮助开发者理解和使用OpenSSL库的功能和代码结构。通过阅读该文档,开发者可以更好地掌握OpenSSL编程,并应用于实际的安全性和保密性需求中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值