加密數(shù)據(jù)的目的是防止發(fā)給對(duì)方的隱私信息被他人看到;發(fā)布簽名的目的是向?qū)Ψ阶C明這段消息確實(shí)是你發(fā)的。
一、加密算法
加密算法分為 對(duì)稱密鑰算法(Symmetric Key Algorithm) 和 公開密鑰算法(Public Key Algorithm)。對(duì)稱加密,是一種比較傳統(tǒng)的加密方式,其加密運(yùn)算、解密運(yùn)算使用的是同樣的密鑰,信息的發(fā)送者和信息的接收者在進(jìn)行信息的傳輸與處理時(shí),必須共同持有該密碼(稱為對(duì)稱密碼);公開密鑰算法也稱為 非對(duì)稱密鑰算法 ,就是使用不同的加密密鑰與解密密鑰,是一種“由已知加密密鑰推導(dǎo)出解密密鑰在計(jì)算上是不可行的”密碼體制。加密密鑰(即公開密鑰)PK是公開信息,而解密密鑰(即秘密密鑰)SK是需要保密的,加密算法E和解密算法D也都是公開的,雖然解密密鑰SK是由公開密鑰PK決定的,但卻不能根據(jù)PK計(jì)算出SK。
1.1 DES(Data Encryption Standard, 數(shù)據(jù)加密標(biāo)準(zhǔn))
DES是一種對(duì)稱加密算法。
加密原理:DES 使用一個(gè) 56 位的密鑰以及附加的 8 位奇偶校驗(yàn)位,產(chǎn)生最大 64 位的分組大小。這是一個(gè)迭代的分組密碼,使用稱為 Feistel 的技術(shù),其中將加密的文本塊分成兩半。使用子密鑰對(duì)其中一半應(yīng)用循環(huán)功能,然后將輸出與另一半進(jìn)行“異或”運(yùn)算;接著交換這兩半,這一過程會(huì)繼續(xù)下去,但最后一個(gè)循環(huán)不交換。DES 使用 16 個(gè)循環(huán),使用異或,置換,代換,移位操作四種基本運(yùn)算。
三重 DES:使用 168 位的密鑰對(duì)資料進(jìn)行三次加密的一種機(jī)制。因DES的密鑰長(zhǎng)度太短,很容易被暴力破解,故利用三重加密來有效地增加密鑰長(zhǎng)度。
不過 ,DES 現(xiàn)在僅用于舊系統(tǒng)的鑒定,而更多地選擇新的加密標(biāo)準(zhǔn)。
1.2 AES(Advanced Encryption Standard, 高級(jí)加密標(biāo)準(zhǔn))
AES是一種對(duì)稱加密算法。這個(gè)標(biāo)準(zhǔn)用來替代原先的DES,2006年AES已然成為對(duì)稱密鑰加密中最流行的算法之一。
加密原理:AES加密數(shù)據(jù)塊分組長(zhǎng)度必須為128比特,密鑰長(zhǎng)度可以是128比特、192比特、256比特中的任意一個(gè)(如果數(shù)據(jù)塊及密鑰長(zhǎng)度不足時(shí),會(huì)補(bǔ)齊)。AES加密有很多輪的重復(fù)和變換。大致步驟如下:1、密鑰擴(kuò)展(KeyExpansion),2、初始輪(Initial Round),3、重復(fù)輪(Rounds),每一輪又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最終輪(Final Round),最終輪沒有MixColumns。
1.3 RSA
RSA是一種公開密鑰算法。由Ron Rivest、Adi Shamir、Leonard Adleman提出,故該算法取三個(gè)人名字的首字母來命名。它通常是先生成一對(duì)RSA 密鑰,其中之一是保密密鑰,由用戶保存;另一個(gè)為公開密鑰,可對(duì)外公開。
RSA算法基于一個(gè)十分簡(jiǎn)單的數(shù)論事實(shí):將兩個(gè)大質(zhì)數(shù)相乘十分容易,但是想要對(duì)其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
具體解析:帶你徹底理解RSA算法原理
1.4 加密算法選擇
因?qū)ΨQ加密算法在傳輸數(shù)據(jù)時(shí),也需要把雙方共同的密鑰明文傳給對(duì)方,這里就會(huì)出現(xiàn)安全性地問題,故現(xiàn)在所有的通信都會(huì)使用公開密鑰算法RSA。
但RSA有幾個(gè)缺點(diǎn):1.產(chǎn)生密鑰很麻煩,受到素?cái)?shù)產(chǎn)生技術(shù)的限制,因而難以做到一次一密;速度太慢,由于RSA 的分組長(zhǎng)度太大,為保證安全性,n 至少也要 600 bits以上,使運(yùn)算代價(jià)很高,尤其是速度較慢,較對(duì)稱密碼算法慢幾個(gè)數(shù)量級(jí);且隨著大數(shù)分解技術(shù)的發(fā)展,這個(gè)長(zhǎng)度還在增加,不利于數(shù)據(jù)格式的標(biāo)準(zhǔn)化。
為了速度問題,人們廣泛使用單,公鑰密碼結(jié)合使用的方法,優(yōu)缺點(diǎn)互補(bǔ):?jiǎn)舞€密碼加密速度快,人們用它來加密較長(zhǎng)的文件,然后用RSA來給文件密鑰加密,極好的解決了單鑰密碼的密鑰分發(fā)問題。在對(duì)稱密鑰算法中應(yīng)首選AES。
二、數(shù)字簽名
數(shù)字簽名就是為了證明發(fā)布數(shù)據(jù)者的身份。簽名流程是先 認(rèn)證,再 加密。
- 認(rèn)證。以單向散列函數(shù)思想為基礎(chǔ),它接受一個(gè)任意長(zhǎng)度的明文作為輸入,然后計(jì)算出一個(gè) 固定長(zhǎng)度 的位串,這個(gè)散列函數(shù)MD稱為 消息摘要(Message Digest)。散列過程是不可逆的,即給定P很容易計(jì)算出MD(P),但給定MD(P),不能有效推算出P;并且輸入明文中即使只有1位變化也會(huì)導(dǎo)致完全不同的輸出。
- 加密。加密的過程也就是簽名的過程,為了安全,在實(shí)際的場(chǎng)景中,仍然使用公開加密算法RSA,為了證明發(fā)布者的身份,發(fā)布者就會(huì)用自己的私鑰加密,接收方用發(fā)布者的公鑰解密來確認(rèn)。
發(fā)布者對(duì)明文進(jìn)行簽名后,需要把明文和摘要都發(fā)給接收方,接收方只需對(duì)明文也hash計(jì)算出摘要,和接收到的摘要進(jìn)行對(duì)比是否一致。
問題1:理論上用RSA直接對(duì)明文簽名就可以,為什么還要先對(duì)消息進(jìn)行散列得到摘要再加密?
Why hash the message before signing it with RSA?
主要原因無(wú)非是 安全 和 快速。散列過程是不可逆的,故安全;散列完總是計(jì)算出一個(gè)固定的值,能加快RSA的加減密速度。
問題2:RSA的公鑰和私鑰到底哪個(gè)才是用來加密和哪個(gè)用來解密?
RSA算法是第一個(gè)能同時(shí)用于加密和數(shù)字簽名的算法。RSA的兩個(gè)密鑰是對(duì)稱的,隨便哪一個(gè)加密,可以用另一個(gè)解密,理論上你可以保留公鑰,發(fā)布私鑰,只不過公鑰可以通過私鑰輕松算出,反之不行,故實(shí)際中的做法是保留私鑰發(fā)布私鑰。
我們會(huì)發(fā)現(xiàn)實(shí)際中對(duì)數(shù)據(jù)加密時(shí),使用的是接收方的公鑰,而在數(shù)字簽名時(shí),使用的是發(fā)送者的私鑰。
RSA的公鑰和私鑰到底哪個(gè)才是用來加密和哪個(gè)用來解密?
不要去硬記。
你只要想:既然是加密,那肯定是不希望別人知道我的消息,所以只有我才能解密,所以可得出 公鑰負(fù)責(zé)加密,私鑰負(fù)責(zé)解密;同理,既然是簽名,那肯定是不希望有人冒充我發(fā)消息,只有我才能發(fā)布這個(gè)簽名,所以可得出 私鑰負(fù)責(zé)簽名,公鑰負(fù)責(zé)驗(yàn)證。
2.1 MD5(Message-Digest Algorithm 5, 信息-摘要算法5)
MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個(gè)32位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個(gè)32位分組組成,將這四個(gè)32位分組級(jí)聯(lián)后將生成一個(gè)128位散列值。
MD5碼可以唯一地代表原信息的特征,通常用于密碼的加密存儲(chǔ),數(shù)字簽名,文件完整性驗(yàn)證等。
2.2 SHA-1(Secure Hash Algorithm 1, 安全散列算法1)
SHA-1 會(huì)從一個(gè)最大 2^64 位元的訊息中產(chǎn)生一串 160 位元的摘要。SHA-1基于MD5,MD5又基于MD4。
論壇里提供的系統(tǒng)鏡像文件的hash也就是微軟官方提供的SHA-1值,下載后和此值對(duì)應(yīng),就說明你下載過程中文件沒有被更改,屬于原版。
比較:SHA-1摘要比MD5摘要長(zhǎng) 32 比特,故SHA-1抗攻擊能力更強(qiáng),自然運(yùn)行速度比MD5慢。需根據(jù)實(shí)際場(chǎng)景來選擇。
三、編碼轉(zhuǎn)換
在進(jìn)行完加密和簽名后的數(shù)據(jù)時(shí)二進(jìn)制的,不適合用于傳輸,故需要轉(zhuǎn)換為字符集。目前常見的編碼算法就是 Base64。
Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的編碼方式之一,Base64就是一種基于64個(gè)可打印字符來表示二進(jìn)制數(shù)據(jù)的方法。Base64編碼是從二進(jìn)制到字符的過程,可用于在HTTP環(huán)境下傳遞較長(zhǎng)的標(biāo)識(shí)信息。
四、總結(jié)
目前大多數(shù)應(yīng)用通信的安全流程是:

