加減密和數字簽名

weixin_34308389發表於2018-01-21

加密資料的目的是防止發給對方的隱私資訊被他人看到;釋出簽名的目的是向對方證明這段訊息確實是你發的。

一、加密演算法

加密演算法分為 對稱金鑰演算法(Symmetric Key Algorithm)公開金鑰演算法(Public Key Algorithm)。對稱加密,是一種比較傳統的加密方式,其加密運算、解密運算使用的是同樣的金鑰,資訊的傳送者和資訊的接收者在進行資訊的傳輸與處理時,必須共同持有該密碼(稱為對稱密碼);公開金鑰演算法也稱為 非對稱金鑰演算法 ,就是使用不同的加密金鑰與解密金鑰,是一種“由已知加密金鑰推匯出解密金鑰在計算上是不可行的”密碼體制。加密金鑰(即公開金鑰)PK是公開資訊,而解密金鑰(即祕密金鑰)SK是需要保密的,加密演算法E和解密演算法D也都是公開的,雖然解密金鑰SK是由公開金鑰PK決定的,但卻不能根據PK計算出SK。

1.1 DES(Data Encryption Standard, 資料加密標準)

DES是一種對稱加密演算法。
加密原理:DES 使用一個 56 位的金鑰以及附加的 8 位奇偶校驗位,產生最大 64 位的分組大小。這是一個迭代的分組密碼,使用稱為 Feistel 的技術,其中將加密的文字塊分成兩半。使用子金鑰對其中一半應用迴圈功能,然後將輸出與另一半進行“異或”運算;接著交換這兩半,這一過程會繼續下去,但最後一個迴圈不交換。DES 使用 16 個迴圈,使用異或,置換,代換,移位操作四種基本運算。
三重 DES:使用 168 位的金鑰對資料進行三次加密的一種機制。因DES的金鑰長度太短,很容易被暴力破解,故利用三重加密來有效地增加金鑰長度。
不過 ,DES 現在僅用於舊系統的鑑定,而更多地選擇新的加密標準。

1.2 AES(Advanced Encryption Standard, 高階加密標準)

AES是一種對稱加密演算法。這個標準用來替代原先的DES,2006年AES已然成為對稱金鑰加密中最流行的演算法之一。
加密原理:AES加密資料塊分組長度必須為128位元,金鑰長度可以是128位元、192位元、256位元中的任意一個(如果資料塊及金鑰長度不足時,會補齊)。AES加密有很多輪的重複和變換。大致步驟如下:1、金鑰擴充套件(KeyExpansion),2、初始輪(Initial Round),3、重複輪(Rounds),每一輪又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最終輪(Final Round),最終輪沒有MixColumns。

1.3 RSA

RSA是一種公開金鑰演算法。由Ron Rivest、Adi Shamir、Leonard Adleman提出,故該演算法取三個人名字的首字母來命名。它通常是先生成一對RSA 金鑰,其中之一是保密金鑰,由使用者儲存;另一個為公開金鑰,可對外公開。
RSA演算法基於一個十分簡單的數論事實:將兩個大質數相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密金鑰。
具體解析:帶你徹底理解RSA演算法原理

1.4 加密演算法選擇

因對稱加密演算法在傳輸資料時,也需要把雙方共同的金鑰明文傳給對方,這裡就會出現安全性地問題,故現在所有的通訊都會使用公開金鑰演算法RSA。
但RSA有幾個缺點:1.產生金鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密;速度太慢,由於RSA 的分組長度太大,為保證安全性,n 至少也要 600 bits以上,使運算代價很高,尤其是速度較慢,較對稱密碼演算法慢幾個數量級;且隨著大數分解技術的發展,這個長度還在增加,不利於資料格式的標準化。

為了速度問題,人們廣泛使用單,公鑰密碼結合使用的方法,優缺點互補:單鑰密碼加密速度快,人們用它來加密較長的檔案,然後用RSA來給檔案金鑰加密,極好的解決了單鑰密碼的金鑰分發問題。在對稱金鑰演算法中應首選AES。

二、數字簽名

