19.openssl编程——DH
19.1 DH算法介绍
DH算法实质是一个通信双方进行密钥协商的协议:两个实体中的任何一个使用自己的私钥和另一个实体的公钥,得到一个对称密钥,这一对称密钥其他实体都计算不出来。
首先,发送方和接收方设置相同的大数数n和g,这两个不是保密的,他们可以通过非安全通道来协商这两个素数。
协商密钥:
a.发送方选择一个大随机整数x,计算X=g^x mod n,发送X给接收者
b.接收方选择一个大随机整数y, 计算Y=g^y mod n,发送Y给发送方。
双方计算密钥:发送方密钥为k1 = Y^x mod n,接收方密钥为k2 = X^y mod n.
其中 k1=k2=g^(xy) mod n
19.2 openssl的DH实现
a.dh.h
功能:定义了DH密钥数据结构以及各种函数
b.dh_asn1.c
功能:DH密钥参数的DER编码实现
cdh_lib.c
功能:实现了通用的DH函数
d.dh_gen.c
功能:实现了生成DH密钥参数
e.dh_key.c
功能:实现Openssl提供的默认的DH_METHOD,实现了根据密钥参数生成DH公私钥,以及根据DH公钥(一方)以及DH私钥(另一方)来生成一个共享密钥,用于密钥交换。
f.dh_err.c
功能:实现了DH错误处理。
g,dh_check.c
功能:实现了DH密钥检查
19.3 数据结构
DH数据结构定义在crypto/dh/dh.h中主要包含两项,
a.DH_METHOD
struct dh_method {
char *name;
int (*generate_key) (DH *dh);
int (*compute_key) (unsigned char *key, const BIGNUM *pub_key, DH *dh);
int (*bn_mod_exp) (const DH *dh, BIGNUM *r, const BINGUM *a,
const BIGNUM *p, cosnt BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
int (*init) (DH *dh);
int (*finish) (DH *dh);
int flags;
char *app_data;
int (*generate_param) (DH *dh, int prime_len, int generator, BN_GENCB *cb)
}
19.4 主要函数
a.DH_new
功能:生成DH数据结构,其DH_METHOH采用openssl默认提供的。
b.DH_free
功能:释放DH数据结构
c.DH_generate_parameters
功能:生成DH密钥参数
d.DH_generate_key
功能:生成DH公私钥。
e.DH_compute_key
功能:计算共享密钥,用于数据交换
f.DH_check
功能:检查DH密钥
g.DH_get_default_method
功能:获取默认的DH_METHOD,该方法是可以由用户设置的。
h.DH_get_ex_data
功能:获取DH结构中的扩展数据。
i.DH_new_method
功能:生成DH数据结构
j.DH_OpenSSL
功能:获取openssl提供额DH_METHOD
k.DH_set_default_method
功能:设置默认的DH_METHOD方法,当用户实现了自己的DH_METHO时,可调用本函数来设置,控制DH各种计算。
l.DH_size
功能:获取DH密钥长度的字节数
m.DH_up_ref
功能:增加DH结构的一个引用
n.DHparams_print
功能:将DH密钥参数输出到bio中
o.DHparams_print_fp
功能:将DH密钥参数输出到FILE中。