上圖是加密和簽名的流程圖,而解密和驗(yàn)簽倒序進(jìn)行。
五、公鑰管理
為了安全地分發(fā)公鑰(因?yàn)樵趥鬏數(shù)倪^程中可能被非法者替換),就建立了能證明公鑰所屬權(quán)的 認(rèn)證中心(CA, Certification Authority)。CA會(huì)給申請(qǐng)者頒發(fā)一個(gè)證書,用自己私鑰對(duì)證書的SHA-1散列值進(jìn)行簽名。證書的作用就是將一個(gè)公鑰與安全個(gè)體的名字綁定在一起。
實(shí)際上,CA并不是一個(gè),為了安全和效率,而是分等級(jí)層次的,這樣即使一個(gè)CA的數(shù)據(jù)庫(kù)被攻破了,也不會(huì)影響全球的安全性。最頂級(jí)的CA即層次的根,它的責(zé)任是證明第二級(jí)的CA,頂級(jí)CA稱為 區(qū)域管理機(jī)構(gòu)(RA, Regional Authority)

當(dāng)用戶不相信對(duì)方直屬CA頒發(fā)的證書時(shí),就會(huì)請(qǐng)求上一級(jí)CA,以此類推,請(qǐng)求的證書就形成了一個(gè) 證書鏈(Certificate chain)??傊惚仨毾嘈鸥鵆A,證書鏈才有效,當(dāng)然根CA并非只有一個(gè),而是有多個(gè)根,每個(gè)根都有它直接的RA和CA。實(shí)際上,現(xiàn)代瀏覽器在安裝的時(shí)候預(yù)先加載了100多個(gè)根的公鑰。通過這種方式,就可以避免在全球范圍內(nèi)使用單一的可信權(quán)威機(jī)構(gòu)。
六、常見安全通信協(xié)議
6.1 GPG/PGP
PGP(Pretty Good Privacy, 良好的隱私性) 是一個(gè)完整的電子有點(diǎn)安全軟件包,提供了私密性、認(rèn)證、數(shù)字簽名和壓縮功能。它使用 國(guó)際數(shù)據(jù)加密算法(IDEA, International Data Encryption Algorithm) 的塊密碼算法來加密數(shù)據(jù),PGP的密鑰管理使用RSA,數(shù)據(jù)完整性使用MD5。
PGP使用已有的密碼學(xué)算法,而不是發(fā)明新的算法。它像一個(gè)預(yù)處理器,接受明文輸入,并產(chǎn)生簽過名的密文作為輸出,其輸出格式為Base64。

