非對稱加密算法的核心源于數學問題,它存在公鑰和私鑰的概念,要完成加解密操作,需要兩個密鑰同時參與。我們常說的“公鑰加密,私鑰加密”或“私鑰加密, 公鑰解密”都屬于非對稱加密的范疇。公鑰加密的數據必須使用私鑰才可以解密,同樣,私鑰加密的數據也 只能通過公鑰進行解密。
??相比對稱加密,非對稱加密的安全性得到了提升,但是也存在明顯的缺點,非對稱加解密的效率要遠遠小于對稱加解密。所以非對稱加密往往被用在一些安全性要求比較高的應用或領域中。
典型的RSA非對稱加密
RSA加密算法是一種典型的非對稱加密算法,它基于大數的因式分解數學難題,它也是應用最廣泛的非對稱加密算法,于1978年由美國麻省理工學院(MIT)的三位學者:Ron Rivest、Adi Shamir 和 Leonard Adleman 共同提出。
??它的原理較為簡單,我們假設有消息發送方A和消息接收方B,通過下面的幾個步驟,我們就可以完成消息的加密傳遞:
?(1)消息發送方A在本地構建密鑰對,公鑰和私鑰;
?(2)消息發送方A將產生的公鑰發送給消息接收方B;
?(3)B向A發送數據時,通過公鑰進行加密,A接收到數據后通過私鑰進行解密,完成一次通信;
?(4)反之,A向B發送數據時,通過私鑰對數據進行加密,B接收到數據后通過公鑰進行解密。
??由于公鑰是消息發送方A暴露給消息接收方B的,所以這種方式也存在一定的安全隱患,如果公鑰在數據傳輸過程中泄漏,則A通過私鑰加密的數據就可能被解密。
??如果要建立更安全的加密消息傳遞模型,需要消息發送方和消息接收方各構建一套密鑰對,并分別將各自的公鑰暴露給對方,在進行消息傳遞時,A通過B的公鑰對數據加密,B接收到消息通過B的私鑰進行解密,反之,B通過A的公鑰進行加密,A接收到消息后通過A的私鑰進行解密。
??當然,這種方式可能存在數據傳遞被模擬的隱患,我們可以通過數字簽名等技術進行安全性的進一步提升。由于存在多次的非對稱加解密,這種方式帶來的效率問題也更加嚴重。可以詳讀這兩篇文章:RSA 算法原理(一)(二)
SSH加密原理
在SSH安全協議的原理中, 是一種非對稱加密與對稱加密算法的結合,先看下圖:
這里進行一下說明:
(1)首先服務端會通過非對稱加密,產生一個公鑰和私鑰
(2)在客戶端發起請求時,服務端將公鑰暴露給客戶端,這個公鑰可以被任意暴露;
(3)客戶端在獲取公鑰后,會先產生一個由256位隨機數字組成的會話密鑰,這里稱為口令;
(4)客戶端通過公鑰將這個口令加密,發送給服務器端;
(5)服務器端通過私鑰進行解密,獲取到通訊口令;
?之后,客戶端和服務端的信息傳遞,都通過這個口令進行對稱的加密。
?這樣的設計在一定程度上提高了加解密的效率,不過,與客戶端服務端各構建一套密鑰對的加解密方式相比,在安全性上可能有所下降。在上面所述的通過口令進行加密的過程中,數據也是可以被竊聽的,不過由于密鑰是256個隨機數字,有10的256次方中組合方式,所以破解難度也很大。相對還是比較安全的。服務端和客戶端都提前知道了密鑰,SSH的這種方式,服務端是通過解密獲取到了密鑰。
數字簽名
現在知道了有非對稱加密這東西,那數字簽名是怎么回事呢?
?數字簽名的作用是我對某一份數據打個標記,表示我認可了這份數據(簽了個名),然后我發送給其他人,其他人可以知道這份數據是經過我認證的,數據沒有被篡改過。
?有了上述非對稱加密算法,就可以實現這個需求:
?(1)首先用一種算法,算出原始數據的摘要。需滿足 a.若原始數據有任何變化,計算出來的摘要值都會變化。 b.摘要要夠短。這里最常用的算法是MD5。
?(2)生成一份非對稱加密的公鑰和私鑰,私鑰我自己拿著,公鑰公布出去。
?(3)對一份數據,算出摘要后,用私鑰加密這個摘要,得到一份加密后的數據,稱為原始數據的簽名。把它跟原始數據一起發送給用戶。
?(4)用戶收到數據和簽名后,用公鑰解密得到摘要。同時用戶用同樣的算法計算原始數據的摘要,對比這里計算出來的摘要和用公鑰解密簽名得到的摘要是否相等,若相等則表示這份數據中途沒有被篡改過,因為如果篡改過,摘要會變化。
?之所以要有第一步計算摘要,是因為非對稱加密的原理限制可加密的內容不能太大(不能大于上述 n 的位數,也就是一般不能大于 1024 位/ 2048 位),于是若要對任意大的數據簽名,就需要改成對它的特征值簽名,效果是一樣的。