密碼技術那些事兒

前言

《圖解密碼技術》一書介紹了很多關于密碼的知識,通讀一遍需要不少時間。為了方便學習,我對書中關鍵的部分進行了總結,希望可以提高大家的學習效率。如果想對本文中的某些內容進行深入研究,您可以查閱原書。

歷史上的密碼

凱撒密碼

凱撒密碼是通過將明文中所使用的字母表按照一定的字數“平移”來進行加密和解密的。

簡單替換密碼

簡單替換密碼是將明文中所使用的的字母表替換為另一套字母表的密碼。

Enigma

Enigma是第二次世界大戰中德國使用的一種密碼機,它是一種由鍵盤、齒輪、電池、和燈泡所組成的機器,通過這一臺機器就可以完成加密和解密兩種操作。

現代計算機之父阿蘭?圖靈曾是破譯德國密碼機團隊的一員。圖靈在1940年研制出了用于破譯Enigma的機器。

對稱密碼

對稱密碼是一種用相同的密鑰進行加密和解密的技術,用于確保消息的機密性。

對稱密碼.png
一次性密碼本

只要通過暴力破解法對密鑰空間進行遍歷,無論什么密文總有一天也都能夠被破譯。然而一次性密碼本卻是一個例外,即便使用暴力破解法遍歷整個密鑰空間,一次性密碼本也絕對無法被破譯。
一次性密碼本是一種非常簡單的密碼,它的原理是“將明文與一串隨機的比特序列進行XOR(異或)運算”。
在一次性密碼本中,由于我們無法判斷得到的是不是正確的明文,因此一次性密碼本是無法破譯的。
由于一次性密碼本存在配送、保存、重用、同步等方面的問題,所以幾乎沒有人應用一次性密碼本,因為它是一種非常不實用的密碼。

DES

DES(Data Encryption Standard)是1977年美國聯邦信息處理標準中所采用的一種對稱碼。
DES是一種將64比特的明文加密成64比特的密文的對稱密碼算法,它的密鑰長度是56比特。盡管從規格上來說,DES的密鑰長度是64比特,但由于每隔7比特會設置一個用于錯誤檢查的比特,因此實質上其實密鑰長度是56比特。

由于DES的密文可以在短時間內被破譯,因此除了用它來解密以前的密文以外,現在我們不應該使用DES了。

三重DES

三重DES是為了增加DES的強度,將DES重復3次所得到的一種密碼算法,也稱為TDEA,通常縮寫為3DES。

盡管三重DES目前還被銀行等機構使用,但其處理速度不高,除了特別重視向下兼容性的情況以外,很少被用于新的用途。

AES

AES(Advanced Encryption Standard)是取代其前任標準(DES)而成為新標準的一種對稱密碼算法(Rijndael)。
Rijndael是由比利時密碼學家Joan Daemen和Vincent Rijmen設計的分組密碼算法,于2000年被選為新一代的標準密碼算法——AES。
Rijndael的分組長度和密鑰長度可以分別以32比特為單位在128比特到256比特的范圍內進行選擇。不過在AES的規格中,分組長度固定為128比特,密鑰長度只有128、192、和256比特三種。

AES相比同類對稱加密算法速度算是非常快,比如在有AES-NI的x86服務器至少能達到幾百M/s的速度。安全性在可預見的未來是基本等同的,因為即使是128位也足夠復雜無法被暴力破解。現在112位密碼還在商業應用,而128位是112位的幾萬倍,所以在實務中用128位比較劃算(稍節約資源)。
AES256比128大概需要多花40%的時間,用于多出的4輪round key生成以及對應的SPN操作。另外,產生256-bit的密鑰可能也需要比128位密鑰多些開銷,不過這部分開銷應該可以忽略。安全程度自然是256比128安全,因為目前除了暴力破解,并沒有十分有效的代數攻擊方法。
AES128和AES256主要區別是密鑰長度不同(分別是128bits,256bits)、加密處理輪數不同(分別是10輪,14輪),后者強度高于前者。當前AES是較為安全的公認的對稱加密算法。
關于用AES128還是AES256算法,個人認為AES128已經足夠用,當然AES256可以作為一個營銷手段使用

參考:http://blog.csdn.net/newizan/article/details/45461347

