1. 背景介绍:
Diffie-Hellman算法是Whitfield Diffie(惠特菲尔德·迪菲)和Martin Hellman(马丁·赫尔曼)在1976年提出。二者在2016年还获得了2015年度图灵奖,以表彰他们在密码学领域的突出贡献。这算法干了个啥呢?——在收发双方本地生成对称密钥,巧妙地避开了对称密钥管理难的问题。
2. 核心原理:
step1:A:随机选底数g,素数p,秘密整数a,计算S_A=g ^ a (mod p);
step2:A:共享g, p, S_A;传给B;
step3:B:随机选秘密整数b,计算S_B = g ^ b (mod p);
step4:B:共享S_B;
step5:A计算密钥S=S_B ^ a (mod p)=g ^ b(mod p) ^ a (mod p) = g^(b*a) mod p;
step6:B计算密钥S=S_A ^ b (mod p)=g ^ a(mod p) ^ b (mod p) = g^(a*b) mod p
如此,A,B双方就得到了一样的对称密钥,而第三方只能拿到g, p, S_A, S_B,在不知道a,b选值的情况下是没办法推算出对称密钥的值的。
3.数学验证:
在上述原理中,标红部分的内容是很多人在查询DH算法的时候,经常会看到的,也是整个原理逻辑的核心部分。不知道大家是不是第一反应就能明白?笔者自学的时候,这部分一开始始终不明白,后来有看到一篇解释论证的文章,才明白。借此整理共享:
step1:令r_1 = g ^ b mod p; r_0 = r_1 ^ a mod p
step2:g ^ b = k*p + r_1,k为整数;r_1=g^b-k*p
step3:r_0 = r_1 ^ a mod p = (g ^ b - k*p) ^ a mod p;令r_3= (g ^ b - k*p) ^ a
step4:根据二项式展开定理把r_3展开,得到:
step5:上述展开式中,含(-k*p)的非零次方的项对p求余都为0,故r_0对p求余结果如下:
step6:即r_0 = g ^ b (mod p) ^ a mod p = g ^ b ^ a mod p = g ^ (b * a) mod p
4.数学知识:
本质:求解离散对数太难了
定义:对于一个整数b和素数p的一个原根a,可以找到唯一的指数i,使得b=a^i mod p,且0<= i <=p-1;则指数i称为b的以a为基数的模p的离散对数或者指数。
理论依据:给定质数p和底数g,已知y=g ^ i (mod p)的值,反向求解i,很难很难。但如果知道p、g、i,正向求解y,很简单很简单。