java dh算法_dh密钥交换算法java
dh密鑰交換算法java
迪菲-赫爾曼密鑰交換(Diffie–Hellman key exchange,簡稱“D–H”) 是一種安全協(xié)議。
它可以讓雙方在完全沒有對方任何預先信息的條件下通過不安全信道建立起一個密鑰。這個密鑰可以在后續(xù)的通訊中作為對稱密鑰來加密通訊內(nèi)容。
(1)、算法描述
離散對數(shù)的概念:
原根:如果a是素數(shù)p的一個原根,那么數(shù)值:
amodp,a^2 modp,…,a^(p-1) modp
是各不相同的整數(shù),且以某種排列方式組成了從1到p-1的所有整數(shù)。
離散對數(shù):如果對于一個整數(shù)b和素數(shù)p的一個原根a,可以找到一個唯一的指數(shù) i,使得:
b =(a的i次方) modp?????????????? 其中0≦i ≦p-1
那么指數(shù)i稱為b的以a為基數(shù)的模p的離散對數(shù)。
Diffie-Hellman 算法的有效性依賴于計算離散對數(shù)的難度,其含義是:當已知大素數(shù)p和它的一個原根a后,對給定的 b,要計算 i ,被認為是很困難的,而給定 i 計算b 卻相對容易。
Diffie-Hellman算法:
假如用戶A和用戶B希望交換一個密鑰。
取素數(shù)p和整數(shù)a,a是p的一個原根,公開a和p。
A選擇隨機數(shù)XA
B選擇隨機數(shù)XB
每一方都將X保密而將Y公開讓另一方得到。
A計算密鑰的方式是:K=(YB) ^XA modp
B計算密鑰的方式是:K=(YA) ^XB modp
證明:
(YB)^ XA mod p = (a^XB modp)^ XA mod p
= (a^XB)^ XA mod p = (a^XA) ^XB mod p??? (
=(a^XA modp)^ XB mod p= (YA) ^XB mod p
由于XA和XB是保密的,而第三方只有p、a、YB、YA可以利用,只有通過取離散對數(shù)來確定密鑰,但對于大的素數(shù)p,計算離散對數(shù)是十分困難的。
例子:
假如用戶Alice和用戶Bob希望交換一個密鑰。
取一個素數(shù)p =97和97的一個原根a=5。
Alice和Bob分別選擇秘密密鑰XA=36和XB=58,并計算各自的公開密鑰:
YA=a^XA mod p=5^36 mod 97=50
YB=a^XB mod p=5^58 mod 97=44
Alice和Bob交換了公開密鑰之后,計算共享密鑰如下:
Alice:K=(YB) ^XA mod p=44^36 mod 97=75
Bob:K=(YA) ^XB mod p=50^58 mod 97=75
(2)、安全性
當然,為了使這個例子變得安全,必須使用非常大的XA, XB 以及p, 否則可以實驗所有的可能取值。(總共有最多97個這樣的值, 就算XA和XB很大也無濟于事)。
如果 p 是一個至少 300 位的質(zhì)數(shù),并且XA和XB至少有100位長, 那么即使使用全人類所有的計算資源和當今最好的算法也不可能從a, p和a^(XA*XB) mod p 中計算出 XA*XB。
這個問題就是著名的離散對數(shù)問題。注意g則不需要很大, 并且在一般的實踐中通常是2或者5。
在最初的描述中,迪菲-赫爾曼密鑰交換本身并沒有提供通訊雙方的身份驗證服務,因此它很容易受到中間人攻擊。
一個中間人在信道的中央進行兩次迪菲-赫爾曼密鑰交換,一次和Alice另一次和Bob,就能夠成功的向Alice假裝自己是Bob,反之亦然。
而攻擊者可以解密(讀取和存儲)任何一個人的信息并重新加密信息,然后傳遞給另一個人。因此通常都需要一個能夠驗證通訊雙方身份的機制來防止這類攻擊。
有很多種安全身份驗證解決方案使用到了迪菲-赫爾曼密鑰交換。例如當Alice和Bob共有一個公鑰基礎(chǔ)設(shè)施時,他們可以將他們的返回密鑰進行簽名。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java dh算法_dh密钥交换算法java的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 通信层_Android nat
- 下一篇: java 打包成服务_maven jav