在對稱密碼的算法方面,目前主要使用的是AES,因為它安全、快速、而且能夠在各種平臺上工作。盡管對稱密碼能夠確保消息的機密性,但需要解決將解密秘鑰配送給接收者的密鑰配送問題

分組密碼的模式

DES和AES都屬于分組密碼,它們只能加密固定長度的明文。如果需要加密任意長度的明文,就需要對分組密碼進行迭代,而分組密碼的迭代方法就稱為分組密碼的模式。

ECB模式

Electronic CodeBook Mode(電子密碼本模式)。在ECB模式中,將明文分組加密之后的結果直接成為密文分組。

由于安全性最差已不推薦使用

CBC模式

Cipher Block Chaining Mode(密文分組鏈接模式)。在CBC模式中,首先將明文分組與前一個密文分組進行XOR運算,然后再進行加密。

初始化向量

當加密第一個明文分組時,由于不存在“前一個密文分組”,因此需要事先準備一個長度為一個分組的比特序列來代替“前一個密文分組”,這個比特序列稱為初始化向量(Initialization Vector),通常縮寫為IV

CFB模式

Cipher FeedBack Mode(密文反饋模式)。在CFB模式中,首先將前一個密文分組進行加密,最后將加密后的密鑰流與明文分組進行XOR運算得到密文分組。

OFB模式

Output-Feedback Mode(輸出反饋模式)。在OFB模式中,逐次的對密鑰流進行加密后得到流密碼,與明文分組進行XOR運算得到密文分組。

CTR模式

CounTeR Mode(計數器模式)。在CTR模式中,通過將逐次累加的計數器進行加密來生成密鑰流的流密碼,然后與明文分組進行XOR運算得到密文分組。

公鑰密碼

公鑰密碼(非對稱密碼)中,密鑰分為加密密鑰和解密密鑰兩種。發送者用加密密鑰對消息進行加密,接收者用解密密鑰對密文進行解密。

公鑰密碼.png
RSA

RSA是一種公鑰密碼算法,它的名字是由它的三位開發者,即Ron Rivest、Adi Shamir和Leonard Adleman的姓氏的首字母組成的(Rivest-Shamir-Adleman)。

RSA的加密是求“E次方的 mod N”,而解密則是求“D次方的 mod N”

密文 = 明文^E mod N

明文 = 密文^D mod N
EIGamal方式

EIGamal方式是由Taher EIGamal設計的公鑰算法。RSA利用了質因數分解的困難度,而EIGamal方式則利用了mod N 下求離散對數的困難度。

Rabin方式

Rabin方式是由M.O.Rabin設計的公鑰算法。Rabin方式利用了mod N下求平方根的困難度。

橢圓曲線密碼

橢圓曲線密碼(Elliptic Curve Cryptography,ECC)是最近備受關注的一種公鑰密碼算法。它的特點是所需的密鑰長度比RSA短。
橢圓曲線密碼是通過將橢圓曲線上的特定點進行特殊的乘法運算來實現的,它利用了這種乘法運算的逆運算非常困難這一特性。

使用公鑰密碼能夠解決密鑰配送問題。公鑰密碼是密碼學界的一項革命性發明,現代計算機和互聯網所使用的密碼技術都得益于公鑰密碼。
盡管公鑰密碼能夠解決對稱密碼中的密鑰交換問題,但存在通過中間人攻擊被偽裝的風險,因此需要對帶有數字簽名的公鑰進行認證
即使已經有了公鑰密碼,對稱密碼也不會消失。公鑰密碼的運行速度遠遠低于對稱密碼,因此在一般的通信過程中,往往會配合使用這兩種密碼,即用對稱密碼提高處理速度,用公鑰密碼解決密鑰配送問題。這樣的方式稱為混合密碼系統。

單向散列函數

單向散列函數有一個輸入和一個輸出,其中輸入稱為消息(message),輸出稱為散列值(hash code)。單向散列函數可以根據消息的內容計算出散列值,而散列值就可以被用來檢查消息的完整性。
散列值的長度和消息的長度無關。無論消息是1比特,還是100MB,甚至是100GB,單向散列函數都會計算出固定長度的散列值。
以SHA-256單向散列函數為例,它所計算出的散列值的長度永遠是256比特(32字節)。
為了能夠確認完整性,消息中哪怕只有1比特的改變,也會產生不同的散列值。
單向散列函數輸出的散列值也稱為消息摘要(message digest)或者指紋(fingerprint)

