openssl之EVP函数

EVP

EVP函数提供一个高层次的接口OpenSSL加密功能。

他们提供以下功能:

  • 一个一致的接口,不管底层算法或模式
  • 支持众多的算法
  • 加密/解密使用对称和非对称算法
  • 签名/验证
  • 导出密钥
  • 安全散列函数
  • 消息认证码
  • 支持独立的加密引擎

使用evp_pkeys编辑]

evp_pkey对象用于存储公钥和私钥(可选),以及相关的算法和参数。他们也能够存储对称MAC密钥。

支持以下evp_pkey类型:

  • evp_pkey_ec:椭圆曲线密钥(为ECDSA和ECDH)-支持签名/验证操作,和密钥推导
  • evp_pkey_rsa:支持RSA签名/验证和加密/解密
  • evp_pkey_dh:Diffie Hellman -密钥推导
  • evp_pkey_dsa:DSA密钥的签名/验证
  • evp_pkey_hmac:生成消息认证码HMAC密钥
  • evp_pkey_cmac:一个生成消息认证码的CMAC的关键

Note:DSA处理SSL / TLS在OpenSSL密码套件改变1.1.0。详情见DSA与OpenSSL—1.1在邮件列表

参考Manual:EVP PKEY new(3)这页的手册资料去生成evp_pkey对象,并且参考Manual:EVP PKEY set1 RSA(3)这页手册的资料去了解如何初始化一个evp_pkey对象。

参考EVP Key and Parameter Generation学习有关生成新密钥和相关参数的信息。

使用算法和工作模式

密码和消息摘要算法需要分别确定一个唯一的evp_cipher和evp_md对象。你不能创造自己,而是使用一个内建的函数返回一个你希望使用特定的算法。参考evp.h文件的密码和消息摘要的全部声明。

evp.h摘取一些evp_cipher函数,如下所示:

const EVP_CIPHER *EVP_aes_128_ctr(void);
const EVP_CIPHER *EVP_aes_128_ccm(void);
const EVP_CIPHER *EVP_aes_128_gcm(void);
const EVP_CIPHER *EVP_aes_128_xts(void);
const EVP_CIPHER *EVP_aes_192_ecb(void);
const EVP_CIPHER *EVP_aes_192_cbc(void);

这些密码都是AES(Advanced Encryption Standard)算法的变形。有两种不同的密钥长度,分别为128位的密钥和192位的密钥。也有各种不同的加密模式,即CTRCCMGCMXTS,ECB和CBC。并不是所有的算法支持所有的模式,所以你想用特定组合的时候,应该去考察evp.h

下面从evp.h摘取一些示例消息摘要函数,如下所示:

const EVP_MD *EVP_md2(void);
const EVP_MD *EVP_md4(void);
const EVP_MD *EVP_md5(void);
const EVP_MD *EVP_sha1(void);
const EVP_MD *EVP_sha224(void);
const EVP_MD *EVP_sha256(void);
const EVP_MD *EVP_sha384(void);
const EVP_MD *EVP_sha512(void);

从这些函数返回的对象是内置的,使用后不用被释放

加密操作

下面的加密操作是可能的。参考相关的页面详情

参见


原文地址: EVP
    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、付费专栏及课程。

    余额充值