數字簽名就是為了證明發布資料者的身份。簽名流程是先 認證,再 加密

  1. 認證。以單向雜湊函式思想為基礎,它接受一個任意長度的明文作為輸入,然後計算出一個 固定長度 的位串,這個雜湊函式MD稱為 訊息摘要(Message Digest)。雜湊過程是不可逆的,即給定P很容易計算出MD(P),但給定MD(P),不能有效推算出P;並且輸入明文中即使只有1位變化也會導致完全不同的輸出。
  2. 加密。加密的過程也就是簽名的過程,為了安全,在實際的場景中,仍然使用公開加密演算法RSA,為了證明發布者的身份,釋出者就會用自己的私鑰加密,接收方用釋出者的公鑰解密來確認。

釋出者對明文進行簽名後,需要把明文和摘要都發給接收方,接收方只需對明文也hash計算出摘要,和接收到的摘要進行對比是否一致。

問題1:理論上用RSA直接對明文簽名就可以,為什麼還要先對訊息進行雜湊得到摘要再加密?
Why hash the message before signing it with RSA?
主要原因無非是 安全快速。雜湊過程是不可逆的,故安全;雜湊完總是計算出一個固定的值,能加快RSA的加減密速度。

問題2:RSA的公鑰和私鑰到底哪個才是用來加密和哪個用來解密?
RSA演算法是第一個能同時用於加密和數字簽名的演算法。RSA的兩個金鑰是對稱的,隨便哪一個加密,可以用另一個解密,理論上你可以保留公鑰,釋出私鑰,只不過公鑰可以通過私鑰輕鬆算出,反之不行,故實際中的做法是保留私鑰釋出私鑰。
我們會發現實際中對資料加密時,使用的是接收方的公鑰,而在數字簽名時,使用的是傳送者的私鑰。
RSA的公鑰和私鑰到底哪個才是用來加密和哪個用來解密?

不要去硬記。
你只要想:既然是加密,那肯定是不希望別人知道我的訊息,所以只有我才能解密,所以可得出 公鑰負責加密,私鑰負責解密;同理,既然是簽名,那肯定是不希望有人冒充我發訊息,只有我才能釋出這個簽名,所以可得出 私鑰負責簽名,公鑰負責驗證

2.1 MD5(Message-Digest Algorithm 5, 資訊-摘要演算法5)

MD5以512位分組來處理輸入的資訊,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位雜湊值。
MD5碼可以唯一地代表原資訊的特徵,通常用於密碼的加密儲存,數字簽名,檔案完整性驗證等。

2.2 SHA-1(Secure Hash Algorithm 1, 安全雜湊演算法1)

SHA-1 會從一個最大 2^64 位元的訊息中產生一串 160 位元的摘要。SHA-1基於MD5,MD5又基於MD4。
論壇裡提供的系統映象檔案的hash也就是微軟官方提供的SHA-1值,下載後和此值對應,就說明你下載過程中檔案沒有被更改,屬於原版。

比較:SHA-1摘要比MD5摘要長 32 位元,故SHA-1抗攻擊能力更強,自然執行速度比MD5慢。需根據實際場景來選擇

三、編碼轉換

在進行完加密和簽名後的資料時二進位制的,不適合用於傳輸,故需要轉換為字符集。目前常見的編碼演算法就是 Base64
Base64是網路上最常見的用於傳輸8Bit位元組碼的編碼方式之一,Base64就是一種基於64個可列印字元來表示二進位制資料的方法。Base64編碼是從二進位制到字元的過程,可用於在HTTP環境下傳遞較長的標識資訊。

四、總結

目前大多數應用通訊的安全流程是:

7408639-52ca3a93407eeebc.png
process.png

上圖是加密和簽名的流程圖,而解密和驗籤倒序進行。

五、公鑰管理

為了安全地分發公鑰(因為在傳輸的過程中可能被非法者替換),就建立了能證明公鑰所屬權的 認證中心(CA, Certification Authority)。CA會給申請者頒發一個證書,用自己私鑰對證書的SHA-1雜湊值進行簽名。證書的作用就是將一個公鑰與安全個體的名字繫結在一起。
實際上,CA並不是一個,為了安全和效率,而是分等級層次的,這樣即使一個CA的資料庫被攻破了,也不會影響全球的安全性。最頂級的CA即層次的根,它的責任是證明第二級的CA,頂級CA稱為 區域管理機構(RA, Regional Authority)

7408639-a09b0843e7ce971f.png
Certificate chain.png