但是PGP是商業(yè)軟件,不能自由使用。所以自由軟件基金會(huì)決定,開發(fā)一個(gè)PGP的替代品,取名為GnuPG,即 GPG(The GNU Privacy Guard)。
6.2 SSH(Secure Shell, 安全外殼協(xié)議)
SSH 為建立在應(yīng)用層基礎(chǔ)上的安全協(xié)議,它專為遠(yuǎn)程登錄會(huì)話和其他網(wǎng)絡(luò)服務(wù)提供安全性的協(xié)議。SSH最初是UNIX系統(tǒng)上的一個(gè)程序,后來又迅速擴(kuò)展到其他操作平臺(tái)。SSH采用面向連接的TCP協(xié)議傳輸,監(jiān)聽 22端口。
傳統(tǒng)的網(wǎng)絡(luò)服務(wù)程序,如:ftp、pop和telnet在本質(zhì)上都是不安全的,因?yàn)樗鼈冊(cè)诰W(wǎng)絡(luò)上用明文傳送口令和數(shù)據(jù),別有用心的人非常容易就可以截獲這些口令和數(shù)據(jù)。而且,這些服務(wù)程序的安全驗(yàn)證方式也是有其弱點(diǎn)的, 就是很容易受到“中間人”(man-in-the-middle)這種方式的攻擊。通過使用SSH,你可以把所有傳輸?shù)臄?shù)據(jù)進(jìn)行加密,這樣"中間人"這種攻擊方式就不可能實(shí)現(xiàn)了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個(gè)額外的好處就是傳輸?shù)臄?shù)據(jù)是經(jīng)過壓縮的,所以可以加快傳輸?shù)乃俣取?br>
從客戶端來看,SSH提供兩種級(jí)別的安全驗(yàn)證:
- 基于口令的安全驗(yàn)證:通過帳號(hào)和口令登錄到遠(yuǎn)程主機(jī),所有傳輸?shù)臄?shù)據(jù)都會(huì)被加密。但可能會(huì)有別的服務(wù)器在冒充真正的服務(wù)器,也就是受到“中間人”這種方式的攻擊。
- 基于密匙的安全驗(yàn)證:需要?jiǎng)?chuàng)建一對(duì)密匙,并把公用密匙放在需要訪問的服務(wù)器上,通過類似RSA的方式來加密和解密數(shù)據(jù)。它不僅加密所有傳送的數(shù)據(jù),而且“中間人”這種攻擊方式也是不可能的(因?yàn)樗麤]有你的私人密匙),但是整個(gè)登錄的過程可能需要10秒。
生活中應(yīng)該首選SSH Keys,盡量避免使用密碼方式登錄SSH。
6.3 SSL(Secure Sockets Layer, 安全套接層)
現(xiàn)在SSL的協(xié)議已廣泛被Google、Firefox、Safari和IE等瀏覽器采用,主要用于頁(yè)面信息的通信。SSL在兩個(gè)套接字之間建立一個(gè)安全的連接,主要功能有瀏覽器和服務(wù)器的雙向認(rèn)證、數(shù)據(jù)加密和數(shù)據(jù)完整性保護(hù)等。
實(shí)際上,SSL位于應(yīng)用層和傳輸層之間的一個(gè)新層,它接受來自瀏覽器的請(qǐng)求,再將請(qǐng)求傳遞給TCP以便傳輸?shù)椒?wù)器上。一旦安全的連接已經(jīng)被建立起來,則SSL的主要任務(wù)時(shí)處理壓縮和加密。
在SSL上使用的HTTP被稱為 安全的HTTP(HTTPS, Secure HTTP),它使用一個(gè)新端口 443,而不是標(biāo)準(zhǔn)的端口80?,F(xiàn)在許多企業(yè)都強(qiáng)烈推薦使用HTTPS協(xié)議,2017.01.01蘋果要求所以的APP都必須使用HTTPS。

SSL存在一個(gè)問題是,用戶并不總是驗(yàn)證所用的密鑰是否與證書相匹配,故產(chǎn)生了IETF標(biāo)準(zhǔn)haul后的 傳輸層安全(TLS, Transport Layer Security)。TLS是SSL的第3個(gè)版本,這就是所謂的 SSL/TLS。
參考鏈接:《計(jì)算機(jī)網(wǎng)絡(luò)(第5版)》 AndrewS.Tanenbaum
RSA算法原理(一)
RSA算法原理(二)