DH(僅能用於密鑰分配,不能加解密數據)
非對稱加密演算法
特點:
發送方和接收方均有一個密鑰對(公鑰+私鑰),其中公鑰傳播,私鑰自己保存,不需要傳播
私鑰不需要傳播的特性解決了對稱加密演算法中密鑰傳播的困難(這個困難一般通過線下傳遞可以解決)
加密安全性極高,只用於一些電子商務網站,加解密速度遠低於對稱加密
一般情況下,為了解決非對稱加密演算法加解密速度低的問題,採用非對稱加密(使用公鑰+私鑰對對稱加密的密鑰進行加解密)+對稱加密(加解密數據)相結合的方式。
常見演算法:
DH(非對稱加密的基石)
RSA(非對稱加密的經典,除了可用於非對稱加密,也可用於數字簽名,RSA--155(512位密鑰)已被破解)
ElGamal
B. 非對稱加密演算法 (RSA、DSA、ECC、DH)
非對稱加密需要兩個密鑰:公鑰(publickey) 和私鑰 (privatekey)。公鑰和私鑰是一對,如果用公鑰對數據加密,那麼只能用對應的私鑰解密。如果用私鑰對數據加密,只能用對應的公鑰進行解密。因為加密和解密用的是不同的密鑰,所以稱為非對稱加密。
非對稱加密演算法的保密性好,它消除了最終用戶交換密鑰的需要。但是加解密速度要遠遠慢於對稱加密,在某些極端情況下,甚至能比對稱加密慢上1000倍。
演算法強度復雜、安全性依賴於演算法與密鑰但是由於其演算法復雜,而使得加密解密速度沒有對稱加密解密的速度快。對稱密碼體制中只有一種密鑰,並且是非公開的,如果要解密就得讓對方知道密鑰。所以保證其安全性就是保證密鑰的安全,而非對稱密鑰體制有兩種密鑰,其中一個是公開的,這樣就可以不需要像對稱密碼那樣傳輸對方的密鑰了。這樣安全性就大了很多。
RSA、Elgamal、背包演算法、Rabin、D-H、ECC (橢圓曲線加密演算法)。使用最廣泛的是 RSA 演算法,Elgamal 是另一種常用的非對稱加密演算法。
收信者是唯一能夠解開加密信息的人,因此收信者手裡的必須是私鑰。發信者手裡的是公鑰,其它人知道公鑰沒有關系,因為其它人發來的信息對收信者沒有意義。
客戶端需要將認證標識傳送給伺服器,此認證標識 (可能是一個隨機數) 其它客戶端可以知道,因此需要用私鑰加密,客戶端保存的是私鑰。伺服器端保存的是公鑰,其它伺服器知道公鑰沒有關系,因為客戶端不需要登錄其它伺服器。
數字簽名是為了表明信息沒有受到偽造,確實是信息擁有者發出來的,附在信息原文的後面。就像手寫的簽名一樣,具有不可抵賴性和簡潔性。
簡潔性:對信息原文做哈希運算,得到消息摘要,信息越短加密的耗時越少。
不可抵賴性:信息擁有者要保證簽名的唯一性,必須是唯一能夠加密消息摘要的人,因此必須用私鑰加密 (就像字跡他人無法學會一樣),得到簽名。如果用公鑰,那每個人都可以偽造簽名了。
問題起源:對1和3,發信者怎麼知道從網上獲取的公鑰就是真的?沒有遭受中間人攻擊?
這樣就需要第三方機構來保證公鑰的合法性,這個第三方機構就是 CA (Certificate Authority),證書中心。
CA 用自己的私鑰對信息原文所有者發布的公鑰和相關信息進行加密,得出的內容就是數字證書。
信息原文的所有者以後發布信息時,除了帶上自己的簽名,還帶上數字證書,就可以保證信息不被篡改了。信息的接收者先用 CA給的公鑰解出信息所有者的公鑰,這樣可以保證信息所有者的公鑰是真正的公鑰,然後就能通過該公鑰證明數字簽名是否真實了。
RSA 是目前最有影響力的公鑰加密演算法,該演算法基於一個十分簡單的數論事實:將兩個大素數相乘十分容易,但想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰,即公鑰,而兩個大素數組合成私鑰。公鑰是可發布的供任何人使用,私鑰則為自己所有,供解密之用。
A 要把信息發給 B 為例,確定角色:A 為加密者,B 為解密者。首先由 B 隨機確定一個 KEY,稱之為私鑰,將這個 KEY 始終保存在機器 B 中而不發出來;然後,由這個 KEY 計算出另一個 KEY,稱之為公鑰。這個公鑰的特性是幾乎不可能通過它自身計算出生成它的私鑰。接下來通過網路把這個公鑰傳給 A,A 收到公鑰後,利用公鑰對信息加密,並把密文通過網路發送到 B,最後 B 利用已知的私鑰,就能對密文進行解碼了。以上就是 RSA 演算法的工作流程。
由於進行的都是大數計算,使得 RSA 最快的情況也比 DES 慢上好幾倍,無論是軟體還是硬體實現。速度一直是 RSA 的缺陷。一般來說只用於少量數據加密。RSA 的速度是對應同樣安全級別的對稱密碼演算法的1/1000左右。
比起 DES 和其它對稱演算法來說,RSA 要慢得多。實際上一般使用一種對稱演算法來加密信息,然後用 RSA 來加密比較短的公鑰,然後將用 RSA 加密的公鑰和用對稱演算法加密的消息發送給接收方。
這樣一來對隨機數的要求就更高了,尤其對產生對稱密碼的要求非常高,否則的話可以越過 RSA 來直接攻擊對稱密碼。
和其它加密過程一樣,對 RSA 來說分配公鑰的過程是非常重要的。分配公鑰的過程必須能夠抵擋中間人攻擊。假設 A 交給 B 一個公鑰,並使 B 相信這是A 的公鑰,並且 C 可以截下 A 和 B 之間的信息傳遞,那麼 C 可以將自己的公鑰傳給 B,B 以為這是 A 的公鑰。C 可以將所有 B 傳遞給 A 的消息截下來,將這個消息用自己的密鑰解密,讀這個消息,然後將這個消息再用 A 的公鑰加密後傳給 A。理論上 A 和 B 都不會發現 C 在偷聽它們的消息,今天人們一般用數字認證來防止這樣的攻擊。
(1) 針對 RSA 最流行的攻擊一般是基於大數因數分解。1999年,RSA-155 (512 bits) 被成功分解,花了五個月時間(約8000 MIPS 年)和224 CPU hours 在一台有3.2G 中央內存的 Cray C916計算機上完成。
RSA-158 表示如下:
2009年12月12日,編號為 RSA-768 (768 bits, 232 digits) 數也被成功分解。這一事件威脅了現通行的1024-bit 密鑰的安全性,普遍認為用戶應盡快升級到2048-bit 或以上。
RSA-768表示如下:
(2) 秀爾演算法
量子計算里的秀爾演算法能使窮舉的效率大大的提高。由於 RSA 演算法是基於大數分解 (無法抵抗窮舉攻擊),因此在未來量子計算能對 RSA 演算法構成較大的威脅。一個擁有 N 量子位的量子計算機,每次可進行2^N 次運算,理論上講,密鑰為1024位長的 RSA 演算法,用一台512量子比特位的量子計算機在1秒內即可破解。
DSA (Digital Signature Algorithm) 是 Schnorr 和 ElGamal 簽名演算法的變種,被美國 NIST 作為 DSS (DigitalSignature Standard)。 DSA 是基於整數有限域離散對數難題的。
簡單的說,這是一種更高級的驗證方式,用作數字簽名。不單單只有公鑰、私鑰,還有數字簽名。私鑰加密生成數字簽名,公鑰驗證數據及簽名,如果數據和簽名不匹配則認為驗證失敗。數字簽名的作用就是校驗數據在傳輸過程中不被修改,數字簽名,是單向加密的升級。
橢圓加密演算法(ECC)是一種公鑰加密演算法,最初由 Koblitz 和 Miller 兩人於1985年提出,其數學基礎是利用橢圓曲線上的有理點構成 Abel 加法群上橢圓離散對數的計算困難性。公鑰密碼體制根據其所依據的難題一般分為三類:大整數分解問題類、離散對數問題類、橢圓曲線類。有時也把橢圓曲線類歸為離散對數類。
ECC 的主要優勢是在某些情況下它比其他的方法使用更小的密鑰 (比如 RSA),提供相當的或更高等級的安全。ECC 的另一個優勢是可以定義群之間的雙線性映射,基於 Weil 對或是 Tate 對;雙線性映射已經在密碼學中發現了大量的應用,例如基於身份的加密。不過一個缺點是加密和解密操作的實現比其他機制花費的時間長。
ECC 被廣泛認為是在給定密鑰長度的情況下,最強大的非對稱演算法,因此在對帶寬要求十分緊的連接中會十分有用。
比特幣錢包公鑰的生成使用了橢圓曲線演算法,通過橢圓曲線乘法可以從私鑰計算得到公鑰, 這是不可逆轉的過程。
https://github.com/esxgx/easy-ecc
Java 中 Chipher、Signature、KeyPairGenerator、KeyAgreement、SecretKey 均不支持 ECC 演算法。
https://www.jianshu.com/p/58c1750c6f22
DH,全稱為"Diffie-Hellman",它是一種確保共享 KEY 安全穿越不安全網路的方法,也就是常說的密鑰一致協議。由公開密鑰密碼體制的奠基人 Diffie 和 Hellman 所提出的一種思想。簡單的說就是允許兩名用戶在公開媒體上交換信息以生成"一致"的、可以共享的密鑰。也就是由甲方產出一對密鑰 (公鑰、私鑰),乙方依照甲方公鑰產生乙方密鑰對 (公鑰、私鑰)。
以此為基線,作為數據傳輸保密基礎,同時雙方使用同一種對稱加密演算法構建本地密鑰 (SecretKey) 對數據加密。這樣,在互通了本地密鑰 (SecretKey) 演算法後,甲乙雙方公開自己的公鑰,使用對方的公鑰和剛才產生的私鑰加密數據,同時可以使用對方的公鑰和自己的私鑰對數據解密。不單單是甲乙雙方兩方,可以擴展為多方共享數據通訊,這樣就完成了網路交互數據的安全通訊。
具體例子可以移步到這篇文章: 非對稱密碼之DH密鑰交換演算法
參考:
https://blog.csdn.net/u014294681/article/details/86705999
https://www.cnblogs.com/wangzxblog/p/13667634.html
https://www.cnblogs.com/taoxw/p/15837729.html
https://www.cnblogs.com/fangfan/p/4086662.html
https://www.cnblogs.com/utank/p/7877761.html
https://blog.csdn.net/m0_59133441/article/details/122686815
https://www.cnblogs.com/muliu/p/10875633.html
https://www.cnblogs.com/wf-zhang/p/14923279.html
https://www.jianshu.com/p/7a927db713e4
https://blog.csdn.net/ljx1400052550/article/details/79587133
https://blog.csdn.net/yuanjian0814/article/details/109815473
C. DH & RSA 原理
在 https 建立連接過程中,會進行秘鑰協商。雙方會各自給出一個隨機數 rc, rs,再加上一個 pre-master 。最後根據 rc + rs + pre-master 三個隨機數計算出最終的主密鑰。
這里我們要介紹的 pre-master 的生成演算法,就是 DH 秘鑰交換的變種, ECDHE 。下面我們先來介紹一下 DH 演算法。
DH,全稱是 Diffe-Hellman ,它的原理很簡單。
雙方預先知道兩個公共參數 g 和 p,然後各自給定一個數,最後根據一個數學公式喚陸,則可計算出相同的秘鑰。
這是建立 模冪運算 的基礎上,先求冪,後取模,稱為模冪計算。如下所示,其中 p 是質數,a、b、p 都取很大的數,g 可以取較小的數。
假設 Alice 與 Bob 通信,協商秘鑰,計算過程如下:
最終得到 k1 == k2 。
私鑰 a,b 不被外部所知,只有 A、B、g、p 是公開的。而僅僅知道這幾個數,是很難求出 a、b 的。因為涉及到對數運算問題。
對於下面這個模冪公式來說:
它滿足如下特性:
該演算法就是利用了 1、2 特性。
非對稱加密演算法,用公鑰加密,可以用私鑰解密;用私鑰加密,可以用公鑰解密。
假設 g 是原始數據,套用如下公式,經過公鑰 a 加密後變為了 A。
那麼如何解出 g 呢?假設我們也根據上面的好鏈侍公式套用一下,用同樣的方式解密,如下所示。其中 d 是私鑰,將 A 進行解密得到 g。
將 A 代入,可得到:
那麼 a、d、g 之間的關系就建立起來了。
同友吵樣,如果用私鑰 d 加密,公鑰 a 來解密,也是成立的。
歐拉函數 φ(x) 表示,≤ x 的正整數中,有多少個數與其互質。比如 x = 4,比 4 小的數有 1、2、3、4,其中 1、3 是質數,所以 φ(4) = 2。
它滿足如下特性:
歐拉定理如下,g 的 φ(p) 次冪,再模上 p,結果為 1。其中 g,p 互質。
下面我們將歐拉定理做如下處理:
當我們有了公鑰 a,要計算出私鑰 d,就很容易了,只需知道 φ(p) 。而又要讓 φ(p) 不易被破解,根據歐拉公式中提到的 φ(x) = (m-1)*(n-1) ,可以取用很大的質數 m 和 n, p = m * n ,這樣破解起來就很困難了。
因為外部知道的是公鑰 a、非常大的數 p,求出 d 需要將 p 進行質因數分解。而對超大數進行分解非常困難,當 p 的位數越長,安全性就越好。現在一般採用 2048 位,1024 位已經不太安全了。
D. 什麼是DH協議的中間人
DH協議的中間人是Diffie-Hellman密鑰協議演算法是一種確保共享密鑰KEY安全穿越不安全網路的李行兆方法,它是OAKLEY的一個組成部分,由Whitefield與Martin Hellman在1976年提出。這個機制的巧妙在於需要安全通信的雙方可以用這個方法確定對稱密鑰。然後可帶逗以用這個密鑰進行加密和解密。但是注意,這個密鑰交換協議/演算法只能用於密哪租鑰的交換,而不能進行消息的加密和解密。雙方確定要用的密鑰後,要使用其他對稱密鑰操作加密演算法實際加密和解密消息。
E. RSA、Diffie-Hellman和中間人攻擊
網路上常常有對RSA、DH演算法,以及中間人攻擊的討論。
一種說法是「RSA密鑰協商(交換)不會受到中間人攻擊」,聽起來似乎RSA比DH做密鑰協商更優。
這種說法有些不負責任。下面把這個問題中涉及到的概念都解釋一下,再來看這個問題。
中間人攻擊輪寬,可以這樣解釋:攻擊者一定程度上控制了網路,成為網路雙方通信的中間者,從而獲取到雙方的通信信息;而通信雙方都感知不到中間人的存在。
這個話題往往和加密通信一起討論:如果加密信道中存在中間人,那明文就會被中間人獲取,而通信雙方還不會知曉。
中間人攻擊的根本,在於通信雙方沒有進行身份認證。即:不知道和自己直接通信的人是誰。如果雙方能確認直接通信的人就是對方,也就不存在中間人攻擊了。
RSA加密演算法 是一種非對稱加密技術。由一對密鑰(公鑰+私鑰)組成。
可以利用私鑰來生成公鑰。
一般來說,私鑰會被秘密保存起來,而公鑰則分發出去。
公鑰加密,私鑰解密,稱為RSA加密演算法。 是為了保證公鑰加密的內容,只有私鑰持有者可以解密。常常用在客戶端賬密登錄過程:客戶端對密碼進行公鑰加密,發送到服務端後用私鑰解密,這樣即使請求被截獲也不會泄露密碼(實際上要更復雜一些)。
私鑰加密,公鑰解密,稱為RSA簽名演算法。 是為了保證公鑰持有者獲取的內容,確實是來自私鑰持有者的正確內容。比如伺服器持有私鑰,將一個重要信息計算hash再私鑰簽名後,和信息本身一起發送到客戶端;客戶端用公鑰解密簽名得到hash值,再計算信息的hash值,進行比對,就知道內容是否被篡改。由於私鑰的畝桐嫌保密性,攻擊者無法偽造有效的簽名。
DH密鑰交換演算法 並不是 加密演算法,而是雙方在不安全的網路中交換信息而生成雙方僅有的密鑰的一種方法。其結果是,交換的雙方得到了一樣的會話密鑰,而其他任何人不能得到這個密鑰。
由於演算法的結果是通信雙方擁有了一樣的密鑰,雙方往往會利用這個密鑰進行 對稱 加密通信。
DH演算法的過程可以簡單解釋如下:通信雙方AB,各自生成一對DH密鑰(Pa,Sa)和(Pb,Sb)(P代表公鑰,S代表私鑰)。雙方交換各自的公鑰P,於是A持有Sa、Pb,B持有Sb、Pa。通過某種計算,Sa、Pb可以生成會話密鑰K,Sb、Pa也可以生成相同的K。
DH演算法本身不包含身份認證機制,所以中間人攻擊是其明顯的問題。
設想:
在AB間,有一C。AB交換DH公鑰P時,C在中間截獲;C自己生成一對DH密鑰(Pc,Sc),用Pc和A、B完成密鑰交換。於是C與A間有了會話密鑰Kac=f(Pa,Sc)=f(Pc, Sa),C與B間有了會話密鑰Kcb=f(Pb,Sc)=f(Pc, Sb)。只要C從一方獲得的信息,重新加密後傳遞給另一方,AB就都不會發現他們的通信被劫持了。
密鑰協商(key establishment)包括「密鑰傳輸」(key transmission)和「密鑰交換」(key exchange)。
所謂RSA密鑰協商實際是密鑰傳輸,即一方生成密鑰,傳遞給另一方,而不必雙方交換。
具體來說,就是A自己生成一個密鑰K,用自己的RSA公鑰加密,再傳遞給B;B用RSA私鑰解密得到K。僅就這個過程而言,不會存在中間人攻擊。
但是這不是說RSA就比DH就更安全了。設想上面的情況,必須先要令A持有RSA公鑰,B持有RSA私鑰。這首先先進行一次RSA公鑰傳遞,而這個傳遞過程是存在中間人攻擊的。
設想:
B生成一對RSA密鑰Pb、Sb,將公鑰Pb發送給A。而AB中有C。C截獲了Pb,而自己生成了一對RSA密鑰Pc、Sc,將Pc發送給A。
A用Pc加密了會話密鑰K,發迅手送給B,被C截獲。C用Sc解密得到K,再用Pb加密後給B。這時C完成了中間人攻擊。
所以說: RSA的公鑰在端與端間傳遞時,存在中間人攻擊問題。
RSA最好的使用場景在服務端/客戶端之間,服務端持有私鑰,客戶端直接內置好公鑰,就不用擔心中間人攻擊了。
平時我們使用的,號稱安全的https協議,也存在中間人攻擊問題。比如Fiddler這種抓包軟體,就能充當https通信中的中間人。
一般上網時使用的https是 單向認證 ,即客戶端通過CA認證伺服器持有有效證書,來確認其身份。伺服器不會驗證客戶端的身份。
如果使用 雙向認證 ,通過CA確認兩端的身份都是正確的,就可以防止中間人攻擊了。這種雙向認證一般出現在企業應用對接中。
網路上有這樣一種說法:
通信兩端交換RSA公鑰,通過對方公鑰加密數據,自己私鑰解密。這樣就實現了端到端加密。
實際上這 不是端到端加密 。因為不能保證伺服器無法修改數據:伺服器可以用公鑰來加密任何的數據發給兩端。
而且,按之前所說的,這種交換, 存在中間人攻擊問題 。
F. 簡要介紹DH密鑰交換演算法
姓名:朱睿琦
學號:15180288015
參考:https://ke..com/item/Diffie-Hellman/9827194?fr=aladdin
http://blog.csdn.net/fw0124/article/details/8462373
【嵌牛導讀】:隨著互聯網路的高速發展,計算機運算能力的提升,對信息的保密也有了更近一步的要求——不僅信息要保密,密鑰也要保密。DH(Diffie-Hellman)演算法就提供了使密鑰安全通過不安全網路的方法。
【嵌牛鼻子】:DH演算法,密鑰,網路信息安全
【嵌牛提問】:DH演算法是用來保護什麼在網路中的通信安全?DH密鑰交換的基本原理是什麼?
【嵌牛正文】:(1)、演算法描述
離散對數的概念:
原根 :如果 a 是素數 p 的一個原根,那麼數值:
a mod p , a^ 2 mod p ,…, a^( p-1) mod p
是各不相同的整數,且以某種排列方式組成了從 1 到 p-1 的所有整數。
離散對數 :如果對於一個整數 b 和素數 p 的一個原根 a ,可以找到一個唯一的指數 i ,使得:
b =( a的i次方) mod p 其中 0 ≦ i ≦ p-1
那麼指數 i 稱為 b 的以 a 為基數的模p的離散對數。
Diffie-Hellman演算法的有效性依賴於計算離散對數的難度,其含義是:當已知大素數 p 和它的一個原根 a 後,對給定的 b ,睜喊褲要計算 i ,被認為是很困難的,而給定 i 計算 b 卻相對容易。
Diffie-Hellman演算法:
假如用戶A和用戶B希望交換一個密鑰。
取素數 p 和整數 a , a 是 p 的一個原根,公開 a 和p。
A選擇隨機數XA< p ,並計算YA= a^ XA mod p。
B選擇隨機數XB< p ,並計算YB= a^ XB mod p。
每一方都將X保密而將Y公開讓另一方得到。
A計算密鑰的方式是:K=(YB) ^XA mod p
B計算密鑰的方式是:K=(YA) ^XB mod p
證明:
(YB)^ XA mod p = ( a^ XB mod p )^ XA mod p
= ( a^ XB)^ XA mod p = ( a^ XA) ^XB mod p (<-- 密鑰即為 a^(XA*XB) mod p )
=( a^ XA mod p )^ XB mod p = (YA) ^XB mod p
由於XA和XB是保密的,而第三方只有 p 、 a 、YB、YA可以利用,只有通過取離散對數來確定密鑰,但對於大的素數 p ,計算離散對數是十分困難的。
例子:
假如用戶Alice和用戶Bob希望交換一個密鑰。
取一個素數 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 位的質數,並且XA和XB至少有100位長, 那麼即使使用全人類所有的計算資源和當今最好的演算法也不可能從a, p 和a^(XA*XB) mod p 中計算出 XA*XB。
這個問題就是著名的離散對數問題。注意g則不需要很大, 並滲歲且在一般的實踐中通常是2或者5。
在最初的描述中,迪菲-赫爾曼密鑰交換本身並沒有提供通訊雙方的身份驗證服務,因此它很容易受到中間人攻擊。
一個中間人在信道的中央進行兩次迪菲-赫爾曼密鑰交換,一次和Alice另一次和Bob,就能夠成功的向Alice假裝自己是Bob,反之亦然。
而攻擊者可以解密(讀取和存儲)任何一個人的信息並重新加密信息,然後傳遞給另一個人。因此通常都需要一個能夠驗證通訊雙方身份的機制來防止這類攻擊。
有很多種安全身份驗證解決方案使用到了迪菲-赫爾曼密鑰交換。例如當Alice和Bob共有一個公鑰基礎設施時,他們可以將他們的返回密鑰進行簽名。
G. Android-DH 秘鑰交換
DH 是 Whitfield Diffie 和 Martin Hellman 在1976年共同發明的一種秘鑰交換演算法。主要用於在不安全的網路上客戶端和服務端通過交換公鑰,生成一個相同的高旁大秘鑰,並將該秘鑰作為對稱加密演算法的秘鑰,達到使對稱加密演算法的秘鑰可以動態修改戚豎的目的。這樣便提高了數據在網路上傳輸的安全性。
DH 總共包含四個部分,分別是:質數原根對、公鑰、私鑰和秘鑰。
1. 客戶端和服務端使用相同的質數原根對:P=23 和 G=5,這是秘鑰交換的必須條件。
2. 服務端生成隨機整數 A = 6,並將啟裂 A 作為私鑰,使用公鑰計算公式:
公鑰 = G 的 A 次方 取余 P,等於 Math.pow(5,6) % 23,服務端的公鑰為: 8。
3. 客戶端生成隨機整數 B = 7,並將 B 作為私鑰,使用公鑰計算公式:
公鑰 = G 的 B 次方 取余 P,等於 Math.pow(5,7) % 23,客戶端的公鑰為: 17。
4. 服務端用客戶端的公鑰生成秘鑰,使用秘鑰計算公式:
秘鑰 = 17 的 A 次方 取余 P,等於 Math.pow(17,6) % 23,服務端的秘鑰為: 12。
5. 客戶端用服務端的公鑰生成秘鑰,使用秘鑰計算公式:
秘鑰 = 8 的 B 次方 取余 P,等於 Math.pow(8,7) % 23,客戶端的秘鑰為: 12。
客戶端和服務端通過交換公鑰,生成了相同的秘鑰。
H. 什麼是dh演算法
DH組的本質是使用非對稱密鑰來加密對稱密鑰。
DH演算法過程:
1、相互產生密鑰對
2、交換公鑰
3、用對方的公鑰和自己的私鑰運行DH演算法——得到另外一個密鑰X(這里的奇妙之處是這個值兩端都是一樣的)
4、A產生對稱加密密鑰,用密鑰X加密這個對稱的加密密鑰——發送到B
5、B用密鑰X解密——得到對稱的加密密鑰
6、B用這個對稱的加密密鑰來解密A的數據
I. 常見的加密演算法、原理、優缺點、用途
在安全領域,利用密鑰加密演算法來對通信的過程進行加密是一種常見的安全手段。利用該手段能夠保障數據安全通信的三個目標:
而常見的密鑰加密演算法類型大體可以分為三類:對稱加密、非對稱加密、單向加密。下面我們來了解下相關的演算法原理及其常見的演算法。
在加密傳輸中最初是採用對稱密鑰方式,也就是加密和解密都用相同的密鑰。
1.對稱加密演算法採用單密鑰加密,在通信過程中,數據發送方將原始數據分割成固定大小的塊,經過密鑰和加密演算法逐個加密後,發送給接收方
2.接收方收到加密後的報文後,結合解密演算法使用相同密鑰解密組合後得出原始數據。
圖示:
非對稱加密演算法採用公鑰和私鑰兩種不同的密碼來進行加解密。公鑰和私鑰是成對存在,公鑰是從私鑰中提取產生公開給所有人的,如果使用公鑰對數據進行加密,那麼只有對應的私鑰(不能公開)才能解密,反之亦然。N 個用戶通信,需要2N個密鑰。
非對稱密鑰加密適合對密鑰或身份信息等敏感信息加密,從而在安全性上滿足用戶的需求。
1.甲使用乙的公鑰並結合相應的非對稱演算法將明文加密後發送給乙,並將密文發送給乙。
2.乙收到密文後,結合自己的私鑰和非對稱演算法解密得到明文,得到最初的明文。
圖示:
單向加密演算法只能用於對數據的加密,無法被解密,其特點為定長輸出、雪崩效應(少量消息位的變化會引起信息摘要的許多位變化)。
單向加密演算法常用於提取數據指紋,驗證數據的完整性、數字摘要、數字簽名等等。
1.發送者將明文通過單向加密演算法加密生成定長的密文串,然後傳遞給接收方。
2.接收方將用於比對驗證的明文使用相同的單向加密演算法進行加密,得出加密後的密文串。
3.將之與發送者發送過來的密文串進行對比,若發送前和發送後的密文串相一致,則說明傳輸過程中數據沒有損壞;若不一致,說明傳輸過程中數據丟失了。
圖示:
MD5、sha1、sha224等等
密鑰交換IKE(Internet Key Exchange)通常是指雙方通過交換密鑰來實現數據加密和解密
常見的密鑰交換方式有下面兩種:
將公鑰加密後通過網路傳輸到對方進行解密,這種方式缺點在於具有很大的可能性被攔截破解,因此不常用
DH演算法是一種密鑰交換演算法,其既不用於加密,也不產生數字簽名。
DH演算法通過雙方共有的參數、私有參數和演算法信息來進行加密,然後雙方將計算後的結果進行交換,交換完成後再和屬於自己私有的參數進行特殊演算法,經過雙方計算後的結果是相同的,此結果即為密鑰。
如:
安全性
在整個過程中,第三方人員只能獲取p、g兩個值,AB雙方交換的是計算後的結果,因此這種方式是很安全的。
答案:使用公鑰證書
公鑰基礎設施是一個包括硬體、軟體、人員、策略和規程的集合
用於實現基於公鑰密碼機制的密鑰和證書的生成、管理、存儲、分發和撤銷的功能
簽證機構CA、注冊機構RA、證書吊銷列表CRL和證書存取庫CB。
公鑰證書是以數字簽名的方式聲明,它將公鑰的值綁定到持有對應私鑰的個人、設備或服務身份。公鑰證書的生成遵循X.509協議的規定,其內容包括:證書名稱、證書版本、序列號、演算法標識、頒發者、有效期、有效起始日期、有效終止日期、公鑰 、證書簽名等等的內容。
1.客戶A准備好要傳送的數字信息(明文)。(准備明文)
2.客戶A對數字信息進行哈希(hash)運算,得到一個信息摘要。(准備摘要)
3.客戶A用CA的私鑰(SK)對信息摘要進行加密得到客戶A的數字簽名,並將其附在數字信息上。(用私鑰對數字信息進行數字簽名)
4.客戶A隨機產生一個加密密鑰(DES密鑰),並用此密鑰對要發送的信息進行加密,形成密文。 (生成密文)
5.客戶A用雙方共有的公鑰(PK)對剛才隨機產生的加密密鑰進行加密,將加密後的DES密鑰連同密文一起傳送給乙。(非對稱加密,用公鑰對DES密鑰進行加密)
6.銀行B收到客戶A傳送過來的密文和加過密的DES密鑰,先用自己的私鑰(SK)對加密的DES密鑰進行解密,得到DES密鑰。(用私鑰對DES密鑰解密)
7.銀行B然後用DES密鑰對收到的密文進行解密,得到明文的數字信息,然後將DES密鑰拋棄(即DES密鑰作廢)。(解密文)
8.銀行B用雙方共有的公鑰(PK)對客戶A的數字簽名進行解密,得到信息摘要。銀行B用相同的hash演算法對收到的明文再進行一次hash運算,得到一個新的信息摘要。(用公鑰解密數字簽名)
9.銀行B將收到的信息摘要和新產生的信息摘要進行比較,如果一致,說明收到的信息沒有被修改過。(對比信息摘要和信息)
答案是沒法保證CA的公鑰沒有被篡改。通常操作系統和瀏覽器會預制一些CA證書在本地。所以發送方應該去那些通過認證的CA處申請數字證書。這樣是有保障的。
但是如果系統中被插入了惡意的CA證書,依然可以通過假冒的數字證書發送假冒的發送方公鑰來驗證假冒的正文信息。所以安全的前提是系統中不能被人插入非法的CA證書。
END
J. Diffie-Hellman密鑰協商演算法
目前常用的加密演算法主要有:哈希算改首褲法(比如MD5、SHA族、Hmac),對稱加密演算法(比如AES),非對稱加密演算法(RSA),以及Diffie-Hellman密鑰協商演算法等等,這幾種演算法都有各自的特點,適合的場景也不一樣,這里只做簡單的介紹,想詳細了解的話,網上資料很多,可以自行查看相關的資料。
各類演算法的特點:
哈希演算法:正向快速,不可逆性,即加密後是很難解密出明文的。經常用於數據加密和數據校驗。
對稱加密演算法:AES是一種常用的對稱加密演算法,其特點是加解密都用同一個密鑰。
非對稱加密演算法RSA:RSA演算法是一種非對稱加密演算法,由一個私鑰和一個公鑰構成的密鑰對,通過私鑰加密,公鑰解密,或者通過公鑰加密,私鑰解密。其中,公鑰可以公開,私鑰必須保密。
Diffie-Hellman密鑰協商演算法:Diffie-Hellman是一種密鑰協商演算法(簡稱DH演算法),DH演算法基於一種數學原理,能夠在雙方不泄露密鑰的情況下協商出一種密鑰來。
在客戶端向伺服器端發送數據的過程中,如果是比芹豎較重要的數據(比如密碼,敏感數據等),核簡一般需要先在客戶端進行加密後再發送,伺服器接收到數據後再進行解密得到原始數據。(反過來伺服器返回數據給客戶端也是一樣的道理)
這里假設客戶端和伺服器端採用AES(對稱加密演算法)進行加解密傳輸的數據,AES加密演算法有一個特點就是加解密都用同一個密鑰(這里把該密鑰稱作secretKey),所以雙方都通過secretKey進行數據加解密。
因此在客戶端向伺服器第一次傳輸數據的時候,客戶端需要先向伺服器端獲取secretKey,並且保存在客戶端,而這種直接向伺服器獲取明文secretKey的過程是很容易被第三者攔截的,也就是說這一過程是不安全的。(哈哈,除非是伺服器把secretKey寫到紙上,親手偷偷地遞給客戶端)
因此呢,客戶端向伺服器獲取secretKey的這一過程,也是需要進行加密的。
那麼,伺服器需要怎麼做才能把secretKey安全的送達客戶端呢?
目前常採用的方法有:RSA 或 Diffie-Hellman
RSA有一個公鑰和一個私鑰,公鑰是允許公開出去的,私鑰是保留的。RSA的要點在於用公鑰加密的數據需要用私鑰解密,用私鑰加密的數據,需要用公鑰解密。因此,比如這時候客戶端把公鑰發送給伺服器,伺服器利用客戶端的公鑰對secretKey進行加密,那麼這份加密後的secretKey數據,就只有客戶端的私鑰能解開啦。即使第三者拿到了這份數據也解密不了,除非能獲取到客戶端的私鑰。
所以,通過RSA的方式,伺服器就能把secretKey安全的傳遞到客戶端的手裡啦。(不過,RSA也是有安全漏洞的,被稱作中間人攻擊,由於篇幅原因,這里就先不講啦!大家自行網路。)
雖然使用RSA能夠安全的傳輸secretKey密鑰,但是麻煩點在於需要生成一對公鑰和私鑰,並且把公鑰發送給對方,而且加解密速度比較慢。所以,介紹第二種:Diffie-Hellman密鑰協商演算法。
嚴格來說,DH演算法其實並不是一種加密演算法,因為它本身並不是用於加密的,我的理解是用於雙方協商計算,即雙方按照某種合約進行計算,從而計算出一種相同的結果。
原理如下:
第一步:初始化
比如現在伺服器提供了兩個隨機公鑰數字(允許公開):pubN=10,modN=3;
客戶端自己生成了一個隨機私鑰數字(不可公開,伺服器也不知道):cPrivN=2;
伺服器端也自己生成了一個隨機私鑰數字(不可公開,客戶端也不知道):sPrivN=4;
第二步:客戶端、伺服器端分別基於相同的數學公式進行計算,計算結果稱作公鑰結果:pubResult
客戶端進行數學計算:cPubResult = pubN * cPrivN % modN = 10 * 2 % 3 = 2;(計算結果允許公開)
伺服器進行數學計算:sPubResult = pubN * sPrivN % modN = 10 * 4 % 3 = 1;(計算結果允許公開)
客戶端和伺服器端交換公鑰結果,客戶端得到sPubResult=1,伺服器端得到cPubResult=2。
第三步:協商出一致的密鑰數字:keyN(客戶端和伺服器端得出的結果是一致的)
客戶端:cKeyN = sPubResult * cPrivN % modN= 1 * 2 % 3 = 2;
伺服器:sKeyN = cPubResult * sPrivN % modN= 2 * 4 % 3 = 2;
到目前為止呢,雙方都協商出了密鑰,並且是一致的,但是呢,有沒有見過密鑰是number類型的?想必都沒有吧,所以需要進行第四步,生成更長的密鑰。
第四步:對密鑰數字進行hash生成密鑰串