㈠ 如何對diffie-hellman密鑰交換協議
DH演算法的最終目的是為了完成通信雙方對稱秘鑰的交互,但是它牛逼在即使處在不安全的環境(有人偵聽)也不會造成秘鑰泄露。
這里舉一個最簡單的反面例子:A和B要進行銀行密碼的交換,他們需要一個秘鑰來加密自己的信息,A發給B 『2』 作為暗號,B再回一個『2』,OK,以後他們發的所有信息都將加2(假設信息都是數字且運算不會溢出)。現在C偷聽到了,A發一個『456』給B,那麼完蛋了,C知道A的銀行密碼是『234』了。
有了DH就不一樣了,A和B協定用23和5運算,A想了一個6(這個數字不用發給B),用23和5算出來一個8,發給B; B想了一個15(這個數字也不用發給A),算出來一個19又發給A;
現在A用B發過來的19可以算出2,B用A發過來的8算出來也是2,所以他們以後發的信息都是加2的。
假設C一直在偷聽,那麼他知道一開始用的是23和5,還有發送過程中的8和19,然而這並沒有什麼卵用,因為他有生之年算不出最後這個2,所以之後A和B交換的銀行密碼』456』 他也就沒法破解了。
至於「為什麼要選擇23和5、8和19還有最後的2是怎麼算出來的、為什麼C有生之年都算不出來」見wiki-迪菲-赫爾曼密鑰交換
㈡ Diffie-Hellman的定義
由於該演算法本身限於密鑰交換的用途,被許多商用產品用作密鑰交換技術,因此該演算法通常稱之為Diffie-Hellman密鑰交換(簡寫為DH演算法,基於DH演算法的密鑰交換通常也被稱為DH交換).這種密鑰交換技術的目的在於使得兩個用戶安全地交換一個秘密密鑰以便用於以後的報文加密. Diffie-Hellman密鑰交換演算法的有效性依賴於計算離散對數的難度.簡言之,可以如下定義離散對數:首先定義一個素數p的原根,為其各次冪產生從1 到p-1的所有整數根,也就是說,如果a是素數p的一個原根,那麼數值 a mod p,a2 mod p,...,ap-1 mod p 是各不相同的整數,並且以某種排列方式組成了從1到p-1的所有整數. 對於一個整數b和素數p的一個原根a,可以找到惟一的指數i,使得 b = a^i mod p 其中0 ≤ i ≤ (p-1) 指數i稱為b的以a為基數的模p的離散對數或者指數.該值被記為inda,p(b).
㈢ 如何改進DH演算法,使其抵禦中間人攻擊
改進DH演算法使其抵禦中間人攻擊的方法是:在途中根據需要修改它們的密文,使得A和B都不知道他們在和C共享通信。
DH演算法的缺點是沒有提供雙方身份的任何信息.。它是計算密集性的,因此容易遭受阻塞性攻擊,即對手請求大量的密鑰。受攻擊者花費了相對多的計算資源來求解無用的冪系數而不是在做真正的工作.,沒辦法防止重演攻擊。
容易遭受中間人的攻擊,第三方C在和A通信時扮演B;和B通信時扮演A.A和B都與C協商了一個密鑰,然後C就可以監聽和傳遞通信量。
(3)dh密鑰交換演算法c擴展閱讀:
基於原根的定義及性質,可以定義Diffie-Hellman密鑰交換演算法.該演算法描述如下:
1、有兩個全局公開的參數,一個素數q和一個整數a,a是q的一個原根。
2、假設用戶A和B希望交換一個密鑰,用戶A選擇一個作為私有密鑰的隨機數XA(XA<q),並計算公開密鑰YA=a^XA mod q。A對XA的值保密存放而使YA能被B公開獲得。類似地用戶B選擇一個私有的隨機數XB<q,並計算公開密鑰YB=a^XB mod q。B對XB的值保密存放而使YB能被A公開獲得。
3、用戶A產生共享秘密密鑰的計算方式是K = (YB)^XA mod q.同樣,用戶B產生共享秘密密鑰的計算是K = (YA)^XB mod q.這兩個計算產生相同的結果:
K = (YB)^XA mod q = (a^XB mod q)^XA mod q = (a^XB)^XA mod q = a^(XBXA) mod q = (a^XA)^XB mod q = (a^XA mod q)^XB mod q = (YA)^XB mod q 因此相當於雙方已經交換了一個相同的秘密密鑰。
㈣ DH演算法問題。
DH組的本質是使用非對稱密鑰來加密對稱密鑰。 DH演算法過程: 1、相互產生密鑰對 2、交換公鑰 3、用對方的公鑰和自己的私鑰運行DH演算法——得到另外一個密鑰X
㈤ 驗證DH密鑰交換演算法
我自己寫了個DH秘鑰的demo代碼, 以前加密用過AES的加密,全套代碼寫下來太費時間又沒技術含量。
如果你需要AES的加密代碼可以留個郵箱給我。
java">publicclassTest1{
publicstaticfinalintP=30;//公開的大家都知道的
publicstaticfinalintG=9;//公開的大家都知道的
publicstaticvoidmain(String[]args){
Ax=newA();
intone=x.getV();
//分割A代表A這邊的系統加密one代表是給別人的值
By=newB();
inttwo=y.getV();
//B代表另外一邊加密two代表是給別人的值
System.out.println(x.getKey(two));
System.out.println(y.getKey(one));
}
}
classA{
privateinta;//自己的私有密值,不會告訴任何人
publicA(){
Randomr=newRandom(200);
a=r.nextInt();
}
publicintgetV(){
return(Test1.G^a)%Test1.P;
}
publicintgetKey(intv){
return(v^a)%Test1.P;
}
}
classB{
privateintb;//自己的私有密值,不會告訴任何人
publicB(){
Randomr=newRandom(200);
b=r.nextInt();
}
publicintgetV(){
return(Test1.G^b)%Test1.P;
}
publicintgetKey(intv){
return(v^b)%Test1.P;
}
}
㈥ 簡述DH演算法
DH組的本質是使用非對稱密鑰來加密對稱密鑰。 DH演算法過程: 1、相互產生密鑰對 2、交換公鑰 3、用對方的公鑰和自己的私鑰運行DH演算法——得到另外一個密鑰X
㈦ 求解DH密鑰交換系統怎麼通過實例實現
密鑰管理密鑰是一種讀娶修改或驗證保護數據的保密代碼或數字。密鑰與演算法(一個數學過程)結合在一起以保護數據。Windows XP 自動處理密鑰生成並執行以下可以最大化保護的密鑰屬性:動態重生成密鑰IPSec 策略通過一種稱為動態重新加密的方法來控
㈧ 什麼是dh演算法
DH組的本質是使用非對稱密鑰來加密對稱密鑰。
DH演算法過程:
1、相互產生密鑰對
2、交換公鑰
3、用對方的公鑰和自己的私鑰運行DH演算法——得到另外一個密鑰X(這里的奇妙之處是這個值兩端都是一樣的)
4、A產生對稱加密密鑰,用密鑰X加密這個對稱的加密密鑰——發送到B
5、B用密鑰X解密——得到對稱的加密密鑰
6、B用這個對稱的加密密鑰來解密A的數據
㈨ dh交換密鑰,為什麼還要兩端都配置共享秘鑰
共享密鑰是用來通過演算法計算公私鑰的。不用來做數據加密
㈩ 求C或C++實現Diffie-Hellman密鑰交換和RSA演算法的加解密
找個大數軟體包,比如NTL或者GMP,用來實現DH或者RSA很容易。