❶ HTTPS的前世今生和原理詳解
HTTPS網路:
HTTP是明文傳輸的協議,數據很容易被竊聽和篡改,並且攻擊者很容易冒充客戶端和服務端,HTTPS可以解決這兩個的安全問題。HTTS仍是HTTP協議,只是在HTTP與TCP之間添加了用於加密數據的TSL/SSL協議。很多其它應用層的協議也採用在傳輸層之上添加TSL/SSL協議來保證安全,如FTPS、IMAPS。
加密和解密使用的是同一個密鑰。加密和解密的雙發都需要持有同一個密鑰。常見對稱加密演算法:AES、DES、3DES。
加密和解密使用的是不同的密鑰,加密時使用的密鑰稱為公鑰匙,解密是使用的密鑰稱為私鑰。使用公鑰加密的密文只能用私鑰解開。公鑰可以發布出去使用,但私鑰一定不能泄漏。常見的非對稱加密演算法:RSA、背包演算法、ECC。
數字簽名用於校驗數據是否被篡改,即數據是否和原數據是否一致。
數字簽名包含簽名和驗證兩個運算。數字簽名具有不可抵賴性,簽名驗證正確後就不能否認。
數字簽名一般包含一個自己知道的私鑰和一個公開的公鑰,與傳統的加密不同的是簽名時使用私鑰,驗證簽名是使用公鑰。
1994年Netscape提出了SSL協議並制訂了SSL協議的原始規范,即SSL1.0。但由於SSL1.0使用的是弱加密演算法而受到密碼學界的質疑,所以SSL1.0並沒有公共發布。
SSL1.0之後Netscape對SLL協議規范進行了重大改近,並在1995年發布 SSL2.0協議 。雖然SSL2.0版本被認為是一個相當強大且健壯的協議,但仍存在一些易受攻擊的漏洞,所以並沒有得到廣泛的使用。
由於SSL2.0的安全問題,Netscape聯合哈佛的Paul Kocher等人重新設計了SSL協議,並在1996年發布,即SSL3.0版本,該版本較2.0版本有較大的差別。 SSL 3.0協議 獲得了互聯網廣泛認可和支持。
隨著互聯網的飛速發展,網路安全越來越重要,業界非常迫切的需要一個標準的安全協議,於是IETE接手了SSL協議,並將其更名為 TSL(Transport Layer Security Protocol,安全傳輸層協議 ,並在1999年發布了TSL1.0版本。
不過TSL1.0於SSL3.0差別並不大(TLS 1.0 內部的協議版本號其實是3.1)。
雖然TSL是SSL的升級,但一些稱呼上還存在混淆,所以大家通常將二者統稱為SSL/TLS協議。
TSL1.1 於2006年發布,主要是修復了一些漏洞。
TSL1.2於2008年發布,1.2版本主要移除了一些老舊的加密套件,並引入了 AEAD 加密模式。1.2版本是目前應用最廣泛的版本。
TSL1.3 於2018年發布。1.3版本在2014年提出,經4年的反復修改直到第28個草案才於2018年正式納入標准。
1.3版本相較1.2版本有很大的改動,即增強了安全性也也大大提升了訪問速度。主要有以下改動:
在公網通訊時想要保證通信信道的安全,目前來看只有將通信的數據進行加密後可防止竊聽、冒充和篡改。
防止竊聽:
數據加密後傳輸的就是加密後的密文,這些密文即使被竊聽了但在沒有解密的密鑰的情況下是得不到真正的內容的。
防冒充和篡改:
通訊的數據加密後傳輸,在沒有加密用的秘鑰的情況下時無法構造出合法的數據包的,也就無法冒充或篡改數據。
將通信數據加密後傳輸可以解決很多的安全問題,但要實現通信的加密最為關鍵的點在於通信的雙發用於加密的密鑰怎麼協商才能保證密鑰不被泄漏和篡改那?密鑰協商是HTTPS中最大的難點。
通信時使用對稱加密,並且在客戶端請求時直接將對稱加密的密鑰返回給客戶端。
但在安全的信道建立起來之前任何傳輸仍是明文的,使用明文風發密鑰毫無安全性可言,並且由對稱加密使用同一個密鑰,所以第三方在竊聽到密鑰後即可以竊聽和篡改數據也可以冒充客戶端和服務端。 所以直接分發對稱加密的密鑰顯然行不通。
為方便說明這里只看客戶端單向向服務端發送數據的情況,服務端向客戶端發送數據與其類似。
通信時使用非對稱加密,在客戶端請求時將公鑰放回給客戶端。
但返回公鑰時仍然是明文傳輸的,所以公鑰還是很容易就會被泄漏,泄漏了公鑰後,雖然第三方無在沒有密鑰的情況下是沒法竊聽數據或直接冒充服務端,但由於泄漏了公鑰第三方還是可以冒充客戶端或者進行『中間人』攻擊。
所以單純使用非對稱加密也是行不通的。
'中間人』攻擊:
只要通信時使用的密鑰不泄漏,那麼在通信時完全沒必要使用非對稱加密,畢竟對稱加密的效率更高。所以可以在通信正式開始前使用非對稱加密來協商出通信時使用的對稱加密的密鑰,步驟如下:
雖然對稱加密與非對稱加密結合可以使我們或得兩種的優點,但這樣還是無法避免『中間人』攻擊。
DH密鑰協商演算法不會直接交互密鑰,而是交互用於生產密鑰的參數,DH演算法基於當前『無法』對大數進行質數分解來保證即使參數泄漏了,第三方也無法通過參數推導出密鑰。
DH演算法密鑰協商步驟:
通過以上步驟客戶端和服務端就協商出了密鑰s,並且整個過程中沒有傳輸過s。為了防止被破解a和b通常非常大,p 是一個至少 300 位的質數,g一般很小通常是3或者5.
但DH演算法的缺點也很明顯,DH無法防止冒充,還是會受到中間人攻擊。
數字證書(digital certificate),又稱公開密鑰認證(Public key certificate)或身份證書(identity certificate),用來下發公鑰匙和證明公鑰擁有者的身份。
證書由第三機構頒發用來驗證服務提供方的合法性,使用時服務提供方將證書給到客戶端,客戶端通過特定的機制驗證書的合法性,從而信任提供證書的服務端和證書中的公鑰。
數字證書以文件的形式存在,證書文件中包含了公鑰信息、擁有者身份信息(主體)、以及數字證書認證機構(發行者)對數字證書自身的數字簽名,證書的數字簽名用來保證證書沒有被篡改。
一般我們向CA申請證書時不用我們我們提供公鑰和私鑰,CA會給我們分配一個密鑰對,並將公鑰寫到證書中,然後將證書和私鑰給我們。
證書有統一的標准,其合法性(證書是否過期、數字簽名是否有效、頒發的機構是否可信)通過一定的程序按標准來進行驗證,如瀏覽器會保證HTTPS證書是否是合法的,linux下openSSL庫提供了證書驗證功能。
核對證書後若證書可信,就可以使用證書中的公鑰對數據進行加密與證書的擁有者進行通信。
HTTPS的證書在擴展欄位中包含了域名相關的信息,所以HTTPS的證書在申請的時候CA會嚴格的校驗申請的機構或個人是否真的擁有這個域名。
數字證書認證機構(英語:Certificate Authority,縮寫為CA)。證書標準是公開的任何人都可以去製作證書,但自己製作的證書是不受信任的,只有權威的CA機構頒發的證書才被信任。
權威的CA證書審核和部署流程嚴苛而繁雜,所以權威的根證書的有效期一般在幾十年內。
也只有權威的CA的根證書會被各大操作系統支持,將其預制與操作系統內。
證書一般遵循X.509規范,主要包含以下內容:
CA生成的證書包含以上內容和一些擴展欄位外,還包含CA使用自己的私鑰對這些內容進行加密後的密文。在驗證證書時使用CA的根證書對秘文進行驗證,從而判斷證書是否是合法的。
權威結構使用根證書來簽發二級CA證書,二級CA證書可以給其它服務簽發證書。但不是所有證書都可以繼續簽發新的證書,證書使用基礎約束擴展來限制證書的簽發,我們普通申請到證書基礎約束擴展都是False的。查看根證書的基本約束可以看到證書頒發機構為『是』。
根證書並不直接簽發服務的證書,只要基於以下兩點:
上一級證書對下一級證書進行簽名,簽名值包含在證書中,可以使用上一級證書中的公鑰來驗證下一級證書的簽名值。根證書的簽名是自己簽的,並且驗證簽名的公鑰包含在根證書中。
完整的證書連的關系應該有伺服器放回,但有的並沒有返回,對於沒有放回完整證書連的證書,證書中的擴展欄位CA 密鑰標識符( Authority Key Identifier)記錄了證書的上一個證書,通過該欄位獲取到上一級中間證書,再從中間證書的該欄位中繼續向上查找,直到根證書。
服務端最好可以返回證書連,這樣可以避免瀏覽器自己去查找,提示握手速度。伺服器返回的證書鏈並不包含根證書,根證書預至與操作系統內部。
在linux中openssl庫會集成根證書。openssl的根證書的存放路徑通過『openssl version -a』查看。
校驗證書時先根據證書鏈逐級校驗證書的簽名,簽名校驗的最關鍵的在根證書。根證書預至於操作系統中,CA要將自己的證書預至與各個系統中是非常困難的,所以預支與系統中的根證書是可信的。
回顧一下對於HTTPS的證書來說申請的時候CA會嚴苛的驗證,保證這個域名是屬於申請這個證書的機構的。這樣攻擊者或許可以偽造一個改域名的證書,但偽造的證書的根證書在系統中並不會存在,所以偽造的證書是不會被信任的。這樣通過證書鏈的校驗就可以有效的防止服務端被『冒充』。
經過上面證書數字簽名驗證只是驗證了證書確實是合法的證書,後還要驗證證書的有效性,有效性驗證主要包括以下欄位:
驗證合法的證書也可能由於種種原因被吊銷,如證書的私鑰泄漏了、證書錯發了等,為了驗證證書是否有效引入了證書吊銷機制。
OSCP是證書提供方提供的證書驗證介面,用戶通過調用OSCP介面驗證證書是否被吊銷了。
但OCSP服務可能因為策略或服務故障導致無法訪問,這時一般瀏覽器會選擇信任證書,畢竟證書被吊銷的情況只是極少數。也有部分CA將OCSP失敗後的策略寫到證書的擴展欄位中,用用戶根據擴展欄位去做處理。
OSCP方式有自己明顯的缺陷,為了驗證證書而請求OSCP的同時也將自己在什麼時候訪問了什麼服務也告訴了CA,CA利用我們的訪問數據作惡咋辦,還有OCSP的介面很慢的話不就拖慢了我們服務的相應數獨。為了解決這兩個問題各大CA廠商聯手推出了CRL方案。
CRL方案是將被吊銷的證書列表定期拉去到本機,一般是幾天拉取一次。在校驗證書時去本機列表中查找。
CA會在證書的擴展欄位中寫入CRL更新的地址:
CRL也有自己明顯的確定,首先CRL是定期拉取的不能保證實時生效,然後CRL的列表一般很大可能達到數M。
CRLSet是chrome自建自用的解決方案。google覺得CRL更新太慢了,每個CA都有自己的CRL並且CRL內容也太多了。於是自己搞了一個CRLSet,將各大CA被吊銷的高風險證書添加到CRLSet中,chrome在校驗證書時可以去自己CRLSet中校驗。
CRLSet只有各個CA吊銷的證書的部分,大概包含所有吊銷證書的2%。
CRLSet的更新相對快一些,最慢幾個小時就會從各個CA中更新一次,CRLSet可以用在需要緊急吊銷證書的情況下讓吊銷快速生效。
CRLSet提供了 https://github.com/agl/crlset-tools 工具來拉取和校驗證書是否在CRLSet中。
可以在 chrome://components/ 中更新chrome的CRLSet
客戶端向服務端發送hello請求,裡麵包含了客戶端SSL/TSL的版本、支持的加密套件和一個隨機數Random1
服務端收到客戶端的hello後,根據客服端支持的加密套件和自己支持的加密套件選擇出後面使用的加密和散列套件並返回給客戶端,同時返回的還有服務端生產的一個隨機數 Random2
服務端向客戶端返回自己的證書,客戶端收到證書後通過校驗證書來信任服務端,並從證書中獲取到證書中的公鑰。
服務端在返回證書後會立即向客戶端發送該請求。不過該請求不是必須的,只有選擇的加密套件需要額外的參數是才會發送該請求交互參數。
如果密鑰協議商演算法是DH演算法,那麼DH的參數就在該請求中返回給客戶端,DH演算法有以下幾種:DHE_DSS、DHE_RSA、ECDHE_ECDSAECDHE_RSA
dh演算法會返回dh的參數p、g、dh的公鑰和公鑰的簽名,公鑰即g^b mod p,b為服務端的隨機數
這里g就是0X03,p就是0X0017。
服務端在發送完上述信息後,就會立馬發送Server Hello Done,來告知客戶端服務端的相關信息已經發送完畢,就等客戶端開始做密鑰協商了。
客戶端在收到該消息後就開始驗證證書,協商密鑰等工作。
在接受到伺服器的Server Hello Done信息之後,客戶端會計數出預備主密鑰,並將其返回給服務端。
如果使用的是RSA/ECDSA演算法,那麼發送的就是預備主密鑰。
如果使用的是DH演算法,那麼發送的就是通過之前的參數計數出來的公鑰匙,即B( g^b mod p)服務端在收到B後通過 B ^ a mod p得到第三個隨機數。而客戶端已經通過s = A b mod 得到了s。
到了這里服務端和客戶端已經得到了三個隨機數,通過之前協商好的加密演算法使用這個三個隨機數就得到一個對稱加密的密鑰,後面通信時就使用該密鑰。
該請求用於通知對方已經計數出通信用的密鑰,接下來的通信都使用該密鑰進行。服務端和客戶端都會發出該請求,一般是服務端先發出。
在完成上述步驟以後,雙發都會發送一個Finished請求給對方,Finished的數據是通過協商好的密鑰加密的,以此來驗證之前協商好的密鑰、協議版本是否是有效的。
參考資料:
❷ 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 位已經不太安全了。
❸ 什麼是dh演算法
DH組的本質是使用非對稱密鑰來加密對稱密鑰。
DH演算法過程:
1、相互產生密鑰對
2、交換公鑰
3、用對方的公鑰和自己的私鑰運行DH演算法——得到另外一個密鑰X(這里的奇妙之處是這個值兩端都是一樣的)
4、A產生對稱加密密鑰,用密鑰X加密這個對稱的加密密鑰——發送到B
5、B用密鑰X解密——得到對稱的加密密鑰
6、B用這個對稱的加密密鑰來解密A的數據
❹ 簡要介紹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共有一個公鑰基礎設施時,他們可以將他們的返回密鑰進行簽名。
❺ 非對稱加密演算法 (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
❻ 什麼是DH非對稱加密演算法
DH(僅能用於密鑰分配,不能加解密數據)
非對稱加密演算法
特點:
發送方和接收方均有一個密鑰對(公鑰+私鑰),其中公鑰傳播,私鑰自己保存,不需要傳播
私鑰不需要傳播的特性解決了對稱加密演算法中密鑰傳播的困難(這個困難一般通過線下傳遞可以解決)
加密安全性極高,只用於一些電子商務網站,加解密速度遠低於對稱加密
一般情況下,為了解決非對稱加密演算法加解密速度低的問題,採用非對稱加密(使用公鑰+私鑰對對稱加密的密鑰進行加解密)+對稱加密(加解密數據)相結合的方式。
常見演算法:
DH(非對稱加密的基石)
RSA(非對稱加密的經典,除了可用於非對稱加密,也可用於數字簽名,RSA--155(512位密鑰)已被破解)
ElGamal