18.openssl编程——DSA
18.1 DSA简介
Digital Signature Algorithm(DSA)算法是一种公钥算法。
a.p一个大素数,长度为L(64的正数倍)比特。
b.q一个160比特素数
c.g=h(p-1)/q mod p,其中h小于p-1。
d.x<q
e.y= gx mod p
其中x为私钥,y为公钥.p、q和g是公开信息(openssl中称为密钥参数)
DSA签名包括两个部分。
r = (gk mod p) mod q
s = (k-1 (H(m) + xr)) mod q
DSA验签
w = s-1 mod q
u1 = (H(m) * w) mod q
u2 = (rw) mod q
v = ((gu1 * yu2) mod p) mod q :如果v=r,则验证通过。
18.2 openssl的DSA实现
openssl的DSA实现源码在crypto/dsa目录下
a.dsa_asn1.c
DSA密钥参数(p\q和g)、DSA公钥(pub_key 、p 、q和g)以及DSA私钥(priv_key\pub_key\p\q和g)的DER编解码实现
b.dsa_depr.c
生成DSA密钥参数
c.dsa_err.c
DSA错误处理
d.dsa_gen.c
生成DSA密钥参数
e.dsa_key.c
根据DSA中密钥参数产生公钥和私钥
f.dsa_lib.c
实现了DSA通用的一些函数
g.dsa_oss.c
实现了一个DSA_METHOD,该DSA_METHOD为默认的DSA方法,主要是心啊了如下三个回调函数:
dsa_do_sign(签名)
dsa_sign_setup(根据密钥参数生成公私钥)
dsa_do_verify(验签)
h.dsa_sign.c
实现了DSA签名和根据密钥参数生成公私钥
i.dsa_vrf.c
实现了DSA验签。
18.3 DSA数据结构
DSA数据结构定义在crypto/dsa.h中
a.DSA_SIG 签名值数据结构
typedef struct DSA_SIG_st
{
BIGNUM *r;
BIGNUM *s;
} DSA_SIG;
签名结果包括两部分,都是大数。
b. DSA_METHOD
struct dsa_method {
char *name;
DSA_SIG *(*dsa_do_sign) (const unsigned char *dgst, int dlen, DSA *dsa);
int (*dsa_sign_setup) (DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp, BIGNUM **rp);
int (*dsa_do_verify) (const unsigned char *dgst, int dgst_len, DSA_SIG *sig, DSA *dsa);
int (*dsa_mod_exp) (DSA *dsa, BIGNUM *rr, const BIGNUM *a1, const BIGNUM *p1, const BIGNUM *a2, const BIGNUM *p2, const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont);
int (*bn_mod_exp) (DSA *dsa, BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
int (*init) (DSA *dsa);
int flags;
void *app_data;
int (*dsa_paramgen) (DSA *dsa,
int bits,
const unsigned char *seed, int seed_len,
int *counter_ret, unsigned long *h_ret,
BN_GENCB *cb);
int (*dsa_keygen) (DSA *dsa);
};
name:DSA_METHOD的名字
dsa_do_sign:签名算法函数
dsa_sign_setup:根据密钥参数生成公私钥的函数
dsa_do_verify:签名验证函数
dsa_paramgen:生成密钥参数函数
18.4 主要函数
a.DSA_do_sign
功能:数据签名
b.DSA_do_verify
功能:签名验证
c.DSA_dup_DH
功能:将DSA密钥转换为DH密钥
d.DSA_new
功能:生成一个DSA数据结构,一般情况下,DSA_METHOD采用默认的openssl_dsa_meth方法。
e.DSA_free
功能:释放DSA数据结构
f.DSA_generate_parameters
功能:更具密钥残生生成公私钥
g.DSA_get_default_method
功能:获取默认的DSA_METHOD.
h.DSA_get_ex_data
获取扩展数据
i.DSA_new_method
功能:生成一个DSA结构
j.DSA_OpenSSL
功能:获取openssl_dsa_meth方法。
k.DSA_print
功能:将DSA密钥信息输出到BIO中。
l.DSA_print_fp
功能:将DSA密钥信息输出到FILE中。
m.DSA_set_defualt_method
功能:获取DSA_METHOD
n.DSA_set_ex_data
功能:设置扩展数据
o.DSA_set_method
功能:获取当前DSA的DSA_METHOD方法。
p.DSA_SIG_new
功能:生成一个DSA_SIG签名值结构
q.DSA_SIG_free
功能:释放DSA_SIG结构
r.DSA_sign
功能:DSA签名
s.DSA_sign_setup
功能:根据密钥参数生成公私钥
t.DSA_size
功能:获取DSA密钥长度的字节数
u.DSA_up_ref
功能:给DSA结构添加一个引用
v.DSA_verify
功能:签名验证
w.DSAparams_print
功能:将DSA密钥参数输出到bio
x.DSAparams_print_fp
功能:将DSA密钥参数输出到FILE.