單向散列函數根據消息的內容計算出散列值.png
MD4、MD5

MD(Messge Digest)4是由Rivest于1990年設計的單向散列函數,能夠產生128比特的散列值。現在它已經不安全了。
MD(Messge Digest)5是由Rivest于1991年設計的單向散列函數,能夠產生128比特的散列值。MD5的強抗碰撞性已經被攻破。也就是說,現在已經能夠產生具備相同散列值的兩條不同的消息,因此它也不安全了。

SHA-1、SHA-256、SHA-384、SHA512

SHA-1是由NIST(美國國家標準技術研究所)設計的一種能夠產生160比特的散列值的單向散列函數。現在已不推薦使用
SHA-256、SHA-384、SHA512都是由NIST設計的單向散列函數,它們的散列值長度分別為256比特、384比特、和512比特。這些單向散列函數合起來統稱SHA-2。
SHA-1的強抗碰撞性已于2005年被攻破,不過,SHA-2還尚未被攻破。

RIPEMD-160

RIPEMD-160是于1996年由Hans Dobbertin、Antoon Bosselaers和Bart Preneel設計的一種能夠產生160比特的散列值的單向散列函數。RIPEMD-160是歐盟RIPE項目所設計的RIPEMD單向散列函數的修訂版。
RIPEMD的強抗碰撞性已經于2004年被攻破,但RIPEMD-160還尚未被攻破。比特幣中使用的就是RIPEMD-160。

SHA-3

SHA-3(Secure Hash Algorithm-3)是一種作為新標準發布的單向散列函數算法,用來替代在理論上已被找出攻擊方法的SHA-1算法。
SHA-3的標準是Keccak算法。

Keccak

Keccak是一種被選定為SHA-3標準的單向散列函數算法。
Keccak可以生成任意長度的散列值,但為了配合SHA-2的散列值長度,SHA-3標準中共規定了SHA3-224、SHA3-256、SHA3-384、SHA3-512這4種版本。

單向散列函數能夠辨別出“篡改”,但無法辨別出“偽裝”,這時就需要進行認證

消息認證碼

消息認證碼(Message Authentication Code)是一種確認完整性并進行認證的技術,簡稱為MAC。
消息認證指的是“消息來自正確的發送者”這一性質。
消息認證碼的輸入包括任意長度的消息和一個發送者與接受者之間共享的密鑰,它可以輸出固定長度的數據,這個數據成為MAC值。
要計算MAC必須持有共享密鑰,沒有共享密鑰的人就無法計算MAC值,消息認證碼正是利用這一性質來完成認證的。此外,和單向散列函數的散列值一樣,哪怕消息中發生1比特的變化,MAC值也會產生變化,消息認證碼正是利用這一性質來確認完整性的。
消息認證碼可以說是一種與密鑰相關聯的單向散列函數。
消息認證碼可以使用單向散列函數和對稱密碼等技術來實現。

單向散列函數與消息認證碼的比較.png
消息認證碼的使用步驟.png
HMAC

HMAC是一種使用單向散列函數來構造消息認證碼的方法,其中HMAC的H就是Hash的意思。

消息認證碼也不能解決所有的問題,例如“對第三方證明”,和“防止否認”,這兩個問題就無法通過消息認證碼來解決。

數字簽名

消息認證碼之所以無法防止否認,是因為消息認證碼需要在發送者和接收者兩者之間共享一個密鑰。
數字簽名是一種能夠對第三方進行消息認證,并能夠防止通信對象作出否認的認證技術。
數字簽名中也同樣會使用公鑰和私鑰組成的密鑰對,不過這兩個密鑰的用法和公鑰密碼是相反的,即用私鑰加密相當于生成簽名,而用公鑰解密則相當于驗證簽名。

生成簽名和驗證簽名.png

實現數字簽名使用的算法如下:

RSA

RSA是一種公鑰密碼算法,它的名字是由它的三位開發者,即Ron Rivest、Adi Shamir和Leonard Adleman的姓氏的首字母組成的(Rivest-Shamir-Adleman)。

用RSA生成簽名和驗證簽名的過程可用下列公式來表述:

簽名 = 消息^D mod N

