17.openssl编程——RSA介绍

17.1  RSA介绍
RSA算法是一个广泛使用的公钥算法。器密钥包括公钥和私钥。他能用于数字签名、身份认证以及密钥交换。RSA密钥信息主要包括:
* n:模数
* e:公钥指数
* d:私钥指数
* p:最初的大素数
* q:最初的大素数
* dmp1:e * dmp1 = 1 (mod(p-1))
* dmp1:e * dmp1 = 1 (mod(q -1))
* iqmp:q * iqmp = 1 (mod p)
其中,公钥为n和e;私钥为n和d。在实际应用中,公钥加密一般用来协商密钥;私钥加密一般用来签名。
 
17.2 openssl的RSA实现
openssl的实现RSA实现源码在crypto/rsa目录下。它实现了RSA PKCS1标准。主要源码如下:
a.rsa.h
功能:定义RSA数据结构以及RSA_METHOD,定义了RSA的各种函数
b.rsa_asn1.c
功能:实现了RSA密钥的DER编码和解码,包括公钥和私钥
c.rsa_chk.c
功能:RSA密钥检查
d.rsa_eay.c
功能:openssl实现的一种RSA_METHOD,作为默认的一种RSA计算实现方式。此文件实现rsa_sign\rsa_verify和rsa_keygen回调函数。
e.rsa_gen.c
功能:RSA密钥生成,如果RSA_METHOD中的rsa_ekygen回调函数不为空,则调用它,否则调用器内部实现。
f.rsa_lib.c
功能:主要实现了RSA运算的四个函数(公钥私钥,加密解密),他们都调用了RSA_METHOD中相应回调函数。
g.rsa_none.c
功能:实现了一种填充和去填充。
h.rsa_null.c
功能:实现一种空的RSA_METHOD.
i.rsa_oaep.c
功能:实现了oaep填充与去填充
j.rsa_pk1.
功能:实现了pkcs1填充与去填充
k.rsa_sign.c
功能:实现了RSA的签名和验签
l.rsa_ssl.c
功能:实现了ssl填充
m.rsa_x931.c
功能:实现了一种填充和去填充
 
17.3 RSA签名和验证过程
RSA签名过程如下:
a.对用户数据进行摘要
b.构造X509_SIG结构并DER编码,其中包括了摘要算法以及摘要结果
c.对a的结果进行填充,填满RSA密钥长度字节数。比如1024位RSA密钥必要填满128字节。具体的填充方式有用户指定。
d.对b的结果用RSA私钥加密。
RSA_eay_private_encrypt函数实现了c和d过程
 
RSA验签过程是伤处过程的逆过程,如下:
a.对数据用RSA公钥解密,得到签名过程中b过程
b.去除a结果的填充
c.从b的结果中道非道算法,以及摘要结果
d.将原数据根据c中得到摘要算法进行摘要计算
e.比较d与签名过程中a的结果。
RAS_eay_public_decrypt实现了a和b过程。
 
17.4 数据结构
RSA主要数据结构定义在crypto/rsa/rsa.h
 
