openssl evp RSA 加密解密

openssl evp RSA 加密解密

可以直接使用RSA.h 提供的接口

如下测试使用EVP提供的RSA接口

1. EVP提供的RSA 加密解密

  主要接口:

int EVP_PKEY_encrypt_init(EVP_PKEY_CTX *ctx);
int EVP_PKEY_encrypt(EVP_PKEY_CTX *ctx,
                     unsigned char *out, size_t *outlen,
                     const unsigned char *in, size_t inlen);
int EVP_PKEY_decrypt_init(EVP_PKEY_CTX *ctx);
int EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx,
                     unsigned char *out, size_t *outlen,
                     const unsigned char *in, size_t inlen);

   测试代码

   先生成 EVP_KEY 

复制代码
    //生成密钥对
    RSA *r = RSA_new();
    int bits = 512;
    BIGNUM *e = BN_new();
    BN_set_word(e, 65537);
    RSA_generate_key_ex(r, bits, e, NULL);

    EVP_PKEY *key;
    key = EVP_PKEY_new();
    EVP_PKEY_set1_RSA(key, r);
复制代码

  测试加密解密 

复制代码
    //默认使用的是 RSA_PKCS1_PADDING,即这里最大加密块为64-11=53,大量数组需要分组处理
    char *srcStr = "01234567890123456789012345678901234567890123456789123";
    //char *srcStr = "hello world";
    int enclen = 0;
    char encData[1024] = {0};
    char decData[1024] = {0};
    int declen = 0;
    printf("src=%s\n",srcStr);
    
    
    //加密
    EVP_PKEY_CTX *ectx;
    ectx = EVP_PKEY_CTX_new(key, NULL);
    EVP_PKEY_encrypt_init(ectx);
    EVP_PKEY_encrypt(ectx, encData, &enclen, srcStr, strlen(srcStr));
    
    
    //解密
    EVP_PKEY_CTX *dctx;
    dctx = EVP_PKEY_CTX_new(key, NULL);
    EVP_PKEY_decrypt_init(dctx);
    EVP_PKEY_decrypt(dctx, decData, &declen, encData, enclen);
    printf("dec=%s\n",decData);

    EVP_PKEY_CTX_free(ectx);
    EVP_PKEY_CTX_free(dctx);

    
    EVP_PKEY_free(key);
    BN_free(e);
    RSA_free(r);
复制代码

 执行结果:

src=01234567890123456789012345678901234567890123456789123
dec=01234567890123456789012345678901234567890123456789123
Program ended with exit code: 0
View Code

 

 上述测试也是RSA的分组加密,如果加密数据比较长的时候,需要多次调用;

 补位方式:RSA_PKCS1_PADDING 则,最大分组真为RSA_size(r) -11 

 

 2. 另外evp提供的签名与验签接口还有

复制代码
int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx);
int EVP_PKEY_sign(EVP_PKEY_CTX *ctx,
                  unsigned char *sig, size_t *siglen,
                  const unsigned char *tbs, size_t tbslen);
int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx);
int EVP_PKEY_verify(EVP_PKEY_CTX *ctx,
                    const unsigned char *sig, size_t siglen,
                    const unsigned char *tbs, size_t tbslen);
int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX *ctx);
int EVP_PKEY_verify_recover(EVP_PKEY_CTX *ctx,
                            unsigned char *rout, size_t *routlen,
                            const unsigned char *sig, size_t siglen);
复制代码

 

3.  关于数字信封,签名信封,打开信封接口

复制代码
__owur int EVP_OpenInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
                        const unsigned char *ek, int ekl,
                        const unsigned char *iv, EVP_PKEY *priv);
__owur int EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);

__owur int EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
                        unsigned char **ek, int *ekl, unsigned char *iv,
                        EVP_PKEY **pubk, int npubk);
__owur int EVP_SealFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);
复制代码

 

 

参考:https://www.openssl.org/docs/man1.1.0/crypto/EVP_PKEY_encrypt.html

https://www.openssl.org/docs/man1.1.0/crypto/EVP_PKEY_verify.html

posted @   cocoajin  阅读(9845)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2014-12-05 iOS设置app应用程序文件共享
点击右上角即可分享
微信分享提示