首页 >>  正文

OpenSSL之RSA用法

来源:www.zuowenzhai.com    作者:编辑   日期:2024-06-02
RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥,“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制 。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK 。
正是基于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要 。

RSA算法是一个广泛使用的公钥算法。其密钥包括公钥和私钥。它能用于数字签名、身份认证以及密钥交换。RSA密钥长度一般使用1024位或者更高。RSA密钥信息主要包括:
n:模数
e:公钥指数
d:私钥指数
p:最初的大素数
q:最初的大素数
其中,公钥为n和e;私钥为n和d。

本文假设你已经安装好了OpenSSL,并且持有一份1.1.1的源码。
RSA相关的头文件在rsa.h中、源文件在crypto/rsa目录中。

这个结构定义了RSA内部数据信息。主要字段含义:
version —— 版本。
meth —— RSA运算抽象方法集合。
n,e,d,p,q,dmp1,dmq1,iqmp —— 密钥相关的大数。

这个结构定义了RSA内部各种运算抽象方法集合。主要字段含义:
name —— 名称描述。
rsa_pub_enc —— 公钥加密方法。
rsa_pub_dec —— 公钥解密方法。
rsa_priv_enc —— 私钥加密方法。
rsa_priv_dec —— 公钥解密方法。
rsa_sign —— 签名方法。
rsa_verify —— 验签方法。
rsa_keygen —— 生成密钥对方法。

在1.1.1中,大多数的数据结构已经不再向使用者开放,从封装的角度来看,这是更合理的。如果你在头文件中找不到结构定义,不妨去源码中搜一搜。

RSA *RSA_new(void);
生成一个RSA密钥结构,采用默认的rsa_pkcs1_ossl_meth方法。

void RSA_free(RSA *r);
释放RSA结构。

RSA *RSA_generate_key(int bits, unsigned long e, void (*callback) (int, int, void *), void *cb_arg);
生成RSA密钥(旧版本)。
bits为密钥位数,e为公钥指数。
callback为密钥生成过程中的干预回调函数,通常传入NULL。cb_arg为回调参数。
成功返回RSA指针,失败返回NULL。

int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
生成RSA密钥(新版本)。
rsa为RSA对象指针。bits为密钥位置,e为公钥指数的大数形式指针。cb为干预回调函数,通常传入NULL。
成功返回1,失败返回0。
关于公钥指数e,主要有两个取值:
# define RSA_3 0x3L
# define RSA_F4 0x10001L

RSA *RSAPublicKey_dup(RSA *rsa);
复制RSA公钥部分。
成功返回RSA指针,失败返回NULL。

RSA *RSAPrivateKey_dup(RSA *rsa);
复制RSA私钥部分。
成功返回RSA指针,失败返回NULL。

int RSA_bits(const RSA *rsa);
获取RSA密钥位数。
int RSA_size(const RSA *rsa);
获取RSA密钥长度。

int RSA_check_key(const RSA *);
int RSA_check_key_ex(const RSA *, BN_GENCB *cb);
检查RSA的有效性,必须为完整的密钥对。
成功返回1,失败返回0。

int RSA_print(BIO *bp, const RSA *r, int offset);
int RSA_print_fp(FILE *fp, const RSA *r, int offset);
将RSA信息输出到bp/fp中,off为输出信息在bp/fp中的偏移量,比如是屏幕bp/fp,则表示打印信息的位置离左边屏幕边缘的距离。

int RSA_public_encrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
RSA公钥加密。
成功返回密文的长度,失败返回-1。

int RSA_public_decrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
RSA公钥解密。
成功返回明文的长度,失败返回-1。

int RSA_private_encrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
RSA私钥加密。
成功返回密文的长度,失败返回-1。

int RSA_private_decrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
RSA私钥解密。
成功返回明文的长度,失败返回-1。

关于padding填充方式,取值:

其中PKCS1填充大小为11字节,所以加密明文长度必须不大于(密钥大小-11字节)。
# define RSA_PKCS1_PADDING_SIZE 11

int RSA_sign(int type, const unsigned char *m, unsigned int m_length,
unsigned char *sigret, unsigned int *siglen, RSA *rsa);
对数据m生成RSA签名,生成的签名长度与key的长度相同,如512位密钥生成64字节签名。
type指定摘要算法的NID,如NID_sha1。
成功返回1,失败返回0。

int RSA_verify(int type, const unsigned char *m, unsigned int m_length,
const unsigned char *sigbuf, unsigned int siglen, RSA *rsa);
对数据m验证RSA签名。
type指定摘要算法的NID,如NID_sha1。
成功返回1,失败返回0。

以下函数在x509.h中定义:

int i2d_RSAPrivateKey_bio(BIO *bp, RSA *rsa)
{
return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
}
将RSA公钥转换为DER编码,并写入到bp抽象IO中。
成功返回1,失败返回0。

RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa)
{
return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPrivateKey), bp, rsa);
}
从bp抽象IO中读取DER编码,并转换为rsa结构私钥。
成功返回有效指定,失败返回NULL。

int i2d_RSAPublicKey_bio(BIO *bp, RSA *rsa)
{
return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
}
将RSA公钥转换为DER编码,并写入到bp抽象IO中。
成功返回1,失败返回0。

RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa)
{
return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
}
从bp抽象IO中读取DER编码,并转换为rsa结构公钥。
成功返回有效指定,失败返回NULL。

下面这个例子演示了RSA密钥对的生成、公私钥的复制、公钥加密和私钥解密的用法。

