18.openssl程式設計——DSA
阿新 • • 發佈:2019-02-02
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.