目录
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 - 11from - [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] 密文数据长度,一般固定为秘钥位数 / 8from - [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 - 11from - [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] 密文数据长度,一般固定为秘钥位数 / 8from - [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