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位的密钥。也有各种不同的加密模式,即CTR,CCM,GCM,XTS,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);
从这些函数返回的对象是内置的,使用后不用被释放
加密操作
下面的加密操作是可能的。参考相关的页面详情