0
点赞
收藏
分享

微信扫一扫

《OpenSSL3.0学习之二十六 EVP_SealXXX》

诗与泡面 2022-03-11 阅读 40

文章目录

🌺概要

 #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])字节。每个加密密钥的实际大小被写入数组eklpubk是一组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,并且(在设置任何密码参数之后)应该使用类型设置为空。

举报

相关推荐

0 条评论