输出:

下面这个例子演示了公私钥的分开保存、读取,以及使用公私钥加解密。

输出:
RSA_generate_key_ex() ret:1
i2d_RSAPrivateKey_bio() ret:1
i2d_RSAPublicKey_bio() ret:1
copy' private key size:64
copy' public key size:64
RSA_public_encrypt() ret:64
RSA_private_decrypt() ret:10
text:[1234567890]

下面这个例子演示了签名的生成和验证操作。

输出:
ret:1
RSA_sign() ret:1
sign 64
4ec0af099c49646b72fda88a4fb11e8deb3898da9c3f611a5f25f05d9d005631858239bbb732cd5060dbc975363fc1b9cdfdc5a04554115a916f06f98163189f
RSA_verify() ret:1


19747898624如何使用openssl生成RSA公钥和私钥对 / 蓝讯
羊修珍答:在Windows环境下,打开OPENSSL安装目录bin文件下面的openssl.exe。在Linux环境下,直接在终端中运行openssl。1)生成RSA私钥:genrsa -out rsa_private_key.pem 1024 该命令会生成1024位的私钥,生成成功的界面如下:如何使用openssl生成RSA公钥和私钥对 此时我们就可以在当前路径下看到rsa_private_key.pem文...

19747898624openssl rsa怎么通过私钥生成公钥短
羊修珍答:(1)下载OpenSSL 下载OpenSSL后,按照提示安装OpenSSL。(2)打开OpenSSL文件夹下的bin目录,点击openssl.exe,打开命令窗口。(3)开始生成RSA的私钥 输入命令:genrsa -out rsa_private_key.pem 1024 genrsa -out rsa_private_key.pem 10241 此时在OpenSSL的bin目录下生成了一个rsa_private_key.pem,这就是...

19747898624如何利用OpenSSL库进行RSA加密和解密
羊修珍答:include<stdio.h>#include<stdlib.h>#include<string.h>#include<openssl/rsa.h>#include<openssl/engine.h>int main(int argc, char* argv[]){ printf("openssl_test begin\n"); RSA* rsa=NULL; char originstr[]="hello\n"; //这是我们需要加密的原始数据 //allocate RSA...

19747898624如何用C语言来使用openssl rsa进行公钥加密,已有公钥和明文
羊修珍答:2. 如果所加密数据长度大于245字节,请分多次加密,后将密文按顺序存储;解密时,每次读取256字节,进行解密,将解密后的数据依次按顺序存储,即可还原原始数据.include <stdio.h> include <stdlib.h> include <string.h> include <errno.h> include <openssl/rsa.h> include <openssl/pem.h> include <...

19747898624密码学:RSA(一)
羊修珍答:RSA 由于 m 要小于 n ,所以每次加密数据小,需要分段加密,效率不高。一般情况下用来加密大数据对称加密的 key 。由于 Mac 系统内置 OpenSSL (开源加密库),我们可以直接在终端上使用命令进行 RSA 操作。 OpenSSL 中 RSA 算法常用指令主要有三个:生成RSA私钥,密钥长度为1024bit e:65337(publicExponent...

19747898624OpenSSL的RSA算法,怎么自己设置N 和 D
羊修珍答:php/** * 使用openssl实现非对称加密 * @since 2010-07-08 */class Rsa{ /** * private key */ private $_privKey; /** * public key */ private $_pubKey; /** * the keys saving path */ private $_keyPath; /** * the construtor,...

19747898624RSA公钥和私钥的生成以及PKCS#1与PKCE#8格式的转换
羊修珍答:首先需要电脑安装openssl,这个搜一下安装就行了。然后运行命令行输入命令:回车,可以看到命令行执行的文件夹多了一个rsa_private_key.pem私钥文件 然后执行生成公钥命令:回车,可以看到命令行执行的文件夹多了一个rsa_public_key.pem公钥文件 PKCS#1格式私钥转换成PKCS#8格式私钥(一般JAVA用的都是PKCS#...

19747898624rsa公钥私钥如何生成rsa公钥私钥生成工具
羊修珍答:最终,将生成rsacert.csr文件。使用第一个生成的私钥rsa_private_key.pem和rsacert.csr证书请求文件生成数字证书rsacert.crt。使用x509工具构建您自己的CA。X509无法构建证书请求文件,所以只能由opensslreq生成,然后由x509签名,也可以用来签名别人的证书请求,也就是给别人颁发证书。知识点:终端会提示设置...

19747898624求用OpenSSL做的RSA文件加密程序实例,VC++6.0的,各位大侠帮帮忙,急用呀...
羊修珍答:include <openssl/rsa.h> include <openssl/sha.h> int main(){ RSA *r;int bits=1024,ret,len,flen,padding,i;unsigned long e=RSA_3;BIGNUM *bne;unsigned char*key,*p;BIO *b;unsigned charfrom[500],to[500],out[500];bne=BN_new();ret=BN_set_word(bne,e);r...

19747898624对于加密的总结(AES,RSA)
羊修珍答:rsa使用私钥对信息加密来做签名,使用公钥解密去验签。 openssl相关函数:注意:两个函数中的m,是原串hash后的值,type表示生成m的算法,例如NID_sha256表示使用sha256对原串进行的hash,返回1为签名成功或者验签成功,-1位为失败。再次敲黑板!! 所以如果第三方说使用rsa验签,要让对方告知他们的...


(编辑:郗茅聂)
联系方式:
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图
@ 作文摘要网