struct rsa_meth_st {
char *name;
int (*rsa_pub_enc) (int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int (*rsa_pub_dec) (int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int (*rsa_priv_enc) (int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int (*rsa_priv_dec) (int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int (*rsa_mod_exp) (BIGNUM *r0, BIGNUM *a, const BIGNUM *p,
const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
int (*init) (RSA *rsa);
int (*finish) (RSA *rsa);
int flags;
char *app_data;
int (*rsa_sign) (int type,
const unsigned char *m, unsigned int m_length,
unsigned char *sigret, unsigned int *siglen,
const RSA *rsa);
int (*rsa_verify) (int dytpe, const unsigned char *m,
unsigned int m_length, const unsigned char *sigbuf,
unsigned int siglen, const RSA *rsa);
int (*rsa_keygen) (RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
int (*rsa_multi_prime_keygen) (RSA *rsa, int bits, int primes,
BIGNUM *e, BN_GENCB *cb);
}
 
name:RSA_METHOD名称
rsa_pub_enc:公钥加密函数,padding为其填充方式,输入数据不能太长,否则无法填充
rsa_pub_dec:公钥解密函数,padding为去除填充的方式,输入数据长度为RSA密钥长度的字节数
rsa_priv_enc:私钥加密函数,padding为其填充方式,输入数据长度不能太长,否则无法填充
rsa_priv_dec:私钥解密函数,padding为其去除填充的方式,输入数据长度为RSA密钥长度的字节数。
rsa_sign:签名函数
rsa_verify:验签函数
rsa_keygen:RSA密钥对生成函数
 
 
b.RSA
RSA数据结构中包含了公私钥信息(如果仅有n和e,则表明公钥)
struct rsa_st {
int pad;
int32_t version;
const RSA_METHOD *meth;
ENGINE *engine;
BIGNUM *n;
BIGNUM *e;
BIGNUM *d
BIGNUM *p;
BIGNUM *q;
BIGNUM *dmp1;
BIGNUM *dmq1;
BIGNUM *iqmp;
STACK_OF(RSA_PRIME_INFO) *prime_infos;
RSA_PSS_PARAMS *pss;
CRYPTO_EX_DATA ex_data;
CRYPTO_REF_COUNT references;
int flags;
BN_MONT_CTX *_method_mod_n;
BN_MONT_CTX *_method_mod_p;
BN_MONT_CTX *_method_mod_q;
char *bignum_data;
BN_BLINDING *blinding;
BN_GLINDING *mt_blinding;
CRYPTO_RWLOCK *lock;
 
}
 
 
17.5 主要函数
a.RSA_check_key
功能:检查RSA密钥
b.RSA_new
功能:生成一个RSA密钥结构,并采用默认的rsa_pkcs1_eay_meth RSA_METHOD方法
c.RSA_free
功能:释放RSA结构。
d.RSA *RSA_generate_key(int bits, unsigned long e_vlaue, void (*callback)(int , int, void *), void *cb_arg)
功能:生成RSA密钥,bits是模数比特数,e_value是公钥指数e,callback回调函数由用户实现,用于干预密钥生成过程中的一些运算,可谓空。
e.RSA_get_ex_data
功能:获取扩展数据
f.RSA_get_method
功能:获取RSA结构的RSA_METHOD.
g.RSA_padding_add_none
RSA_padding_add_PCKS1_OAEP
RSA_padding_add_PKCS1_type_1(私钥加密的填充)
RSA_padding_add_PKCS1_type_2(公钥加密的填充)
RSA_padding_add_SSLv23
h.RSA_padding_check_none
RSA_padding_check_PKCS1_OAEP
RSA_padding_check_PKCS1_type_1
RSA_padding_check_PKCS1_type_2
RSA_padding_check_SSLv23
RSA_PKCS1_SSLeay
i.int RSA_print(BIO *bp, const RSA *x, int off)
功能:将RSA信息输出到BIO中,off为输出信息在BIO中偏移量,比如是屏幕BIO,则表示打印信息的位置离左边屏幕边缘的距离。
j.int DSA_print_fp(FILE *fp, const DSA *x, int off)
功能:将RSA信息输出到FILE中,off为输出偏移量。
k.RSA_public_decrypt
功能:公钥解密
l.RSA_public_encrypt
功能:公钥加密
m.RSA_set_default_method/RSA_set_method
功能:设置RSA结构中的method,当用户实现了一个RSA_METHOD时,调用此函数来设置,使RSA运算采用用户的方法。
n.RSA_set_ex_data
功能:设置扩展数据
o.RSA_sign
功能:RSA签名
p.RSA_sign_ASN1_OCTET_STRING
功能:另外一种RSA签名,不涉及摘要算法,他将输入数据作为ASN1_OCTET_STRING进行DER编码,然后直接调用RSA_private_encrypt进行计算。
q.RSA_size
功能:获取RSA密钥长度字节数
r.RSA_up_ref
功能:给RSA密钥增加一个引用
s.RSA_verify
功能:RSA验证
t.RSA_verify_ASN1_OCTET_STRING
功能:另一种RSA验证,不涉及摘要算法,与RSA_sign_ASN1_OECTET_STRING对应。
u.RSAPKey_asn1_meth
功能:获取RSA私钥的ASN1_METHOD,包括i2d, d2i, new和free函数地址
v.RSAPrivateKey_dup
功能:复制RSA私钥
w.RSAPublicKey_dup
功能:复制RSA公钥
 
 
posted @ 2018-01-19 12:48  艾小小雨  阅读(1398)  评论(0编辑  收藏  举报