Diffie-Hellman( DH ):密鑰交換協議/算法 ( Diffie-Hellman Key Exchange/Agreement Algorithm )算法
百科摘錄:安全
Diffie-Hellman是一種創建密鑰的方法,而不是加密方法ui
這個機制的巧妙在於須要安全通訊的雙方能夠用這個方法肯定對稱密鑰,加密
而後能夠用這個密鑰進行加密和解密,spa
可是注意,這個密鑰交換協議/算法只能用於密鑰的交換,而不能進行消息的加密和解密,.net
雙方肯定要用的密鑰後,要使用其餘對稱密鑰操做加密算法實現加密和解密消息。code
如下是我對DH算法的理解:對象
Diffie-Hellman基於的數學原理: 1.對於一個整數b和素數p的一個原根a 2.能夠找到唯一的指數i 3.使得 b = a^i mod p ( a的i次方對p取餘 ) 一個例子說明Diffie-Hellman算法計算對稱密鑰的步驟: 1.一個公共素數p = 5,原根 a = 3 2.用戶User1生成一個指數i1 = 3 3.用戶User1計算b1 = 2,並把b1傳給User2 4.User2生成一個指數i2 = 2 5.User2計算b2 = 4,把b2傳給User1 6.User1把b2做爲a再次計算b1 = 4 7.User2把b1做爲a再次計算b2 = 4 8.最終獲得的b一、b2便是User1和User2共同的密鑰
基於上訴使用 Node.js 實現DH算法:blog
'use strict'; //引入crypto模塊 const crypto = require('crypto'); //實例化一個素數p的位數爲16位的DH對象,第二個參數是指定原根a,默認爲2(十六進制) const User1 = crypto.createDiffieHellman(16, 0xf); //隨機生成生成素數p let p = User1.getPrime(); //獲取原根a,默認爲2 let a = User1.getGenerator(); //獲取一個隨機數i1,並根據p和原根a生成b1 let b1 = User1.generateKeys(); //以十六進制的形式將素數p、原根a和User1的整數b1打印到控制檯上 console.log(p.toString('hex'),a.toString('hex'),b1.toString('hex')); //實例化一個素數是p,原根是a的DH對象 const User2 = crypto.createDiffieHellman(p, a); //獲取一個隨機數i2,並根據p和a生成b2 let b2 = User2.generateKeys(); console.log(b2.toString('hex')); //User1和User2交換b一、b2再次計算生成對稱密鑰 let key1 = User1.computeSecret(b2); let key2 = User2.computeSecret(b1); console.log(key1.toString('hex'), key2.toString('hex'));
注:對於上述方法我比較想說的是createDiffieHellman方法get
1.第一個參數表示的是素數p的位數
2.p的位數在Node中最少是16位,這裏咱們選擇16位是爲了計算機在計算的時候快一點
3.第一個參宿的值還有:2,4,8,16(16前面的這些數計算機會默認爲16),32,64,128,256,512,1024....
4.p的值越大計算機計算起來就越慢,可是用來進行數據加密就更安全,通常會選擇5十二、1024這些值生成密鑰
5.第二個參數表示的是原根a,默認是十六進制的02
6.若是要傳參數進去的話須要傳入十六進制數(如:0xabcdef),不然會報錯
7.每次執行程序的時候素數p和i都是隨機生成的,因此每次生成的密鑰都是不同的
8.原根a是不會變的
拓展閱讀:DH算法原理
做者:yine
來源:CSDN