當使用者不相信對方直屬CA頒發的證書時,就會請求上一級CA,以此類推,請求的證書就形成了一個 證書鏈(Certificate chain)。總之你必須相信根CA,證書鏈才有效,當然根CA並非只有一個,而是有多個根,每個根都有它直接的RA和CA。實際上,現代瀏覽器在安裝的時候預先載入了100多個根的公鑰。通過這種方式,就可以避免在全球範圍內使用單一的可信權威機構。

六、常見安全通訊協議

6.1 GPG/PGP

PGP(Pretty Good Privacy, 良好的隱私性) 是一個完整的電子有點安全軟體包,提供了私密性、認證、數字簽名和壓縮功能。它使用 國際資料加密演算法(IDEA, International Data Encryption Algorithm) 的塊密碼演算法來加密資料,PGP的金鑰管理使用RSA,資料完整性使用MD5。
PGP使用已有的密碼學演算法,而不是發明新的演算法。它像一個前處理器,接受明文輸入,併產生簽過名的密文作為輸出,其輸出格式為Base64。

7408639-6157db8782d7a42f.png
PGP.png

但是PGP是商業軟體,不能自由使用。所以自由軟體基金會決定,開發一個PGP的替代品,取名為GnuPG,即 GPG(The GNU Privacy Guard)

6.2 SSH(Secure Shell, 安全外殼協議)

SSH 為建立在應用層基礎上的安全協議,它專為遠端登入會話和其他網路服務提供安全性的協議。SSH最初是UNIX系統上的一個程式,後來又迅速擴充套件到其他操作平臺。SSH採用面向連線的TCP協議傳輸,監聽 22埠
傳統的網路服務程式,如:ftp、pop和telnet在本質上都是不安全的,因為它們在網路上用明文傳送口令和資料,別有用心的人非常容易就可以截獲這些口令和資料。而且,這些服務程式的安全驗證方式也是有其弱點的, 就是很容易受到“中間人”(man-in-the-middle)這種方式的攻擊。通過使用SSH,你可以把所有傳輸的資料進行加密,這樣"中間人"這種攻擊方式就不可能實現了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處就是傳輸的資料是經過壓縮的,所以可以加快傳輸的速度。
從客戶端來看,SSH提供兩種級別的安全驗證:

  1. 基於口令的安全驗證:通過帳號和口令登入到遠端主機,所有傳輸的資料都會被加密。但可能會有別的伺服器在冒充真正的伺服器,也就是受到“中間人”這種方式的攻擊。
  2. 基於密匙的安全驗證:需要建立一對密匙,並把公用密匙放在需要訪問的伺服器上,通過類似RSA的方式來加密和解密資料。它不僅加密所有傳送的資料,而且“中間人”這種攻擊方式也是不可能的(因為他沒有你的私人密匙),但是整個登入的過程可能需要10秒。

生活中應該首選SSH Keys,儘量避免使用密碼方式登入SSH。

6.3 SSL(Secure Sockets Layer, 安全套接層)

現在SSL的協議已廣泛被Google、Firefox、Safari和IE等瀏覽器採用,主要用於頁面資訊的通訊。SSL在兩個套接字之間建立一個安全的連線,主要功能有瀏覽器和伺服器的雙向認證、資料加密和資料完整性保護等。
實際上,SSL位於應用層和傳輸層之間的一個新層,它接受來自瀏覽器的請求,再將請求傳遞給TCP以便傳輸到伺服器上。一旦安全的連線已經被建立起來,則SSL的主要任務時處理壓縮和加密。
在SSL上使用的HTTP被稱為 安全的HTTP(HTTPS, Secure HTTP),它使用一個新埠 443,而不是標準的埠80。現在許多企業都強烈推薦使用HTTPS協議,2017.01.01蘋果要求所以的APP都必須使用HTTPS。

7408639-492a22f8e8323d69.png
SSL.png

SSL存在一個問題是,使用者並不總是驗證所用的金鑰是否與證書相匹配,故產生了IETF標準haul後的 傳輸層安全(TLS, Transport Layer Security)。TLS是SSL的第3個版本,這就是所謂的 SSL/TLS

參考連結:《計算機網路(第5版)》 AndrewS.Tanenbaum
RSA演算法原理(一)
RSA演算法原理(二)

相關文章