搜索
您的当前位置:首页Openssl-RSA文档

Openssl-RSA文档

来源:智榕旅游


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

RSA简介

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

准备工作

(1) OpenSSL的配置:

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

(2) 编译器:Visual C++ 6.0

将第(1)步生成的文件加入编译器的目录中

主要数据结构以及函数

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

typedef struct rsa_st RSA;

struct rsa_st

{

const RSA_METHOD *meth; //OpenSSL默认的RSA加解密算法

ENGINE *engine;

BIGNUM *n; //模数n

BIGNUM *e; //公钥指数e,通常为RSA_3(3)或RSA_F4(65537)

BIGNUM *d; //私钥指数d

BIGNUM *p; //大素数p

BIGNUM *q; //大素数q

BIGNUM *dmp1;

BIGNUM *dmq1;

BIGNUM *iqmp;

CRYPTO_EX_DATA ex_data;

int references;

};

2、BIGNUM :OpenSSL定义的数据类型,用来抽象表示一个大数。

3、int RSA_new():生成一个RSA结构,并采用默认的rsa_pkcs1_eay_meth RSA_METHOD算法。成功返回1,失败返回-1。

4、int BN_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、int RSA_size(const RSA *);返回RSA结构中密钥的长度

11、加解密函数:

int RSA_public_encrypt(int flen, const unsigned char *from,

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

int RSA_private_encrypt(int flen, const unsigned char *from,

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

int RSA_public_decrypt(int flen, const unsigned char *from,

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

int RSA_private_decrypt(int flen, const unsigned char *from,

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

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

加密时padding表示填充方式,解密时padding表示去除填充的方式;

12、签名函数

int RSA_sign(int type, const unsigned char *m, unsigned int m_length,

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

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

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

13、验签函数

int RSA_verify(int type, const unsigned char *m, unsigned int m_length,

const unsigned char *sigbuf, unsigned int siglen, RSA *rsa);

示例程序

1、 密钥生成

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

2、 加密&解密

加解密填充模式和解密时的去填充模式是对应的。

填充模式的选择根据RSA加密标准来确定。

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

3、 签名&验签

RSA_sign(nid,data,datalen,signret,&signlen,r)将需要运算的数据放入

X509_ALGOR数据结构并将其DER编码,对编码结果做RSA_PKCS1_PADDING再进行私钥加密。

样例程序并不是真正的签名示例,因为样例只是将数据直接拿来运算。

要进行签名认证的完整操作,首先用sha.h中的算法对数据进行摘要,然后调用RSA_sign来进行签名。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top