publicclassRSAValidate {//这里定义的3跟17可以任意更换publicstatic final int BASIC_NUMBER=3;publicstatic final int MOD_NUMBER=17;publicstaticvoiddiffieHellman(){//通信双方各自生成两个随机数(为了方便理解,这里双方用客户端和服务器)int cRandom=(int)(Math.random()*100);int sRandom=(int)(Math.random()*100);//客户端和服务器分别根据自己生成的随机数和计算规则计算出要传递给对方的公钥int publicKeyToServer=(int)(Math.pow(BASIC_NUMBER, cRandom))%17;int publicKeyToCustom=(int)(Math.pow(BASIC_NUMBER, sRandom))%17;//两边计算出密钥int cPrivateKey=(int)(Math.pow(publicKeyToServer, cRandom))%17;int sPrivateKey=(int)(Math.pow(publicKeyToCustom, sRandom))%17;//验证两端生成的密钥是否一致(经验证:一致) System.out.println(cPrivateKey==sPrivateKey); }publicstaticvoidmain(String[] args){ RSAValidate.diffieHellman(); }}
看完以上内容,迪菲赫尔曼的流程就了解了。那么关于迪菲赫尔曼的最后一个问题:看似不相关的计算,为什么两边形成的密钥是一致的呢?下面将进行数学证明:
3、
概括
上述过程: 对于客户端:3 mod 17=a (a就是客户端形成的公钥),传递给服务器。对于服务器:3 mod 17=b(b就是服务器形成的公钥),传递给客户端。bm mod 17= an mod 17 (两边形成的密钥一致);
证明方法一:
上述过程可转化为如下数学问题: 已知: 求证:bm mod 17= an mod 17 证明:an mod 17 =(3m mod 17)n mod 17=3mn mod 17 (上一步到这一步是取模运算法则)bm mod 17=(3n mod 17 )m mod 17=3nm mod 17 上一步到这一步是取模运算法则)=an mod 17 证明完毕!这里先买个关子,去模运算法则在看完证明方法二之后证明:
以上运算法则转化得:am≡[(a modp)m ]mod p。即证明am和(a mod p)m同余p证明:由同余定理(同余定理:给定一个正整数m,如果两个整数a和b满足a-b能够被m整除,即(a-b)/m得到一个整数,那么就称整数a与b对模m同余,记作a≡b(mod m))得证明:am -(a mod p)m =pk(k属于正整数)即可;根据公式:an-bn=(a-b)(……)得原式=(a-(a mod p))*(……);因为a-(a mod p) 是p的倍数,而“*”后面是常数。所以am -(a mod p)m 是p的倍数。(如果m是p的倍数,C是常数,那么mC一定是p的倍数)。得证!