-
1 # 種碼人
-
2 # SuperBean
密碼學中將加密分為對稱加密和非對稱加密。所謂對稱不對稱指的就是金鑰(yuè),注意這個字的發音,常常容易讀錯。一段資料從明文到密文再到明文的過程,如果用的同一個金鑰就是對稱加密,用的兩個金鑰就是非對稱加密,把非對稱加密中從明文到密文使用的金鑰稱為公鑰,從密文到明文使用的金鑰稱為私鑰。
題主第一個問題本質上說的是金鑰協商演算法,最流行的就是DH協議了,全稱Diffie-Hellman,一個非常簡單的基於離散對數難題的演算法,再往深了說,還有基於橢圓曲線上的離散對數難題的ECDHE金鑰協商演算法,DH演算法的升級版。目前就應用在HTTPS中。感興趣的童鞋用火狐訪問下百度,點選連結前面的綠色的鎖,檢視詳情,就能看到用的哪些演算法:
題主第二個問題想問的應該是非對稱加密目前的應用場景。非對稱加密時間是比對稱加密長的,而且不是一點半點,極端情況下,同一段資料慢上數千倍都有可能的。那麼是否非對稱加密演算法就沒有用武之地了呢?非也,我們可以不用非對稱演算法來加密資料。我們再回到上面圖中的演算法,你一眼應該就能看到一個熟悉的身影,RSA,典型的非對稱加密演算法。前面說了,ECDHE是用來交換金鑰的,金鑰是來自對稱加密AES演算法的128位金鑰,RSA的作用是什麼?
非對稱演算法的一個重大領域就是簽名。你需要做的就是把非對稱演算法倒過來用。公鑰加密,私鑰解密,倒過來就是,私鑰簽名,公鑰驗證。RSA在我訪問百度HTTPS中的作用就是,在ECDHE交換金鑰過程中給伺服器簽名,透過我這邊火狐瀏覽器進行公鑰驗證,從而完成了百度伺服器的身份認證。
前面我為了大家的理解,一直沒有說的是,其實DH或者ECDHE也屬於非對稱加密演算法。於是非對稱演算法的另一個重大領域也呼之欲出,就是金鑰協商。
-
3 # 非著名攻城獅
這個問題有點專業性,剛好我專案中這兩種加密技術都使用過,對這兩種加密方式有一定的理解。
可能有些小夥伴還不太清楚這兩種加密方法,那在回答問題前,我們先搞懂清楚是對稱加密和非對稱加密。
對稱加密通常是採用單鑰密碼系統的加密方法,同一個金鑰可以同時用作資訊的加密和解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。
對稱加密對內容的加解密需要使用相同的演算法,對稱加密速度快,一般用於訊息傳送方資料量比較大時使用。
所謂對稱,就是採用這種加密方法的雙方使用方式用同樣的金鑰進行加密和解密。金鑰是控制加密及解密過程的指令。演算法是一組規則,規定如何進行加密和解密。因此加密的安全性不僅取決於加密演算法本身,金鑰管理的安全性更是重要。因為加密和解密都使用同一個金鑰。
非對稱加密非對稱加密演算法需要兩個金鑰:公開金鑰(publickey:簡稱公鑰)和私有金鑰(privatekey:簡稱私鑰)。
公鑰與私鑰是一對,如果用公鑰對資料進行加密,只有用對應的私鑰才能解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演算法叫作非對稱加密演算法。
公鑰與私鑰是不相同的,並且只能公鑰加密,私鑰解密,所以稱為非對稱加密。
非對稱加密演算法強度複雜、安全性依賴於演算法與金鑰但是由於其演算法複雜,而使得加密解密速度沒有對稱加密解密的速度快。
非對稱金鑰體制有兩種金鑰,其中一個是公開的,這樣就可以不需要像對稱密碼那樣傳輸對方的金鑰了,這樣安全性就大了很多。
非對稱加密演算法核心就是質因數分解,大家感興趣可以去搜索李永樂老師的講解影片。
對稱加密演算法的使用對稱加密演算法加密速度快,非常適合對安全性要求不高的資料,而且支援大量資料一次性加密。
我們是在APP開發的,會從後臺伺服器獲取資料,在這個資料傳輸的過程中會存在加密操作。
下面先介紹下對稱加密演算法在程式碼中的表現形式。
我是採用Java程式設計的,java裡面已經封裝好了對稱加密程式碼庫,所以我們直接呼叫就可以實現對稱加密。
如圖,SecretKeySpec類主要是負責金鑰的實現演算法,比如有AES、DES等演算法,那我們一般使用AES演算法。
Cipher類是負責具體的加解密工作,只需把金鑰加密演算法和加密內容傳入,就能獲得加解密好的位元組陣列。
在專案中,一般是用於對安全性不高,但資料量較大的介面做對稱加密處理。我之前做過一個B端專案,裡面有個業務中心需要獲取大量的業務資料,那這個資料用的就是對稱加密。
我還做過一個銀行專案,裡面除了登陸和修改密碼的介面,其他的介面全用的對稱加密。
非對稱加密演算法的使用透過X509EncodedKeySpec類獲取標準的公鑰,X509是密碼學裡公鑰證書的格式標準,這裡獲取的公鑰就是按照 X.509 標準進行編碼的金鑰的位元組陣列。
透過KeyFactory類獲取加密演算法型別,一般是RSA。
然後再用Cipher類進行加密。
非對稱加密由於演算法複雜,所以加密速度相對較慢,而且RSA演算法只能支援加密128bit資料,其中還包括padding的11bit,所以實際上只能加密117bit的資料。
在APP端專案中,一般是針對安全性要求高,而且資料量小的介面。比如專案中的的登陸,涉及到賬戶密碼的傳輸,可以用非對稱加密。
對稱加密時,如何將金鑰傳遞給對方透過物理方式傳遞,比如銀行的U盾,使用時插入U盾,讀取裡面的金鑰,進行資料加解密傳輸,這種方案相對比較穩妥,物理方式儲存金鑰,一般不容易洩露,除非U盾丟失。透過第三方分發金鑰,A和B在在加解密通訊前,先各自到第三方獲取金鑰。這種方案最為穩妥,雙方都不知道實際金鑰,而且下一次通訊時金鑰會重新獲取。透過非對稱加密方式對金鑰進行加密傳輸,這種方式也不錯,我專案裡面也有使用這種方案,通常是針對動態金鑰的介面。如果用非對稱加密,加密時間過長怎麼解決?可以將加密內容擷取,分段進行加解密。可以在加密前進行字串長度判斷,如果加密內容超過了117bit,就對半擷取,依次下去。然後解密方在進行拼接顯示。此種方案實現比較簡單,但需要雙方實現此邏輯。
可以將內容打包生成MD5值,然後將MD5值加密傳遞,解密方透過MD5值校驗檔案的真實性與正確性。此種方案雖然能解決加密時間過長問題,但是無法保護檔案,一旦被抓包獲取,就直接能看到內容,所以對網路安全沒有絕對把握的話,不要使用此種方案。總結對稱加密和非對稱加密應用在生活的方方面面,比如中國古代的虎符,只有兩半合成時才能調兵遣將,這也是對稱加密的體現,今天我們以IT領域舉例說明,在金鑰傳輸中如何保證金鑰的安全性,也給出了非對稱加密時間過長的解決辦法,但需要結合使用場景去選擇解決方案。
在人性浮躁的社會,人人都缺乏安全感,加密顯得格外重要!
回覆列表
通常會組合使用非對稱加密和對稱加密。
第一次通訊的時候,會使用非對稱加密,利用非對稱加密把對稱加密的金鑰傳輸給另一端,後續所有的通訊都會基於對稱加密來進行。這樣避免了每次通訊都使用非對稱加密導致速度慢的問題,又利用非對稱加密解決了金鑰傳輸問題。
目前使用極為廣泛的https就是這個原理。