非对称加密算法RSA的OpenSSL代码实现Demo

目录

1 RSA简介

1.1 RSA算法介绍

1.2 RSA算法的速度与安全性

1.3 RSA存储格式

1.3.1 PKCS#1 标准主要用于 RSA密钥,其RSA公钥和RSA私钥PEM格式    

1.3.2 PKCS#8 标准定义了一个密钥格式的通用方案,其公钥和私钥PEM格式

2 OpenSSL代码实现

2.1 生成密钥对

 2.2 公钥加密-私钥解密

 2.3 私钥加密-公钥解密

3 演示Demo

3.1 开发环境

3.2 功能介绍

3.3 下载地址


1 RSA简介

1.1 RSA算法介绍

        RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

        RSA加密算法是一种可逆的非对称加密算法,即RSA加密时候用的密钥(公钥)和RSA解密时用的密钥(私钥)不是同一把。基本原理是将两个很大的质数相乘很容易得到乘积,但是该乘积分解质因数却很困难。RSA算法被广泛的用于加密解密和RSA签名/验证等领域。

1.2 RSA算法的速度与安全性

        比起AES等其它对称算法来说,RSA运算更为复杂,所以要慢得多。

        从安全角度来讲,一般建议RSA密钥长度至少为2048位。世界上还没有任何可靠的攻击RSA算法的方式,如果密钥足够长或者没有密钥,想要RSA解密或者破解RSA解密基本是不可能的。RSA从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。

1.3 RSA存储格式

        DER是RSA密钥的二进制格式,PEM是DER转码为Base64的字符格式,由于DER是二进制格式,不便于阅读和理解。一般而言,密钥都是通过PEM的格式进行存储的。

1.3.1 PKCS#1 标准主要用于 RSA密钥,其RSA公钥和RSA私钥PEM格式    

// PKCS#1公钥格式
-----BEGIN RSA PUBLIC KEY-----
BASE64 DATA...
-----END RSA PUBLIC KEY-----
// PKCS#1私钥格式
-----BEGIN RSA PRIVATE KEY-----
BASE64 DATA...
-----END RSA PRIVATE KEY-----

1.3.2 PKCS#8 标准定义了一个密钥格式的通用方案,其公钥私钥PEM格式

// PKCS#8公钥格式
-----BEGIN PUBLIC KEY-----
BASE64 DATA...
-----END PUBLIC KEY-----
// PKCS#8私钥格式
-----BEGIN PRIVATE KEY-----
BASE64 DATA...
-----END PRIVATE KEY-----

        经过对比,我们可以明显看到,PKCS #8 格式是没有rsa字样的,因为PKCS#8是一个通用型的密钥格式方案,它不仅为RSA算法所使用,同样也可以被其它加密解密算法所使用。

2 OpenSSL代码实现

2.1 生成密钥对

#include <openssl/rsa.h>
/*
    功能:生成密钥对
    参数:rsa  - [out] 这是一个指向 RSA 结构的指针,该结构将用于存储生成的 RSA 密钥对。
                     在调用此函数之前,您应该使用 RSA_new() 初始化此结构。
         bits - [in]  这指定了 RSA 密钥的长度(以位为单位)。
                      常见的值是 1024、2048、4096 等。
                      较长的密钥提供更高级别的安全性,但也需要更多的计算资源。
         e    - [in]  这是一个指向 BIGNUM 结构的指针,该结构包含 RSA 公钥的指数 e。
                      在许多情况下,e 被设置为 65537(即 0x10001),
                      因为它是一个常见的选择,并且在加密和解密过程中提供了良好的性能。
                      如果您将此参数设置为 NULL,则 OpenSSL 会自动使用默认值(通常是 65537)。
        cb    - [out] 这是一个指向 BN_GENCB 结构的指针,该结构可以用于为密钥生成过程提供回调功能。
                      这允许您在密钥生成过程中执行某些操作,例如更新进度条或执行其他任务。
                      如果您不需要此功能,可以将此参数设置为 NULL。
    返回:如果密钥生成成功,则返回 1。如果发生错误,则返回 0,并设置相应的错误代码(可以使用 OpenSSL 的错误处理函数进行检查)。
*/
int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);

 2.2 公钥加密-私钥解密

#include <openssl/rsa.h>
/*
    功能:公钥加密
    参数:flen    - [in] 明文数据长度字节数,若padding参数使用RSA_PKCS1_PADDING方式,则该值最大为所使用密钥的位数 / 8 - 11
         from    - [in] 明文数据
         to      - [out]存放生成的密文数据,该空间大小应该为秘钥位数 / 8,保证可以存放的下
         rsa     - [in] 公钥
         padding - [in] 填充方式
    返回:加密后数据的长度
*/
int RSA_public_encrypt(int flen, const unsigned char *from,
                       unsigned char *to, RSA *rsa, int padding);

/*
    功能:私钥解密
    参数:flen    - [in] 密文数据长度,一般固定为秘钥位数 / 8
         from    - [in] 密文数据
         to      - [out]存放解密后的明文数据,该空间大小应该为秘钥位数 / 8,保证可以存放的下
         rsa     - [in] 私钥
         padding - [in] 填充方式
    返回:解密后数据的长度
*/                       
int RSA_private_decrypt(int flen, const unsigned char *from,
                        unsigned char *to, RSA *rsa, int padding);                       

 2.3 私钥加密-公钥解密

 #include <openssl/rsa.h>
 /*
    功能:私钥加密
    参数:flen    - [in] 明文数据长度字节数,若padding参数使用RSA_PKCS1_PADDING方式,则该值最大为所使用密钥的位数 / 8 - 11
         from    - [in] 明文数据
         to      - [out]存放生成的密文数据,该空间大小应该为秘钥位数 / 8,保证可以存放的下
         rsa     - [in] 私钥
         padding - [in] 填充方式
    返回:加密后数据的长度
*/
int RSA_private_encrypt(int flen, const unsigned char *from,
                        unsigned char *to, RSA *rsa, int padding);

/*
    功能:公钥解密
    参数:flen    - [in] 密文数据长度,一般固定为秘钥位数 / 8
         from    - [in] 密文数据
         to      - [out]存放解密后的明文数据,该空间大小应该为秘钥位数 / 8,保证可以存放的下
         rsa     - [in] 公钥
         padding - [in] 填充方式
    返回:解密后数据的长度
*/
int RSA_public_decrypt(int flen, const unsigned char *from,
                       unsigned char *to, RSA *rsa, int padding);

3 演示Demo

3.1 开发环境

  • OpenSSL 1.0.2l

  • Visual Studio 2015

  • Windows 10 Pro x64

3.2 功能介绍

        演示程序主界面如下图所示,包括密钥长度设置,公私钥/输入/输出数据格式设置以及公钥加密、私钥解密、私钥加密、公钥解密等功能。

        支持String(文本)、Hex(十六进制)、Base64等多种数据格式。

3.3 下载地址

        开发环境:

  • Windows 10 pro x64

  • Visual Studio 2015

  • OpenSSL 1.0.2l

        下载地址: 非对称加密算法RSA的OpenSSL代码实现Demo

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值