1. 程式人生 > >18.openssl程式設計——DSA

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.