由簽名得到的消息 = 密文^E mod N
EIGamal

EIGamal方式是由Taher EIGamal設計的公鑰算法。利用了mod N 下求離散對數的困難度。EIGamal方式可以被用于公鑰密碼和數字簽名。

DSA

DSA(Digital Signature Algorithm)是一種數字簽名算法,是由NIST于1991年制定的數字簽名規范。
DSA是Scnorr算法與EIGammal方式的變體,只能被用于數字簽名。

ECDSA

ECDSA(Elliptic Curve Digital Signature Algorithm)是一種利用橢圓曲線密碼來實現的數字簽名算法。

Rabin方式

Rabin方式是由M.O.Rabin設計的公鑰算法。利用了在mod N下求平方根的困難度。Rabin方式可以被用于公鑰密碼和數字簽名。

用數字簽名既可以識別出篡改和偽裝,還可以防止否認,但是無法確認用于驗證簽名的公鑰屬于真正的發送者的。
要確認公鑰是否合法,可以對公鑰施加數字簽名,這就是證書

證書

公鑰證書(Public-Key Certificate,PKC)其實和駕照很相似,里面記有姓名、組織、郵箱、地址等個人信息,以及屬于此人的公鑰,并由認證機構(Certification Authority,CA)施加數字簽名。只要看到公鑰證書,我們就可以知道認證機構認定該公鑰的確屬于此人。公鑰證書也簡稱為證書。
認證機構就是能夠認定“公鑰確實屬于此人”并能夠生成數字簽名的個人或者組織。

消息發送者利用認證機構向消息接收者發送密文.png
X.509

X.509是一種證書生成和交換的標準規范。

PKI

PKI(Public-Key Infrastructure)是為了能夠更有效地運用公鑰而制定的一系列規范和規格的總稱。X.509也是PKI的一種。

密鑰

各種不同的密鑰
1.對稱密碼的密鑰與公鑰密碼的密鑰
2.消息認證碼的密鑰與數字簽名的密鑰
3.用于確保機密性的密鑰與用于認證的密鑰
4.會話密鑰與主密鑰

當我們訪問以 https:// 開頭的網頁時,Web服務器和瀏覽器之間會進行基于SSL/TLS的加密通信。在這樣的通信中所使用的密鑰是僅限于本次通信的一次性密鑰,下次通信時就不能使用了。像這樣每次通信只能使用一次的密鑰稱為會話密鑰(session key)。
相對于每次通信都更換的會話密鑰,一直被重復使用的密鑰稱為主密鑰(master key)。

5.用于加密內容的密鑰與用于加密密鑰的密鑰

一般來說,加密的對象是用戶直接使用的消息(內容),這樣的情況下所使用的密鑰稱為CEK(Contents Encrypting Key);相對地,用于加密密鑰的密鑰則稱為KEK(Key Encrypting Key)。
上面提到的會話密鑰都是被作為CEK使用的,而主密鑰則是被作為KEK使用的。

CEK與KEK.png
Diffe-Hellman密鑰交換

Diffe-Hellman密鑰交換是1976年由Whitfield Diffe和Martin Hellman共同發明的一種算法。使用這種算法,通信雙方通過交換一些可以公開的信息就能夠生成出共享的秘密數字,而這一秘密數字就可以被用作對稱密碼的密鑰。

Diffee-Hellman密鑰交換.png
橢圓曲線Diffe-Hellman密鑰交換

Diffe-Hellman密鑰交換是利用“離散對數問題”的復雜度來實現密鑰的安全交換的,如果對“離散對數問題”改為“橢圓曲線上的離散對數問題”,這樣的算法就稱為橢圓曲線Diffe-Hellman密鑰交換。
橢圓曲線Diffe-Hellman密鑰交換能夠用較短的密鑰長度實現較高的安全性。

基于口令的密碼(PBE)

基于口令的密碼(Password Based Encryption,PBE)就是一種根據口令生成密鑰并用該密鑰進行加密的方法。其中加密和解密使用同一個密鑰。
其中密鑰(KEK)是由口令和鹽(由偽隨機數生成器生成的隨機數)一起輸入的單向散列函數。
鹽是用來防御字典攻擊的。字典攻擊是一種事先進行計算并準備好候選密鑰列表的方法。

PBE加密.png
PBE解密.png

隨機數

