關(guān)于SSH加密原理、RSA非對稱加密算法

首先聲明一下,這里所說的SSH,并不是Java傳統(tǒng)的三大框架,而是一種建立在應(yīng)用層和傳輸層基礎(chǔ)上的安全外殼協(xié)議,熟悉Linux的朋友經(jīng)常使用到一 個SSH Secure Shell Cilent的工具,本文也是基于此工具加密原理的學(xué)習(xí),在SSH的加密原理中,使用到了RSA非對稱加密算法,本文也一并做了學(xué)習(xí)和了解。

非對稱加密算法

在日常的工作生產(chǎn)中, 我們經(jīng)常需要進行數(shù)據(jù)的通訊,開發(fā)人員經(jīng)常需要對數(shù)據(jù)進行加解密操作,以保證數(shù)據(jù)的安全。數(shù)據(jù)的加密算法非為對稱加密和非對稱加密兩種,常用的DES、三 重DES、AES等都屬于對稱加密,即通過一個密鑰可以進行數(shù)據(jù)的加解密,密鑰一旦泄漏,傳輸?shù)臄?shù)據(jù)則不安全。

非對稱加密算法的核心源于數(shù)學(xué)問題,它存在公鑰和私鑰的概念,要完成加解密操作,需要兩個密鑰同時參與。我們常說的“公鑰加密,私鑰加密”或“私鑰加密, 公鑰解密”都屬于非對稱加密的范疇,后文中講到的RSA算法也一種典型的非對稱加密算法。公鑰加密的數(shù)據(jù)必須使用私鑰才可以解密,同樣,私鑰加密的數(shù)據(jù)也 只能通過公鑰進行解密。

相比對稱加密,非對稱加密的安全性得到了提升,但是也存在明顯的缺點,非對稱加解密的效率要遠遠小于對稱加解密。所以非對稱加密往往被用在一些安全性要求比較高的應(yīng)用或領(lǐng)域中。

? ? 典型的RSA非對稱加密

RSA加密算法是一種典型的非對稱加密算法,它基于大數(shù)的因式分解數(shù)學(xué)難題,它也是應(yīng)用最廣泛的非對稱加密算法,于1978年由美國麻省理工學(xué)院(MIT)的三位學(xué)著:Ron Rivest、Adi Shamir 和 Leonard Adleman 共同提出。

它的原理較為簡單,我們假設(shè)有消息發(fā)送方A和消息接收方B,通過下面的幾個步驟,我們就可以完成消息的加密傳遞:

  1. 消息發(fā)送方A在本地構(gòu)建密鑰對,公鑰和私鑰;
  2. 消息發(fā)送方A將產(chǎn)生的公鑰發(fā)送給消息接收方B;
  3. B向A發(fā)送數(shù)據(jù)時,通過公鑰進行加密,A接收到數(shù)據(jù)后通過私鑰進行解密,完成一次通信;
  4. 反之,A向B發(fā)送數(shù)據(jù)時,通過私鑰對數(shù)據(jù)進行加密,B接收到數(shù)據(jù)后通過公鑰進行解密。

由于公鑰是消息發(fā)送方A暴露給消息接收方B的,所以這種方式也存在一定的安全隱患,如果公鑰在數(shù)據(jù)傳輸過程中泄漏,則A通過私鑰加密的數(shù)據(jù)就可能被解密。

如果要建立更安全的加密消息傳遞模型,需要消息發(fā)送方和消息接收方各構(gòu)建一套密鑰對,并分別將各自的公鑰暴露給對方,在進行消息傳遞時,A通過B的公鑰對數(shù)據(jù)加密,B接收到消息通過B的私鑰進行解密,反之,B通過A的公鑰進行加密,A接收到消息后通過A的私鑰進行解密。

當(dāng)然,這種方式可能存在數(shù)據(jù)傳遞被模擬的隱患,我們可以通過數(shù)字簽名等技術(shù)進行安全性的進一步提升。由于存在多次的非對稱加解密,這種方式帶來的效率問題也更加嚴重。

? ? SSH加密原理

在SSH安全協(xié)議的原理中, 是一種非對稱加密與對稱加密算法的結(jié)合,先看下圖:

這里進行一下說明:

  1. 首先服務(wù)端會通過非對稱加密,產(chǎn)生一個公鑰私鑰;
  2. 在客戶端發(fā)起請求時,服務(wù)端將公鑰暴露給客戶端,這個公鑰可以被任意暴露;
  3. 客戶端在獲取公鑰后,會先產(chǎn)生一個由256位隨機數(shù)字組成的會話密鑰,這里稱為口令;
  4. 客戶端通過公鑰將這個口令加密,發(fā)送給服務(wù)器端;
  5. 服務(wù)器端通過私鑰進行解密,獲取到通訊口令;
  6. 之后,客戶端和服務(wù)端的信息傳遞,都通過這個口令進行對稱的加密。

個人感覺,這樣的設(shè)計在一定程度上提高了加解密的效率,不過,與客戶端服務(wù)端各構(gòu)建一套密鑰對的加解密方式相比,在安全性上可能有所下降。在上面所述的通過口令進行加密的過程中,數(shù)據(jù)也是可以被竊聽的,不過由于密鑰是256個隨機數(shù)字,有10的256次方中組合方式,所以破解難度也很大。相對還是比較安全的。服務(wù)端和客戶端都提前知道了密鑰,SSH的這種方式,服務(wù)端是通過解密獲取到了密鑰。

DH密鑰交換算法

SSH的原理,是基于RSA非對稱加密,RSA是基于大數(shù)的因式分解數(shù)學(xué)難題,下面要提到的DH密鑰交換算法則是基于有限域上的離散對數(shù)難題。

DH算法是一種密鑰協(xié)商算法,只用于密鑰的分配,不用于消息的加解密。它提供了一種安全的交換密鑰的方式,通過交換的密鑰進行數(shù)據(jù)的加解密。就像SSH原理中,口令的交換,不過DH算法更安全。

我們舉個例子來進行說明,假設(shè)有A、B兩方,A作為發(fā)送者,B作為接收者。通過下面的幾個步驟就可以構(gòu)建出一個只屬于雙方的密鑰口令,如下:

  1. 首先A、B雙方,在通信前構(gòu)建專屬于自己的密鑰對,假設(shè)分別是公鑰A,私鑰A,公鑰B,私鑰B;
  2. A將自己的公鑰A暴露給B,B通過私鑰B公鑰A經(jīng)過一定的運算產(chǎn)生出本地的密鑰B;
  3. 同樣,B將自己的公鑰B暴露給A,A通過私鑰A公鑰B經(jīng)過一定的運算產(chǎn)生出本地的密鑰A;
  4. 最后,這個算法有意思的一點就是,密鑰A密鑰B是一致的,這樣A、B雙方就擁有了一個屬于雙方的“秘密”口令;

DH算法的產(chǎn)生是,對稱加密向非對稱加密的過度,為后續(xù)非對稱加密的產(chǎn)生和發(fā)展奠定了基礎(chǔ)。