文章目录
🌺概要
#include <openssl/evp.h>
int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
unsigned char **ek, int *ekl, unsigned char *iv,
EVP_PKEY **pubk, int npubk);
int EVP_SealUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
int *outl, unsigned char *in, int inl);
int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);
🌻描述
EVP信封例程是信封加密的高级接口。他们生成一个随机密钥和IV(如果需要),然后通过使用公钥加密来“封装”它。然后可以使用这个密钥对数据进行加密。
EVP_SealInit()使用随机密钥初始化密码上下文ctx,使用cipher类型进行加密,IV. type通常由EVP_aes_256_cbc()等函数提供。秘钥使用一个或多个公钥加密,这允许使用任何相应的私钥解密相同的加密数据。ek是一个缓冲区数组,其中公钥加密的密钥将被写入,每个缓冲区必须包含足够的空间来存放相应的加密密钥:即ek[i]必须有空间存放EVP_PKEY_get_size(pubk[i])字节。每个加密密钥的实际大小被写入数组ekl。pubk是一组npubk公钥。
iv参数是一个缓冲区,生成的iv被写入其中。它必须包含足够的空间来容纳相应密码的IV,这由(例如)EVP_CIPHER_get_iv_length(type)确定。
如果密码不需要IV,则IV参数被忽略,可以为NULL。
EVP_SealUpdate()和EVP_SealFinal()具有与EVP_EncryptUpdate()和EVP_EncryptFinal()例程完全相同的属性,如在EVP_EncryptInit手册页面中所述。
🌹返回值
EVP_SealInit()在出错时返回0,成功返回npubk。
EVP_SealUpdate()和EVP_SealFinal()成功返回1,失败返回0。
🌷注意
因为会生成一个随机密钥,所以在调用EVP_SealInit()时,必须植入随机数生成器。如果OpenSSL CSPRNG的自动播种或重新播种因外部环境而失败(请参见rand),操作会失败。
公钥必须是RSA,因为它是唯一支持密钥传输的OpenSSL公钥算法。
信封加密是对大量数据使用公钥加密的常用方法,这是因为公钥加密很慢,而对称加密很快。因此,对称加密用于批量加密,而所用的小随机对称密钥使用公钥加密来传输。
可以像调用EVP_EncryptInit()一样调用EVP_SealInit()两次。第一次调用应该把npubk设置为0,并且(在设置任何密码参数之后)应该使用类型设置为空。