A. 什麼是非對稱加密
非對稱加密演算法是一種密鑰的保密方法。
非對稱加密演算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種演算法叫作非對稱加密演算法。 非對稱加密演算法實現機密信息交換的基本過程是:甲方生成一對密鑰並將其中的一把作為公用密鑰向其它方公開;得到該公用密鑰的乙方使用該密鑰對機密信息進行加密後再發送給甲方;甲方再用自己保存的另一把專用密鑰對加密後的信息進行解密。
另一方面,甲方可以使用乙方的公鑰對機密信息進行簽名後再發送給乙方;乙方再用自己的私匙對數據進行驗簽。
甲方只能用其專用密鑰解密由其公用密鑰加密後的任何信息。 非對稱加密演算法的保密性比較好,它消除了最終用戶交換密鑰的需要。
非對稱密碼體制的特點:演算法強度復雜、安全性依賴於演算法與密鑰但是由於其演算法復雜,而使得加密解密速度沒有對稱加密解密的速度快。對稱密碼體制中只有一種密鑰,並且是非公開的,如果要解密就得讓對方知道密鑰。所以保證其安全性就是保證密鑰的安全,而非對稱密鑰體制有兩種密鑰,其中一個是公開的,這樣就可以不需要像對稱密碼那樣傳輸對方的密鑰了。這樣安全性就大了很多。
B. 非對稱加密演算法
非對稱加密演算法是一種密鑰的保密方法。
非對稱加密演算法需要兩個密鑰:公開密鑰(publickey:簡稱公鑰)和私有密鑰(privatekey:簡稱私鑰)。公鑰與私鑰是一對,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種演算法叫作非對稱加密演算法。
非對稱加密演算法實現機密信息交換的基本過程是:甲方生成一對密鑰並將公鑰公開,需要向甲方發送信息的其他角色(乙方)使用該密鑰(甲方的公鑰)對機密信息進行加密後再發送給甲方;甲方再用自己私鑰對加密後的信息進行解密。甲方想要回復乙方時正好相反,使用乙方的公鑰對數據進行加密,同理,乙方使用自己的私鑰來進行解密。
另一方面,甲方可以使用自己的私鑰對機密信息進行簽名後再發送給乙方;乙方再用甲方的公鑰對甲方發送回來的數據進行驗簽。
甲方只能用其私鑰解密由其公鑰加密後的任何信息。 非對稱加密演算法的保密性比較好,它消除了最終用戶交換密鑰的需要。
非對稱密碼體制的特點:演算法強度復雜、安全性依賴於演算法與密鑰但是由於其演算法復雜,而使得加密解密速度沒有對稱加密解密的速度快。對稱密碼體制中只有一種密鑰,並且是非公開的,如果要解密就得讓對方知道密鑰。
所以保證其安全性就是保證密鑰的安全,而非對稱密鑰體制有兩種密鑰,其中一個是公開的,這樣就可以不需要像對稱密碼那樣傳輸對方的密鑰了。這樣安全性就大了很多。
C. 電子商務非對稱加密的原理
電子商務非對稱加密演算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種演算法叫作非對稱加密演算法。 非對稱加密演算法實現機密信息交換的基本過程是:甲方生成一對密鑰並將其中的一把作為公用密鑰向其它方公開;得到該公用密鑰的乙方使用該密鑰對機密信息進行加密後再發送給甲方;甲方再用自己保存的另一把專用密鑰對加密後的信息進行解密。
另一方面,甲方可以使用乙方的公鑰對機密信息進行簽名後再發送給乙方;乙方再用自己的私匙對數據進行驗簽。
甲方只能用其專用密鑰解密由其公用密鑰加密後的任何信息。 非對稱加密演算法的保密性比較好,它消除了最終用戶交換密鑰的需要。
電子商務非對稱加密的原理:
1.A要向B發送信息,A和B都要產生一對用於加密 非對稱加密演算法 和解密的公鑰和私鑰。
2.A的私鑰保密,A的公鑰告訴B;B的私鑰保密,B的公鑰告訴A。
3.A要給B發送信息時,A用B的公鑰加密信息,因為A知道B的公鑰。
4.A將這個消息發給B(已經用B的公鑰加密消息)。
5.B收到這個消息後,B用自己的私鑰解密A的消息。其他所有收到這個報文的人都無法解密,因為只有B才有B的私鑰。
D. 簽電子合同時電子簽名是怎麼保證安全的
簡單來說,電子簽名是利用哈希演算法與加密演算法實現的電子文件上直接簽字、蓋章的技術。為了保障簽署後的電子文件具備法律有效性,使用電子簽名簽署後的電子文件還需要具備簽署身份可識別、簽署內容不可篡改的特性。
但是,通過上述技術名詞解釋並不能直觀、易懂的說明電子簽名的原理,以下是通過還原電子簽名簽署的過程簡介電子簽名是如何保證安全保密的:
場景:由於業務需要,你和我需要簽署一份合作協議。為方便起見,你將擬好的電子版合同文本在線發送給我簽署。
怎樣確保合同只有我可查看且不被他人惡意竊取?我又怎樣才能確定文件的發送人就是你呢?
關鍵點1:公鑰私鑰登場
為了滿足電子合同內容保密性和發送人認證的要求,我們了解到非對稱加密的加密方式。
非對稱加密:具有唯一對應的一對秘鑰,一個公鑰一個私鑰,公鑰所有人可見,而私鑰僅自己可見。
非對稱加密具有這樣的特性:用公鑰加密的文件只能用私鑰解密,而私鑰加密的文件只能用公鑰解密。
發送合同時,你將擬好的電子合同使用自己的私鑰加密後發送;接收合同時,如果能夠使用你的公鑰解密,則說明這份文件就是你發送的。
但是,我怎麼才能知道你的公鑰呢?
關鍵點2:政府出了個CA來幫忙
我了解到,政府授權了一個權威機構叫CA,可以提供網路身份認證的服務。
CA (Certificate Authority) :全稱證書管理機構,即數字證書的申請、簽發及管理機關。其主要功能為: 產生密鑰對、生成數字證書、分發密鑰、密鑰管理等。
數字證書:是由CA機構頒發的證明,它包含公鑰、公鑰擁有者名稱、CA 的數字簽名、有效期、授權中心名稱、證書序列號等信息,可以通俗為理解個人或企業在「網路身份證」。
我向CA機構申請獲取你的公鑰,使用它對電子合同解密,解密成功則說明發送人就是你。文件發送人的身份確認了,那怎麼保障電子合同傳輸過程中未被篡改呢?
關鍵點3:哈希兄弟出場
有技術人員推薦了哈希演算法(摘要演算法),可以證明電子合同傳輸過程中是否被篡改。
哈希演算法:通過加密演算法將文本內容生成為一段代碼,即信息摘要,其主要特徵是加密過程不需要密鑰,經加密的數據無法被反向還原。也就是說,只有兩份完全相同的合同經過相同的哈希演算法才能得到相同的摘要。
發送合同時,你將電子合同原文和經哈希運算的摘要一起發送給我接收合同時,通過對合同原文進行同樣的哈希運算得到新的摘要,對比兩組摘要是否一致即可證明我接收的文件是否被篡改
但是,如果傳輸過程中文件原文與摘要同時被替換了怎麼辦?
關鍵點4:對稱加密來幫忙
除了上述的哈希演算法、非對稱加密、CA,為確保合同由發送到接收滿足三個要求,即:由你發送、只能發給我、不能被篡改,我們還需要應用新的加密方式:對稱加密。
對稱加密:採用單鑰密碼系統的加密方法,信息的加密和解密只能使用同一個密碼。
發送文件時:
1、你通過哈希運算得到原文摘要並使用私鑰對其加密,得到你的數字簽名,再將數字簽名和合同原文進行對稱加密,得到密文A——對原文加密
2、再通過CA獲得我的公鑰,對上述步驟中對稱加密的秘鑰進行非對稱加密,即我的「數字信封」——對秘鑰加密
3、將密文A和我的數字信封一起發送給我
數字簽名:用哈希演算法提取出源文件的摘要並用發送人的私鑰進行加密後的內容。
數字信封:用接收方的公鑰加密對稱秘鑰」,這就叫「給乙的數字信封。
接收文件時:
1、我使用自己的私鑰解密數字信封得到對稱秘鑰——能解開,說明是發給我的
2、再使用對稱秘鑰解密密文A,得到帶有你的數字簽名的原文
3、使用你的公鑰解密你的數字簽名,得到簽名中的原文摘要——能解開,說明發送者是你
4、使用相同的摘要演算法獲取原文摘要並與解密簽名中的摘要對比——摘要一致,則說明原文沒有被篡改
除了文件內容不可篡改,精確記錄簽署時間固定合同生效期限也十分重要,網路環境中怎樣怎麼確保合同簽署時間不可篡改呢?
關鍵點5:時間戳來證明
我又請教了專家,原來我們國家還有專門確定時間的法定授時中心,它可以在我們簽署的文件上加蓋「時間印跡」,即時間戳。
時間戳(time-stamp):書面簽署文件的時間是由簽署人自己寫上,而數字時間戳則由第三方認證單位(DTS)添加,以DTS收到文件的時間為依據,更精準、更有公信力。
至此,我們簽合同的時間精準記錄、合同內容不可篡改、雙方身份也真實有效,這下沒問題了!但是,簽署完的電子合同怎麼存儲呢?不管是哪一方簽署,日後產生糾紛都難免對合同存儲期間的安全性產生質疑。
關鍵點6:找個權威第三方來存證
聽說有專門的第三方電子數據存證機構,可以保存已簽署的電子合同數據,當用戶雙方對合同內容產生爭議時可申請出具具有公信力的證明。
合同簽署的最後一個問題:存儲問題也解決了!但唯一不足之處就是:簽署過程太麻煩!為保障電子合同有效性,我們用到了非對稱加密、哈希運算、時間戳等技術,還要CA機構、公證處等機構協助;
怎樣更簡單快捷地簽一份有效的電子合同呢?
關鍵點7:選擇可靠的第三方電子合同平台
根據《電子簽名法》規定,使用可靠的電子簽名簽署的電子合同具備與手寫簽字或蓋章的紙質合同同等的法律效力。
根據《電子簽名法》規定,符合下列條件的,視為可靠的電子簽名:
1)電子簽名製作數據用於電子簽名時,屬於電子簽名人專有
2)簽署時電子簽名製作數據僅由電子簽名人控制
3)簽署後對電子簽名的任何改動能夠被發現
4)簽署後對數據電文內容和形式的任何改動能夠被發現
結合上述電子合同簽署過程,我們可歸納總結有效的電子合同應關注以下幾個核心點:內容保密性、內容防篡改、明確簽訂身份、明確簽訂時間。
同時,為保障電子合同作為書面形式的證據能力,合同簽署全程還應當由權威第三方機構存儲公證。
商務部在《電子合同在線訂立流程規范》指出:「通過第三方(電子合同服務提供商)的電子合同訂立系統中訂立電子合同,才能保證其過程的公正性和結果的有效性」。
E. 電子合同中,對稱加密、非對稱加密、哈希演算法、CA、時間戳、數字簽名這些是什麼,有什麼用,你們知道嗎
演算法,因為只要你有足夠的時間,完全可以用窮舉法來進行試探,如果說一個加密演算法是牢固的,一般就是指在現有的計算條件下,需要花費相當長的時間才能夠窮舉成功(比如100年)。一、主動攻擊和被動攻擊數據在傳輸過程中或者在日常的工作中,如果沒有密碼的保護,很容易造成文件的泄密,造成比較嚴重的後果。一般來說,攻擊分為主動攻擊和被動攻擊。被動攻擊指的是從傳輸信道上或者從磁碟介質上非法獲取了信息,造成了信息的泄密。主動攻擊則要嚴重的多,不但獲取了信息,而且還有可能對信息進行刪除,篡改,危害後果及其嚴重。 二、對稱加密基於密鑰的演算法通常分為對稱加密演算法和非對稱加密演算法(公鑰演算法)。對成加密演算法就是加密用的密鑰和解密用的密鑰是相等的。比如著名的愷撒密碼,其加密原理就是所有的字母向後移動三位,那麼3就是這個演算法的密鑰,向右循環移位就是加密的演算法。那麼解密的密鑰也是3,解密演算法就是向左循環移動3位。很顯而易見的是,這種演算法理解起來比較簡單,容易實現,加密速度快,但是對稱加密的安全性完全依賴於密鑰,如果密鑰丟失,那麼整個加密就完全不起作用了。比較著名的對稱加密演算法就是DES,其分組長度位64位,實際的密鑰長度為56位,還有8位的校驗碼。DES演算法由於其密鑰較短,隨著計算機速度的不斷提高,使其使用窮舉法進行破解成為可能。三、非對稱加密非對稱加密演算法的核心就是加密密鑰不等於解密密鑰,且無法從任意一個密鑰推導出另一個密鑰,這樣就大大加強了信息保護的力度,而且基於密鑰對的原理很容易的實現數字簽名和電子信封。比較典型的非對稱加密演算法是RSA演算法,它的數學原理是大素數的分解,密鑰是成對出現的,一個為公鑰,一個是私鑰。公鑰是公開的,可以用私鑰去解公鑰加密過的信息,也可以用公鑰去解私鑰加密過的信息。比如A向B發送信息,由於B的公鑰是公開的,那麼A用B的公鑰對信息進行加密,發送出去,因為只有B有對應的私鑰,所以信息只能為B所讀取。牢固的RSA演算法需要其密鑰長度為1024位,加解密的速度比較慢是它的弱點。另外一種比較典型的非對稱加密演算法是ECC演算法,基於的數學原理是橢圓曲線離散對數系統,這種演算法的標准我國尚未確定,但是其只需要192 bit 就可以實現牢固的加密。所以,應該是優於RSA演算法的。優越性:ECC > RSA > DES
F. 9 非對稱加密
目前為止,本書中只討論到對稱加密。假設一個密碼系統不只有一個密鑰,而是有一對密鑰,其中公鑰可以自由地發布,而私鑰由自己保管。其他人可以使用你的公鑰來加密數據,這個信息只有你的私鑰可以解密,這個被稱為 公鑰加密(public-key encryption)
很長一段時間,這都被認為是不可能的。然而從1970年開始,這一類型的演算法開始出現。第一個廣為流傳的是MIT的三位密碼學家:Ron Rivest,Adi Shamir 和Leonard Adleman提出的RSA。
公鑰演算法並不僅僅用來加密,實際上本書之前的部分已經提到過公鑰演算法而其不是直接用在加密上。有三個與公鑰演算法相關的主題
從表面來看,公鑰加密好像可以淘汰之前提到的對稱密鑰演算法。對於任何事情都可以使用公鑰加密,也不需要對稱密鑰系統中的密鑰交換過程。然而在實際的密碼學系統中,可以看到到處都是混合的加密,公鑰加密在其中起著重要作用,但是大部分的加解密以及認證工作還是基於對成密鑰演算法的。
目前來皮褲看最重要的原因是性能。與流密碼(原生的流密碼或者其他)演算法相比,公鑰加密機制實在是太慢了。RSA通常情況下需要2048位也就是256個位元組。其加密需要0.29百萬次循環,解密需要11.12百萬次循環。而對稱加密和解密只需要每位元組約10次循環。這也意味著在對稱密鑰演算法中,解密256位數據,只需要3000次循環,這個效率是非對稱版本的4000次。而目前塵握猛的密碼系統使得對稱加密更快了,在AES-GCM硬體加速或者Salsa20/ChaCha20隻需要2或者4次每位元組,更大程度上提高了性能。
實際的密碼系統中還有更多其他的問題。例如對於RSA來說,它不能加密任何比它大的信息,通常情況是小於或者等於4096位,比大部分的需求要小的多。當然最重要的問題依然是上述的速度的問題。
本節簡單描述RSA背後的數學問題。其本身並不能產生安全加密機制。之後會看到在其上構造的密碼指導OAEP。
為了產生一個key,需要挑選兩個大素數p和q,這些數需要隨機私密的挑選。將兩者相乘的到N,這個是公開的。然後選擇一個加密指數e,這個也是公開的。通常這個數是3或者65537.因為這些數的二進制形式中僅有很少量的1。計算指數會更有效。(N,e)是公鑰,任何人都可以用公鑰來加密消息M,得到密文C。
接下來的問題是解密,有一個解密指數d,可以將C轉化會M。如果指導p和q,d很容易計算。可以使用d來解密消息:
RSA的安全性依賴於對於不知道d的人來說解密操作是不可能的,並且在只知道(N,e)的情況下d的計算是非常難的。
類似於很多密碼系統,RSA依賴於特定數學問題的難度。給定密文C,和公鑰(N,e),反推出明文M。這被稱為RSA難題。
最直接的方法是將N分解為p*q。給定p和q,攻擊者只需要重復密鑰擁有者的過程來計算產生d即可。
幸運的是,沒有一個演算法可以在合理的時間內分解這么大的數。不幸的是,目前也無法證明該演算法一定不存在。更加糟糕的是,有一個理論上的演算法,被稱為Shor's Algorithm,可以在量子計算機上在合理的時間內分解一個數。目前,量子計算機還離我們有些遠,但是未來某天可能就會成為現實。到時候RSA就變得不再有效。
本節中僅僅提到了分解大數這個最直接的方式來攻擊RSA。在接下來的部分可以看到一系列針對RSA的實際攻擊,其主要依賴於一些具體的實現。
目前,沒有已知的實際的攻破RSA的方法。但這不意味著使用RSA的系統沒有被攻破過。和其他被攻破的系統一樣,應用中有很多組成部分,一旦其中的某部分沒有恰當的使用,就會使整個系統變得不可用。更多有關RSA實施的細節的,參考【Bon99】和【AV96】,本部分只提及一些有趣的部分。
Salt是一個用python寫的供應系統。它有一個模塊叫做 cypto ,它沒有使用已有的密碼學系統,而是實現了一個自己的,其中使用的RSA和AES由第三方庫提供。
很長一段時間里,Salt使派橋用的公鑰指數e是1,這也就意味著P e=P 1=P(mod N)。這也就意味著結果的密文就是明文。目前該問題已經被修復,這里只是為了提醒大家,不要實現自己的加密系統。Salt現在支持了SSH作為傳輸蹭,但是先前提到的DIY的RSA/AES系統依然存在,並且還是默認的傳輸層。
OAEP是Optimal asymmetric encryption padding的簡稱,是RSA填充的一種。它的結構類似於下圖(文檔中這個圖有問題,下面是正確的圖):
最終產生的需要被加密的數據是X||Y,是n位長,這個n是N的位數。它使用一個隨機的塊R它的長度是k,在這個標准中,k是一個定值。消息首先需要用0填充被擴充到n-k位。圖中左邊的長度為n-k位,右邊的長度為k。隨機塊R和以0擴充的M,M||000...使用兩個陷阱函數,G和H。陷阱函數都是從一個方向計算非常簡單,但是逆轉非常的難。世紀中通常為hash函數。
G的輸入是k位,輸出是n-k位,H的輸入是n-k位,輸出是k位。
然後結果的X和Y被連接在一起,然後由標準的RSA來進行加密產生密文。
解密的時候,要反過來操作。接收者收到X||Y,他們是指導k的,因為這個是協議里的定值。所以前n-k是X,後k位是Y。
想要得到M,M||000...,需要去計算
可以看出,對於一些H和G來說,需要所有的X和Y才能找到M。對於H和G有很多種基於Hash函數的選擇。
絕大多數的公鑰加密只能一次加密一小塊,一般都遠小於要發送的信息。另外這些演算法還很慢,比對稱加密要慢的多。通常非對稱加密用來連接密碼系統。
有了公鑰密碼和密鑰交換,是密碼學裡面兩個非常重要的部分,因為人們總是需要與其他人交換私密的信息。有了這兩個技術就可以安全地和其他人交流。
目前為止討論的加密都沒有任何形式的身份認證。這也就意味著對消息進行加密和解密,並不能驗證得到的消息確實是發送者發送的原本的消息。
沒有身份認證的加密可以提供隱私性,但是如之前章節所言,沒有身份認證,盡管攻擊者不知道任何原文的信息,他任然可以修改加密的信息。接收這些消息會泄漏一些私密的信息,這也就意味著私密性不在。例如之前第7章提到的CBC的填充攻擊。
綜上所言,出了加密私密的信息之外,還需要對其進行身份認證。通常身份認證都是對消息增加一些額外的可計算的信息。類似於加密,身份認證也分為對稱類型的和非對稱類型的。對稱類型的通常被稱為消息認證(message authentication),非對稱類型的通常被稱為數字簽名。
下一章先介紹一下另一個密碼學中的重點:hash函數。hash在產生簽名和消息認證等過程中都需要用到。
[Bon99] Dan Boneh. Twenty years of attacks on the RSA cryptosystem. Notices of the AMS , 46:203–213, 1999. URL: http://crypto.stanford.e/dabo/papers/RSA-survey.pdf .
[AV96] Ross Anderson and Serge Vaudenay. Minding your pʼs and qʼs. In In Advances in Cryptology - ASIACRYPT』96, LNCS 1163 , 26–35. Springer� Verlag, 1996. URL: http://www.cl.cam.ac.uk/~rja14/Papers/psandqs.pdf .
G. SSL協議的工作原理
TLS/SSL的功能實現主要依賴於三類基本演算法:散列函數 Hash、對稱加密和非對稱加密,其利用非對稱加密實現身份認證和密鑰協商,對稱加密演算法採用協商的密鑰對數據加密,基於散列函數驗證信息的完整性。
H. TLS榪囩▼錛圖H 闈炲圭О鍔犲瘑錛
TLS 鐨勭洰鐨勪究鏄瑙e喅鏁版嵁鐨
涓銆丷ecord 璁板綍鍗忚 錛堝圭О鍔犺В瀵嗭級
浜屻丠andShake 鎻℃墜錛屾尌鎵
楠岃瘉閫氳鍙屾柟韜浠
浜ゆ崲鍔犺В瀵嗙殑瀹夊叏濂椾歡
鍗忓晢鍔犲瘑瑙e瘑鍙傛暟
褰撲竴涓猅LS浼氳瘽寤虹珛濂戒箣鍚庯紝浼氫嬌鐢ㄥ圭О鍔犲瘑鐨勫瘑閽ュ幓閫氫俊錛岄偅涔堝備綍瀹炵幇浜嬪厛灝嗗圭О鍔犲瘑鐨勫瘑閽ヤ紶閫掔粰TLS浼氳瘽鐨勫彟涓鏂瑰憿銆傚埄鐢ㄧ殑灝辨槸闈炲圭О鍔犲瘑銆傚垎瀵圭О鍔犲瘑姣斿圭О鍔犲瘑鎱㈡暟鍗冨嶏紝鎵浠ュ彧鏄浣跨敤瀵圭О鍔犲瘑浼犻掍箣鍚庡姞瀵嗕嬌鐢ㄧ殑瀵圭О鍔犲瘑鐨勫瘑閽ャ備箣鍚庣殑鍔犲瘑瀹夊叏鎬ч潬鐨勬槸瀵圭О鍔犲瘑鏉ヨВ鍐熾
闈炲圭О鍔犲瘑鏄鏈変竴鎶婂叕閽ュ拰涓鎶婄侀掗錛屽叕閽ュ彲浠ュ叕寮錛岃岀侀掗涓嶈兘銆
鐢ㄥ叕閽ュ姞瀵嗘垚瀵嗘枃錛屽啀灝嗗瘑鏂囩敤縐侀掗瑙e瘑灝辮兘瀹炵幇鍔犺В瀵嗚繃紼嬨
鑰岀敤縐侀掗鍔犲瘑錛屽叕閽ヨВ瀵嗗氨鏄絳懼悕璁よ瘉榪囩▼銆
甯歌佺殑闈炲圭О鍔犲瘑鏂瑰紡鍒嗕負涓ゅぇ綾
RSA 娌℃湁鍚戝墠瀹夊叏鎬э紝涔熷氨鏄闇瑕佹瘡嬈$殑瀵圭О鍔犲瘑瀵嗛掗鐨勪紶閫掗兘鏄鍩轟簬 鍏閽ュ姞瀵嗭紝鏈嶅姟絝縐侀掗瑙e瘑銆傚傛灉鏈嶅姟絝鐨勭侀掗涓㈠け浜嗭紝閭e嚑騫村墠鐨勯氫俊鏁版嵁閮芥湁鍙鑳借瑙e瘑銆傛墍浠ヨ繖鏄鏋佸害涓嶅畨鍏ㄧ殑錛岀侀掗鐨勫湴浣嶅お閲嶄簡錛屽傛灉姣忔$殑鍔犺В瀵嗛兘鏄涓存椂鐢熸垚鐨勫瘑鐮佹潵瑙e喅瀹夊叏鎬э紝鎵嶄笉浼氬圭侀掗鐨勫畨鍏ㄦф湁濡傛ゅ己鐨勪緷璧栥傚湪2013騫寸殑媯遍暅闂ㄤ簨浠朵腑錛屾煇涓狢A鏈烘瀯榪浜庣編鍥芥斂搴滃帇鍔涘悜鍏舵彁浜や簡CA鐨勭侀掗錛岃繖灝辨槸鍗佸垎鍗遍櫓鐨勩傚傛灉鍚戝墠涓嶅畨鍏錛岄偅涔堜箣鍓嶅埄鐢ㄨCA縐侀掗閮戒細鍏ㄩ儴閬孌冦傛墍浠ヨ繖閲岃寸殑鏄鏇村畨鍏ㄧ殑 DH綾婚潪瀵圭О鍔犲瘑銆
涓嬪浘灝辨槸DH瀵嗛掗浜ゆ崲鐨凾LS鎻℃墜榪囩▼
DH 瀵嗛掗浜ゆ崲鍗忚錛孌iffile-Hellman key Exchange錛岀畝縐 DH 鎴 DHE 銆傚畠鍙浠ヨ╁弻鏂瑰湪瀹屽叏娌℃湁瀵規柟浠諱綍棰勫厛淇℃伅鐨勬潯浠朵笅閫氳繃涓涓涓嶅畨鍏ㄧ殑淇¢亾鍒涘緩涓涓瀵嗛掗銆
1銆佸㈡埛絝嫻忚堝櫒闅忔満鐢熸垚涓涓鍊糝a錛岃$畻Pa(x,y) = Ra*Q(x,y), Q(x,y)涓哄叏涓栫晫鍏璁ょ殑鏌愪釜妞鍦嗘洸綰跨畻娉曠殑鍩虹偣銆傚皢Pa(x,y)鍙戦佽嚦鏈嶅姟鍣ㄣ
2銆佹湇鍔″櫒闅忔満鐢熸垚涓涓鍊糝b錛岃$畻 Pb(x,y) = Rb * Q(x,y)銆傚皢Pb(x,y)鍙戦佸埌瀹㈡埛絝嫻忚堝櫒銆
3銆佸㈡埛絝璁$畻Sa(x,y) = Ra * Pb(x,y)錛屾湇鍔″櫒璁$畻Sb(x,y)=Rb*Pa(x,y)
4銆佺畻娉曚繚璇佷簡Sa=Sb=S, 鎻愬彇鍏朵腑鐨凷鐨剎鍚戦噺浣滀負瀵嗛掗銆
涓轟簡瑙e喅涓婅堪DH鐨勯棶棰橈紝寮曞叆浜咵CC妞鍦嗘洸綰匡紝榪涜岃繘鍖栦負 ECDHE 綆楁硶錛岀О涓 Elliptic Curve Diffie-Hellman Key Exchange銆侲CC鍜孯SA 鍦288瀛楄妭鐨勯暱搴︿笅錛岀牬瑙RSA闇瑕佺叜娌鎬竴鍕烘按鐨勮兘閲忥紝鑰岀牬瑙g浉鍚屼綅鏁扮殑ECC 灝遍渶瑕佺叜娌告暣涓鍦扮悆姘寸殑鑳介噺銆俁SA 涓轟簡鎻愰珮瀹夊叏鎬э紝鍙鑳介潬澧炲ぇ瀵嗛掗浣嶆暟銆傚按灝鐨勬槸鐜板湪鐨勮秴綆楄秺鏉ヨ秺鍘夊熾傞噺瀛愯$畻涓嬬灝旂畻娉曞彲8h鍐呰交鏉劇牬瑙2048浣嶇殑RSA銆俁SA鍙鑳藉啀澧炲ぇ瀵嗛掗浣嶆暟錛屼絾鏄鍐嶅炲ぇ浣嶆暟錛岀Щ鍔ㄧ璁懼囧氨鎯ㄤ簡錛屼綘澧炲ぇ鐨勫瘑閽ユ槸榪愯惀鍟嗚佹敹鍙栨祦閲忚垂鐢ㄧ殑錛岃屼笖鍔犺В瀵嗗お璐圭數銆
ECC 鐨勬暟瀛﹀師鐞嗘槸妞鍦嗘洸綰垮拰紱繪暎瀵規暟銆傛き鍦嗘洸綰垮緢澶嶆潅銆備負浜嗘彁鍗囨ц兘錛岃繕闇瑕侀夋嫨涓涓妞鍦嗘洸綰匡紝浣嗘槸瀹冧笉鏄鐪熸g殑妞鍦嗗艦錛屼笅闈㈡湁鍥懼彲浠ョ湅鍒幫紝鍙鏄榪愮畻涓婄敤鍒頒簡妞鍦嗙畻娉曘
浣嗘槸ECC涔熸湁寰堝氶棶棰橈紝1銆丒CC 鍙鑳芥湁鍚庨棬錛屽侼SA錛堢編鍥藉浗瀹跺畨鍏ㄥ矓鍙戝竷鐨勪竴濂楃畻娉曪級錛岃繖涓綆楁硶灝辨槸琚鎬鐤戣妞嶅叆鍚庨棬浜嗐2銆佽屼笖ECC寰堝氱殑綆楁硶閮借娉ㄥ唽涓撳埄浜嗭紝涓涓嶅皬蹇冨氨瑕佸悆瀹樺徃錛屽叾涓撳埄澶ч儴鍒嗛兘琚榛戣帗娉ㄥ唽銆
ECC 妞鍦嗘洸綰跨殑瀹氫箟
ECC 鐨勭畻娉曞師鐞嗚繃浜庡嶆潅錛岃繖閲岃〃紺烘垜涔熺湅涓嶆噦銆傜偣鍒頒負姝㈠惂銆傦紙浠ュ悗鐪嬫噦浜嗗啀鏉ヨˉ鍏咃級
榪欓噷鐨勬姄鍖呯粨鏋滃氨鏄鐢ㄧ殑EC DH E 綆楁硶鏉ヨ繘琛屽瘑閽ヤ氦鎹㈢殑銆傝繖閲岄夋嫨鐨勬洸綰挎槸 secp256r1, 鍦ㄨ繖涓鏇茬嚎涓錛屽熀鐐瑰拰鍙傛暟宸茬粡緇欏嚭浜嗭紝PubKey 涔熺粰鍑轟簡銆
鍦 TLS1.3 涓錛屼竴鑸浣跨敤鐨 X25519 鏇茬嚎 錛堣挋鍝ラ┈鍒╂洸綰匡級
I. 圖文徹底搞懂非對稱加密(公鑰密鑰)
前文詳細講解了對稱加密及演算法原理。那麼是不是對稱加密就萬無一失了呢?對稱加密有一個天然的缺點,就是加密方和解密方都要持有同樣的密鑰。你可以能會提出疑問:既然要加、解密,當然雙方都要持有密鑰,這有什麼問題呢?別急,我們繼續往下看。
我們先看一個例子,小明和小紅要進行通信,但是不想被其他人知道通信的內容,所以雙方決定採用對稱加密的方式。他們做了下面的事情:
1、雙方商定了加密和解密的演算法
2、雙方確定密鑰
3、通信過程中採用這個密鑰進行加密和解密
這是不是一個看似完美的方案?但其中有一個步驟存在漏洞!
問題出在步驟2:雙方確定密鑰!
你肯定會問,雙方不確定密鑰,後面的加、解密怎麼做?
問題在於確定下來的密鑰如何讓雙方都知道。密鑰在傳遞過程中也是可能被盜取的!這里引出了一個經典問題:密鑰配送問題。
小明和小紅在商定密鑰的過程中肯定會多次溝通密鑰是什麼。即使單方一次確定下來,也要發給對方。加密是為了保證信息傳輸的安全,但密鑰本身也是信息,密鑰的傳輸安全又該如何保證呢?難不成還要為密鑰的傳輸再做一次加密?這樣不就陷入了死循環?
你是不是在想,密鑰即使被盜取,不還有加密演算法保證信息安全嗎?如果你真的有這個想法,那麼趕緊復習一下上一篇文章講的杜絕隱蔽式安全性。任何演算法最終都會被破譯,所以不能依賴演算法的復雜度來保證安全。
小明和小紅現在左右為難,想加密就要給對方發密鑰,但發密鑰又不能保證密鑰的安全。他們應該怎麼辦呢?
有如下幾種解決密鑰配送問題的方案:
非對稱加密也稱為公鑰密碼。我更願意用非對稱加密這種叫法。因為可以體現出加密和解密使用不同的密鑰。
對稱加密中,我們只需要一個密鑰,通信雙方同時持有。而非對稱加密需要4個密鑰。通信雙方各自准備一對公鑰和私鑰。其中公鑰是公開的,由信息接受方提供給信息發送方。公鑰用來對信息加密。私鑰由信息接受方保留,用來解密。既然公鑰是公開的,就不存在保密問題。也就是說非對稱加密完全不存在密鑰配送問題!你看,是不是完美解決了密鑰配送問題?
回到剛才的例子,小明和下紅經過研究發現非對稱加密能解決他們通信的安全問題,於是做了下面的事情:
1、小明確定了自己的私鑰 mPrivateKey,公鑰 mPublicKey。自己保留私鑰,將公鑰mPublicKey發給了小紅
2、小紅確定了自己的私鑰 hPrivateKey,公鑰 hPublicKey。自己保留私鑰,將公鑰 hPublicKey 發給了小明
3、小明發送信息 「周六早10點soho T1樓下見」,並且用小紅的公鑰 hPublicKey 進行加密。
4、小紅收到信息後用自己的私鑰 hPrivateKey 進行解密。然後回復 「收到,不要遲到」 並用小明的公鑰mPublicKey加密。
5、小明收到信息後用自己的私鑰 mPrivateKey 進行解密。讀取信息後心裡暗想:還提醒我不遲到?每次遲到的都是你吧?
以上過程是一次完整的request和response。通過這個例子我們梳理出一次信息傳輸的非對稱加、解密過程:
1、消息接收方准備好公鑰和私鑰
2、私鑰接收方自己留存、公鑰發布給消息發送方
3、消息發送方使用接收方公鑰對消息進行加密
4、消息接收方用自己的私鑰對消息解密
公鑰只能用做數據加密。公鑰加密的數據,只能用對應的私鑰才能解密。這是非對稱加密的核心概念。
下面我用一個更為形象的例子來幫助大家理解。
我有下圖這樣一個信箱。
由於我只想接收我期望與之通信的朋友信件。於是我在投遞口加了一把鎖,這把鎖的鑰匙(公鑰)我可以復制n份,發給我想接受其信件的人。只有這些人可以用這把鑰匙打開寄信口,把信件投入。
相信通過這個例子,可以幫助大家徹底理解公鑰和私鑰的概念。
RSA 是現在使用最為廣泛的非對稱加密演算法,本節我們來簡單介紹 RSA 加解密的過程。
RSA 加解密演算法其實很簡單:
密文=明文^E mod N
明文=密文^D mod N
RSA 演算法並不會像對稱加密一樣,用玩魔方的方式來打亂原始信息。RSA 加、解密中使用了是同樣的數 N。公鑰是公開的,意味著 N 也是公開的。所以私鑰也可以認為只是 D。
我們接下來看一看 N、E、D 是如何計算的。
1、求 N
首先需要准備兩個很大質數 a 和 b。太小容易破解,太大計算成本太高。我們可以用 512 bit 的數字,安全性要求高的可以使用 1024,2048 bit。
N=a*b
2、求 L
L 只是生成密鑰對過程中產生的數,並不參與加解密。L 是 (a-1) 和 (b-1) 的最小公倍數
3、求 E(公鑰)
E 有兩個限制:
1<E<
E和L的最大公約數為1
第一個條件限制了 E 的取值范圍,第二個條件是為了保證有與 E 對應的解密時用到的 D。
4、求 D(私鑰)
D 也有兩個限制條件:
1<D<L
E*D mod L = 1
第二個條件確保密文解密時能夠成功得到原來的明文。
由於原理涉及很多數學知識,這里就不展開細講,我們只需要了解這個過程中用到這幾個數字及公式。這是理解RSA 安全性的基礎。
由於 N 在公鑰中是公開的,那麼只需要破解 D,就可以解密得到明文。
在實際使用場景中,質數 a,b 一般至少1024 bit,那麼 N 的長度在 2048 bit 以上。D 的長度和 N 接近。以現在計算機的算力,暴力破解 D 是非常困難的。
公鑰是公開的,也就是說 E 和 N 是公開的,那麼是否可以通過 E 和 N 推斷出 D 呢?
E*D mod L = 1
想要推算出 D 就需要先推算出 L。L 是 (a-1) 和 (b-1) 的最小公倍數。想知道 L 就需要知道質數 a 和 b。破解者並不知道這兩個質數,想要破解也只能通過暴力破解。這和直接破解 D 的難度是一樣的。
等等,N 是公開的,而 N = a*b。那麼是否可以對 N 進行質因數分解求得 a 和 b 呢?好在人類還未發現高效進行質因數分解的方法,因此可以認為做質因數分解非常困難。
但是一旦某一天發現了快速做質因數分解的演算法,那麼 RSA 就不再安全
我們可以看出大質數 a 和 b 在 RSA 演算法中的重要性。保證 a 和 b 的安全也就確保了 RSA 演算法的安全性。a 和 b 是通過偽隨機生成器生成的。一旦偽隨機數生成器的演算法有問題,導致隨機性很差或者可以被推斷出來。那麼 RSA 的安全性將被徹底破壞。
中間人攻擊指的是在通信雙方的通道上,混入攻擊者。他對接收方偽裝成發送者,對放送放偽裝成接收者。
他監聽到雙方發送公鑰時,偷偷將消息篡改,發送自己的公鑰給雙方。然後自己則保存下來雙方的公鑰。
如此操作後,雙方加密使用的都是攻擊者的公鑰,那麼後面所有的通信,攻擊者都可以在攔截後進行解密,並且篡改信息內容再用接收方公鑰加密。而接收方拿到的將會是篡改後的信息。實際上,發送和接收方都是在和中間人通信。
要防範中間人,我們需要使用公鑰證書。這部分內容在下一篇文章里會做介紹。
和對稱加密相比較,非對稱加密有如下特點:
1、非對稱加密解決了密碼配送問題
2、非對稱加密的處理速度只有對稱加密的幾百分之一。不適合對很長的消息做加密。
3、1024 bit 的 RSA不應該在被新的應用使用。至少要 2048 bit 的 RSA。
RSA 解決了密碼配送問題,但是效率更低。所以有些時候,根據需求可能會配合使用對稱和非對稱加密,形成混合密碼系統,各取所長。
最後提醒大家,RSA 還可以用於簽名,但要注意是私鑰簽名,公鑰驗簽。發信方用自己的私鑰簽名,收信方用對方公鑰驗簽。關於簽名,後面的文章會再詳細講解。