Openssl-RSA文档

更新时间:2024-01-24 05:04:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于OpenSSL库实现RSA加解密、签名认证

RSA简介

RSA是一种公钥算法,可以用来实现数字签名,身份认证,以及密钥交换。这里主要讨论数字签名的过程。 准备工作

(1)OpenSSL的配置:

安装,编译OpenSSL文件,生成静态库文件(也可以选择生成动态链接库,下文所使用的均为静态调用)。 (2)编译器:Visual C++ 6.0

将第(1)步生成的文件加入编译器的目录中 主要数据结构以及函数

1、RSA数据结构,其中包含公私钥信息,如果只有n和e则表明是公钥。 typedefstructrsa_st RSA; structrsa_st {

const RSA_METHOD *meth; //OpenSSL默认的RSA加解密算法 ENGINE *engine; BIGNUM *n; BIGNUM *e; BIGNUM *d; BIGNUM *p; BIGNUM *q;

//模数n

//公钥指数e,通常为RSA_3(3)或RSA_F4(65537) //私钥指数d //大素数p //大素数q

BIGNUM *dmp1; BIGNUM *dmq1; BIGNUM *iqmp;

CRYPTO_EX_DATA ex_data; int references; };

2、BIGNUM:OpenSSL定义的数据类型,用来抽象表示一个大数。 3、intRSA_new():生成一个RSA结构,并采用默认的rsa_pkcs1_eay_meth RSA_METHOD算法。成功返回1,失败返回-1。

4、intBN_new();生成一个BIGNUM结构,成功返回1,失败返回-1。 5、int BN_set_word(BIGNUM *a, BN_ULONG w);将BIGNUM结构的值置为unsigned long int类型整数的值。成功返回1,失败返回-1。

6、int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);

参数分别为:RSA结构,bits为生成密钥的长度,公开指数e,一般为NULL。 作用:根据密钥长度和公钥指数生成密钥。 7、RSA_FREE();释放RSA结构。

8、int RSA_print_fp(FILE *fp, const RSA *r,int offset); 参数分别为;文件指针*fp,RSA结构,打印偏移量。 作用:将生成的密钥输出到文件。

9、int RSA_check_key(const RSA *);检查RSA结构中n,e,d,p,q是否满足条件。满足返回1,否则返回-1;

10、intRSA_size(const RSA *);返回RSA结构中密钥的长度 11、加解密函数:

int RSA_public_encrypt(intflen, const unsigned char *from,

unsigned char *to, RSA *rsa,int padding);

int RSA_private_encrypt(intflen, const unsigned char *from,

unsigned char *to, RSA *rsa,int padding);

int RSA_public_decrypt(intflen, const unsigned char *from,

unsigned char *to, RSA *rsa,int padding);

int RSA_private_decrypt(intflen, const unsigned char *from,

unsigned char *to, RSA *rsa,int padding);

flen表示加解密的数据长度;*from为加密前的信息;*to为加密后的信息;*out为解密后的信息;

加密时padding表示填充方式,解密时padding表示去除填充的方式; 12、签名函数

intRSA_sign(int type, const unsigned char *m, unsigned intm_length,

unsigned char *sigret, unsigned int *siglen, RSA *rsa);

参数:type为摘要数据使用的摘要算法,

作用:将需要运算的数据放入X509_ALGOR数据结构并将其DER编码,对编码结果做RSA_PKCS1_PADDING再进行私钥加密。

13、验签函数

intRSA_verify(int type, const unsigned char *m, unsigned intm_length,

const unsigned char *sigbuf, unsigned intsiglen, RSA *rsa);

示例程序

1、密钥生成

程序只给出了生成密钥的步骤,对于密钥如何存储和分配并未涉及。 2、加密&解密

加解密填充模式和解密时的去填充模式是对应的。 填充模式的选择根据RSA加密标准来确定。

程序中只是演示对一个分组加解密的操作,实际使用应对明文进行分块然后在加密。 3、签名&验签

RSA_sign(nid,data,datalen,signret,&signlen,r)将需要运算的数据放入X509_ALGOR数据结构并将其DER编码,对编码结果做RSA_PKCS1_PADDING再进行私钥加密。

样例程序并不是真正的签名示例,因为样例只是将数据直接拿来运算。 要进行签名认证的完整操作,首先用sha.h中的算法对数据进行摘要,然后调用RSA_sign来进行签名。

本文来源:https://www.bwwdw.com/article/363o.html

Top