openssl之EVP系列之5---EVP_Encrypt系列函数详解(二)

本文深入解析 OpenSSL 中的 EVP_Encrypt 系列函数,涵盖 EVP_CIPHER_CTX_set_padding 和 EVP_CIPHER_CTX_set_key_length 等参数设置,以及 EVP_get_cipherbyname 等辅助函数的使用。文章介绍了如何调整 padding 和密钥长度,并讨论了块加密模式和参数设置在ASN1中的转换。
摘要由CSDN通过智能技术生成
openssl之EVP系列之5---EVP_Encrypt系列函数详解(二)
    ---根据openssl doc/crypto/EVP_EncryptInit.pod和doc/ssleay.txt cipher.doc部分翻译和自己的理解写成
    (作者:DragonKing, Mail: wzhah@263.net ,发布于:http://gdwzh.126.com之openssl专业论坛,版本:openssl-0.9.7)
    前面的文章我们介绍了EVP_ENcrypt系列函数的基本部分,本文将介绍他们的一些扩充部分,即一些参数设置和其它辅助的函数,其定义如下(openssl/evp.h):
     int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *x, int padding);
     int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen);
    
     const EVP_CIPHER *EVP_get_cipherbyname(const char *name);
     #define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a))
     #define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a))
     int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a);
    
     #define EVP_CIPHER_nid(e) ((e)->nid)
     #define EVP_CIPHER_block_size(e) ((e)->block_size)
OpenSSL中的EVP(Enveloped Data Processing)是一个高级API,提供了一种简单易用的方式来实现各种密码学算法EVP API支持对称加密、非对称加密、哈希、消息认证码(MAC)和数字签名等功能。 以下是一些使用EVP API的示例: 1. 对称加密 对称加密使用相同的密钥对数据进行加密解密。以下代码展示了如何使用EVP API进行对称加密: ```c EVP_CIPHER_CTX *ctx; ctx = EVP_CIPHER_CTX_new(); EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv); EVP_EncryptUpdate(ctx, out, &outl, in, inl); EVP_EncryptFinal_ex(ctx, out + outl, &tmpl); EVP_CIPHER_CTX_free(ctx); ``` 其中,key是加密密钥,iv是初始化向量,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度,tmpl是临时变量。 2. 非对称加密 非对称加密使用公钥加密数据,私钥解密数据。以下代码展示了如何使用EVP API进行非对称加密: ```c EVP_PKEY *pkey; pkey = EVP_PKEY_new(); EVP_PKEY_set1_RSA(pkey, rsa); EVP_PKEY_CTX *ctx; ctx = EVP_PKEY_CTX_new(pkey, NULL); EVP_PKEY_encrypt_init(ctx); EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING); EVP_PKEY_encrypt(ctx, out, &outl, in, inl); EVP_PKEY_CTX_free(ctx); EVP_PKEY_free(pkey); ``` 其中,rsa是RSA密钥对,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度。 3. 哈希 哈希函数将任意长度的数据映射为固定长度的摘要值。以下代码展示了如何使用EVP API进行哈希: ```c EVP_MD_CTX *ctx; ctx = EVP_MD_CTX_new(); EVP_DigestInit_ex(ctx, EVP_sha256(), NULL); EVP_DigestUpdate(ctx, in, inl); EVP_DigestFinal_ex(ctx, out, &outl); EVP_MD_CTX_free(ctx); ``` 其中,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度。 4. MAC MAC是一种用于验证消息完整性和真实性的技术。以下代码展示了如何使用EVP API进行MAC: ```c EVP_MD_CTX *ctx; ctx = EVP_MD_CTX_new(); EVP_DigestSignInit(ctx, NULL, EVP_sha256(), NULL, pkey); EVP_DigestSignUpdate(ctx, in, inl); EVP_DigestSignFinal(ctx, out, &outl); EVP_MD_CTX_free(ctx); ``` 其中,pkey是私钥,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度。 5. 数字签名 数字签名是一种用于验证消息来源和完整性的技术。以下代码展示了如何使用EVP API进行数字签名: ```c EVP_MD_CTX *ctx; ctx = EVP_MD_CTX_new(); EVP_DigestSignInit(ctx, NULL, EVP_sha256(), NULL, pkey); EVP_DigestSignUpdate(ctx, in, inl); EVP_DigestSignFinal(ctx, NULL, &slen); EVP_SignFinal(ctx, out, &outl, pkey); EVP_MD_CTX_free(ctx); ``` 其中,pkey是私钥,in是输入数据,inl是输入数据长度,out是输出数据,outl是输出数据长度,slen是临时变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值