隨機數的用處
  • 生成密鑰:用于對稱密碼和消息認證碼。
  • 生成密鑰對:用于公鑰密碼和數字簽名。
  • 生成初始化向量(IV):用于分組密碼的CBC、CFB和OFB模式。
  • 生成nonce:用于防御重放攻擊以及分組密碼的CTR模式等。
  • 生成鹽:用于基于口令的密碼等。
隨機數的性質
  • 隨機性(弱偽隨機數)
  • 不可預測性(強偽隨機數)
  • 不可重現性(真隨機數)
隨機數生成器

通過硬件生成的隨機數列,是根據傳感器收集的熱量、聲音的變化等事實上無法預測和重現的自然現象信息來生成的。像這樣的硬件設備就稱為隨機數生成器。

偽隨機數生成器

而可以生成隨機數的軟件則稱為偽隨機數生成器。因為僅靠軟件無法生成真隨機數,因此要加上一個“偽”字。

SSL/TLS

SSL(Secure Sockets Layer,安全套接層)是1994年由網景公司(Netscape)設計的一種協議,并在該公司的Web瀏覽器上進行了實現。隨后,很多Web瀏覽器都采用了這一協議,使其成為了事實上的行業標準。SSL已經于1995年發布了3.0版本,但在2014年,SSL3.0協議被發現存在可能導致POODLE攻擊的安全漏洞,因此SSL3.0已經不安全了。

TLS(Transport Layer Security ,傳輸層安全)是IETF在SSL3.0的基礎上設計的協議。在1999年作為RFC2246發布的TLS1.0,實際上相當于SSL3.1。
2006年,TLS1.1以以RFC4346的形式發布,這個版本中增加了針對CBC攻擊的策略并加入了AES對稱加密算法。TLS1.2中新增了對GCM、CCM認證加密的支持,此外還新增了HMAC-SHA256,并刪除了IDEA和DES,將偽隨機函數(PRF)改為基于SHA-256來實現。

SSL/TLS的工作

我們想要實現通過本地的Web瀏覽器訪問網絡上的Web服務器,并進行安全通信。舉個例子來說就是,用戶希望通過Web瀏覽器向xx銀行發送信用卡號。在這里,我們有幾個必須要解決的問題。

(1)用戶的信用卡號和地址在發送到xx銀行的過程中不能被竊聽。
(2)用戶的信用卡號和地址在發送到xx銀行的過程中不能被篡改。
(3)確認通信對方的Web服務器是真正的xx銀行。

在這里,(1)是機密性問題,(2)是完整性問題,(3)則是認證的問題。
要確保機密性,可以使用對稱密碼。由于對稱密碼的密鑰不能被攻擊者預測,因此我們使用偽隨機數生成器來生成密鑰。若要將對稱密碼的密鑰發送給通信對象,可以使用公鑰密碼或者Diffie-Hellman密鑰交換。
要識別篡改,對數據進行認證,可以使用消息認證碼。消息認證碼是使用單向散列函數來實現的。
要對通信對象進行認證,可以使用對公鑰加上數字簽名所生成的證書。

SSL/TLS就是將對稱密碼、公鑰密碼、單向散列函數、消息認證碼、偽隨機數生成器、數字簽名等技術相結合來實現安全通信的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 對稱加密: DES DES是1977年美國聯邦信息處理標準中使用的一種對稱密碼技術,曾今被美國和其他國家政府銀行使...
    十三億少女夢丶閱讀 1,147評論 0 10
  • 本文主要介紹移動端的加解密算法的分類、其優缺點特性及應用,幫助讀者由淺入深地了解和選擇加解密算法。文中會包含算法的...
    蘋果粉閱讀 11,580評論 5 29
  • 這篇文章主要講述在Mobile BI(移動商務智能)開發過程中,在網絡通信、數據存儲、登錄驗證這幾個方面涉及的加密...
    雨_樹閱讀 2,682評論 0 6
  • Guide to BluetoothSecurity原文 本出版物可免費從以下網址獲得:https://doi.o...
    公子小水閱讀 8,268評論 0 6
  • 〇、序言 貨幣由于其天然屬性決定了其與安全不可分割的聯系,從最早的金庫、保險柜、鏢局到后來的ATM機、運鈔車;從存...
    怒馬2048閱讀 39,084評論 4 79