1. 程式人生 > >密碼學與演算法

密碼學與演算法

首先說一下,我為什麼要寫密碼學的部落格,由於hyperledger fabric中加密演算法和雜湊算貫穿整個專案,所以在分析加密那部分的程式碼之前,我將簡單的介紹一下密碼學的內容。密碼學的內容我將寫以下幾篇博文

1.初入密碼學世界

2.對稱加密與公鑰加密

3.混合加密

4.認證、金鑰、隨機數與技術應用

5.PGP

6.SSL/TLS

7.區塊鏈與密碼學

8.橢圓曲線加密

廢話不多說,我們進入初入密碼學世界的內容

一、概述

1、文中將會出現的幾個名詞

傳送者:網路訊息的傳送人,現在假設傳送者叫"小明"

接收者:網路中接收發送者傳送過來的訊息的人,假設接收者叫"阿貓"

竊聽者:試圖攔擊訊息並破解訊息的人,竊聽者叫“阿狗”

他們三者的關係如下圖

在網路中這樣的關係是永遠存在的。下面這張圖將向你展示整個過程

由上圖我們可以看出,小明將明文加密成密文再發送給阿貓,但在訊息傳送的過程中,總會存在阿狗這樣牛逼人物,把訊息攔擊並破解,當然,有可能只是把訊息攔擊啦,但是破解需要的時間很長,所以阿狗中途放棄了也是可能的,這就要看加密演算法的強度是不是夠大啦。

2、對稱密碼與公鑰密碼

對稱密碼:同一把金鑰進行加解密

公鑰密碼:私鑰加密,公鑰解密

一般 公鑰加密 私鑰解密,  私鑰簽名 公鑰驗籤

3.單項雜湊函式

為了防止軟體被篡改,釋出軟體的同時釋出該軟體的雜湊值,雜湊值有稱雜湊值、密碼校驗、指紋和訊息摘要雜湊值就是用單項雜湊函式計算出來的值。

單項雜湊函式並不是保證安機密性,而是完整性,使用它可以檢測資料是否被篡改過。

4.訊息認證碼

保證完整性的同時提供認證機制

5.數字簽名

確保完整性,提供認證並防止否認的密碼技術

6.偽隨機數生成器

擔任金鑰生成的重要職責

現在用一張圖來清晰地表示他們之間的關係

我們把上面說到的6種技術統稱為密碼學家的工具箱,關於他們的細節內容我們將在接下來的部落格將介紹。

接著上一篇初入密碼學世界,這一篇部落格我們將介紹以下內容,先來一個思維導圖,看看這篇部落格的內容

以上內容在這篇部落格中我都會詳細地講解,當然,這只是個大體的架構圖,很多細節的知識點沒有包含進去。

對稱密碼

在開篇之前,先說幾個名詞

位元序列:對於這個詞,學過任何一門程式語言的人都不陌生,其實它就是0和1排列而成的數字

編碼:將現實世界中的東西對映為位元序列的過程稱為編碼

XOR:看到這三個英文字母,是不是一臉懵逼呢,它的中文名叫異或

DES,AES,Rijndael這裡先不解釋,到講到它們的時候再做解釋

1.異或

這裡,我們就簡單先說一下異或,因為對稱加密中它很重要

1個位元的XOR運算規則如下

0 XOR 0   = 0

0 XOR 1   = 1

1 XOR 1   = 0

1 XOR 0   = 1

XOR用符號,這玩意兒不畫圖,我還不好操作,下面我們還是使用XOR吧

現在我們來看個例子

0  1  0  0  1  1  0  0  --------- A

XOR

1  0  1  0  1  0  1   0  ----------B

等於

1  1  1  0   0  1  1  0 ---> A XOR B

-----------------------------------------------------------------------------------------------------------------

1  1  1  0   0  1  1  0 --->A XOR B

XOR

1  0  1  0   1   0  1  0 -------------B

等於

0  1  0  0   1   1   0  0 -------->變回了 A

-------------------------------------------------------------------------------------------------------------------

上面這個例子幹了什麼事呢,大家應該看明白了吧

將明文 A 用金鑰 B 進行加密,得到密文A XOR B

將密文 A XOR B 用金鑰 B 進行解密,得到明文 A

對於密碼技術來說,“是否可以預測”是非常重要的一點,能夠產生不可預測的位元序列,對於密碼學技術貢獻是巨大的。這種不可預測的位元序列就稱為隨機數。關於這個問題以後的博文中再做介紹

2.一次性密碼本(維納密碼)

原理就是將明文與一串隨機位元序列進行XOR運算,與上面的演算法一致,不多做解釋。

特點:在理論上是無法破解的

由於一次性密碼本並沒有什麼卵用,故而不在這裡不多講,有興趣的人自己去查資料。雖然一次性密碼本是一種幾乎沒有實用性的密碼,但是,一次性密碼本的思路卻孕育出了流密碼。流密碼使用的不是真正的隨機位元序列,而是偽隨機數生成器產生的位元序列。流密碼雖然不是無法破譯的,但是隻要使用高效能的偽隨機數生成器,就能夠構建出強度較高的密碼系統。關於流密碼下面會詳細介紹。關於偽隨機數生成器估計要在後面的博文中才能介紹。

3、DES

DES是一種將64位元的明文加密成64位元的密文的對稱密碼演算法,它的金鑰長度是56位元。為什麼金鑰長度只有56位元呢,原因是每隔7個位元位會設定一個用於錯誤檢查的位元,因而其金鑰長度是56位。

DES是以64位元的明文(位元序列)為一個單位來進行加密的,這個64位元的單位稱為分組。DES其實就是分組密碼中的一種。

DES每次只能加密64位元的資料,如果要加密的明文長度比較長,就需要對DES加密進行迭代,迭代的具體方式成為模式(mode)

4.DES的結構(Feistel網路

在Feistel網路中,加密的各個步驟稱為輪(round),整個加密過程就是進行若干次輪的迴圈

總結一下,一輪的具體步驟如下

(1) 將輸入的資料等分為左右兩部分

(2) 將輸入的右側直接傳送到輸出右側

(3) 將輸入的右側傳送到輪函式

(4) 輪函式根據右側的資料和子金鑰,計算出一串看上去是隨機的位元序列

(5) 將上一側得到的位元序列與左側資料進行XOR運算,並將結果做為加密後的左側

DES的加密和解密過程很相似,只要對調金鑰就可以,這裡不多說

特點

a.輪數可以任意增加

b.加密無論用任何函式作為輪函式都可以正確解密

c.加密和解密可以用完全相同的結構來實現

4.三重DES

將DES重複三次所得到的一種密碼演算法,也稱為TDEA。出現3DES的原因很簡單,DES已經可以在短時間內暴力破解啦。

5.AES/Rijndael

Rijndael是新一代密碼演算法---->AES

和DES一樣,Rijndael演算法也是由多個輪組成,每一輪分為SubBytes,ShiftRows, MixColumns,AddRoundKey四個步驟;Rijndael使用SPN接面構。Rijndael的輸入分組為128位元,也就是16位元組

在Rijndael加密過程中,每一輪的處理為

SubBytes--->ShiftRows--->MixColumns--->AddRoundKey

而在解密時,則反過來

AddRoundKey--->MixColumns--->ShiftRows--->SubBytes

分組密碼

一、分組密碼的模式

分組密碼:是每次只能處理特定長度的一塊資料的一類演算法,這裡的"一塊"就稱為分組。此外,一個分組的位元數就稱為位元長度;DES和3DES分組長度都是64位元,AES的分組長度是128位元。

流密碼:對資料流進行連續處理的一類密碼演算法。流密碼中一般以1位元,8位元或32位元等為單位進行加密與解密。

模式:分組密碼演算法只能加密固定長度的分組,但是我們需要加密的明文長度可能會超過分組密碼的分組長度,這時就需要對分組密碼演算法進行迭代,以便將一段很長的明文全部加密。而迭代的方法就稱為模式

模式有很多種,分組密碼的主要模式有以下5種

ECB模式:Electronic CodeBook mode(電子密碼本模式)

CBC模式:Cipher Block Chaining Mode(密碼分組連結模式)

CFB模式:Cipher FeeBack Mode(密文反饋模式)

OFB模式:Output FeeBack Mode(輸出反饋模式)

CTR模式:CounTeR mode(計數器模式)

在詳細介紹模式之前,我們先學習幾個術語

明文分組:是指分組密碼演算法中做為加密物件的明文。明文分組的長度與分組密碼的分組長度是相等的。

密文分組:是指使用分組密碼演算法將明文分組加密之後所生成的密文。

文章將會提到一個詞Mallory,攻擊者,也就是阿狗

二.ECB模式

在ECB模式中,將明文分組加密之後的結果直接成為密文分組

對ECB模式的攻擊其實很簡單Mallory只要將其中分組進行對調就會出現很大的問題。只要觀察一下密文,就知道明文是什麼樣的組合,可以以此為線索來破解密碼,故而ECB模式存在較大的風險。

三.CBC模式



初始化向量:當加密第一個個明文分組時,由於不存在"前一個密文分組",因此需要事先準備一個長度為一個分組的位元序列來代替"前一個密文分組",這個位元序列就是初始化向量IV

如果有一個密文分組壞了,那麼解密之後將會影響兩個明文的內容;CBC模式中密文分組存在缺失位元時,之後所有的明文分組都會受到影響;初始化向量如果發生位元反轉,會使第一個明文分組也會受到位元反轉。

三.CFB模式

密文反饋(CFB,Cipher feedback)模式類似於CBC,可以將塊密碼變為自同步的流密碼;工作過程亦非常相似,CFB的解密過程幾乎就是顛倒的CBC的加密過程:
需要使用一個與塊的大小相同的移位暫存器,並用IV將暫存器初始化。然後,將暫存器內容使用塊密碼加密,然後將結果的最高x位與平文的x進行異或,以產生密文的x位。下一步將生成的x位密文移入暫存器中,並對下面的x位平文重複這一過程。解密過程與加密過程相似,以IV開始,對暫存器加密,將結果的高x與密文異或,產生x位平文,再將密文的下面x位移入暫存器。
與CBC相似,平文的改變會影響接下來所有的密文,因此加密過程不能並行化;而同樣的,與CBC類似,解密過程是可以並行化的。

四.OFB模式

輸出反饋模式(Output feedback, OFB)可以將塊密碼變成同步的流密碼。它產生金鑰流的塊,然後將其與平文塊進行異或,得到密文。與其它流密碼一樣,密文中一個位的翻轉會使平文中同樣位置的位也產生翻轉。這種特性使得許多錯誤校正碼,例如奇偶校驗位,即使在加密前計算而在加密後進行校驗也可以得出正確結果。
每個使用OFB的輸出塊與其前面所有的輸出塊相關,因此不能並行化處理。然而,由於平文和密文只在最終的異或過程中使用,因此可以事先對IV進行加密,最後並行的將平文或密文進行並行的異或處理。
可以利用輸入全0的CBC模式產生OFB模式的金鑰流。這種方法十分實用,因為可以利用快速的CBC硬體實現來加速OFB模式的加密過程。


五.CTR模式

計數模式(CTR模式)加密是對一系列輸入資料塊(稱為計數)進行加密,產生一系列的輸出塊,輸出塊與明文異或得到密文。

CTR 模式被廣泛用於 ATM 網路安全和 IPSec應用中,相對於其它模式而言,CTR模式具有如下特點:  硬體效率:允許同時處理多塊明文 / 密文。  軟體效率:允許平行計算,可以很好地利用 CPU 流水等並行技術。  預處理:演算法和加密盒的輸出不依靠明文和密文的輸入,因此如果有足夠的保證安全的儲存器,加密演算法將僅僅是一系列異或運算,這將極大地提高吞吐量。  隨機訪問:第 i 塊密文的解密不依賴於第 i-1 塊密文,提供很高的隨機訪問能力  可證明的安全性:能夠證明 CTR 至少和其他模式一樣安全(CBC, CFB, OFB, ...)  簡單性:與其它模式不同,CTR模式僅要求實現加密演算法,但不要求實現解密演算法。對於 AES 等加/解密本質上不同的演算法來說,這種簡化是巨大的。  無填充,可以高效地作為流式加密使用。

六.比較

在本篇博文中,我將講解公鑰密碼以及公鑰密碼與對稱稱密碼的比較

一.公鑰密碼

1、什麼是公鑰密碼

公鑰密碼這種,金鑰分為兩種,加密金鑰解密金鑰,傳送用加密金鑰對訊息進行加密,接收者用解密金鑰對密文進行解密。一般情況下,加密金鑰是公開的,稱為公鑰,解密金鑰是非公開的,稱為私鑰。公鑰與私鑰是一一對應的。

這樣,阿狗可能擁有阿貓的公鑰,但公鑰並不是解密的金鑰,故而阿狗無法完成解密操作

2.公鑰密碼存在的問題

公鑰密碼解決了金鑰配送問題,但並不意味著它能解決所有的問題,因為我們要判斷所得到的公鑰是否正確合法,這個問題被稱為公鑰認證問題

此外,公鑰密碼還有一個問題就是,它的處理速度只有對稱密碼的幾百分之一。

3.RSA

RSA是一種廣泛使用的公鑰密碼,可以被用於公鑰密碼和數字簽名

3.1.RSA加密
在RSA中,明文、金鑰、密文,RSA可以用下面這個公式來加密


E和N是RSA的加密金鑰,也就是說,E和N組合就是公鑰,一般會寫成“公鑰是(E, N)或者“公鑰{(E, N}”

3.2.RSA的解密

RSA的解密和加密一樣簡單,也是一個公式


D和N的組合是私鑰,只有知道D和N兩個數組合起來才能夠完成解密運算


3.3生成金鑰對
E和N是公鑰,D和N是私鑰,因此求E、D和N這三個數就是生成金鑰。RSA金鑰生成步驟如下
(1).求N
(2).求L
(3).求E
(4).求D


(1).求N
a.準備兩個很大的質數p和q (用偽隨機數生成器生成)
b.N = p x q (p和q為質數)

(2).求L
L=lcm(p-1, q-1) (L是p-1和q-1的最小公倍數)

(3).求E
gcd(E, L) = 1(1 < E < L)    E和L的最大公約數必須為1(E和L互質)
到目前為止我們已經求出E和N,也就是說我們已經生成金鑰中的公鑰

(4).求D
數D是由數E計算得到的。D、E和L必須具備以下關係
1 < D < L
E x D mod L = 1

到此為止我們也可以生成私鑰啦。整個過程如下圖



4.對RSA的攻擊
咱們先來整理一下攻擊者知道那些資訊,不知道那些資訊
【攻擊者知道的資訊】
密文:可以通過竊聽來獲取
數字E和N:公開的資訊,因此破譯者知道E和N
【密碼破譯者不知道的資訊】
明文:需要破譯的內容
數字D:私鑰中至少D是不知道的東西
其他:p、q和L
破解方式一
暴力破解D:D的長度足夠長的話,想找D的值難度很大,這種方法不現實。
破解方式二
通過E和N求出D:E x D mod L = 1; L = lcm(p-1, q-1),p和q無法知道,N=p x q,可以對N做質因數分解,但是如果N是大整數,現在還沒有很好的演算法,這種方法不現實;但如果質因數分解求q和p,恭喜你,你已經破解RSA啦
破解方式三
通過推測p和q:這還是有可能的,如果推測出來,也恭喜你,你已經破解RSA啦

5.中間人攻擊
這種方法雖然不能破解RSA,但卻是一種針對機密性的有效攻擊,看下圖你就明白


6.選擇密文攻擊
選擇密文攻擊一般是通過提示資訊去嘗試解密,使用RSA-OAEP,RSA-OAEP會在加密明文前生成一些認證資訊,包括明文的雜湊值和一定數量的0,然後再對填充後的明文用RSA加密。這樣攻擊者就無法得到解密提示的相關資訊

7.其他公鑰密碼
(1)ElGamal方式
(2)Rabin方式
(3)橢圓曲線密碼

我們都知道,對稱密碼和混合密碼,各有各的優點,也各有缺點。而將他們組合到一起,的確是一種不錯的選擇。取對稱密碼之長補公鑰密碼之不足,取公鑰密碼之長補對稱密碼之不足,下面我們將開啟混合加密之旅。

一、概述

用對稱密碼來加密明文,用公鑰密碼來加密對稱密碼中所使用的金鑰。通過使用混合密碼系統,就能夠將在通訊中對稱密碼與公有密碼的優勢結合起來。

二、加密

混合密碼系統中會先用對稱密碼來對訊息進行加密,這樣訊息就被轉換為密文,從而保證訊息的機密性,然後我們只要保證對稱密碼的機密性就可以啦。用公有密碼對加密訊息時使用的對稱密碼的金鑰進行加密。由於金鑰比較短,公鑰密碼速度慢的問題就得以解決啦

混合密碼系統組成機制
1.用對稱密碼加密訊息
2.用偽隨機數生成器生成對稱密碼加密中使用的會話金鑰
3.用公鑰密碼加密會話金鑰
4.從混合密碼系統外部賦予公鑰密碼加密中使用的會話金鑰

會話金鑰:是指為本次通訊而生成的臨時金鑰,它一般是由偽隨機數生成器產生。偽隨機數生成器所產生的金鑰同時也會被傳遞給右半部分,做為對稱加密的金鑰使用
會話金鑰的雙重性:a.對稱密碼的金鑰,b.公鑰密碼明文

三、解密

解密是加密的逆過程,不多說

四、高強度的混合密碼系統具備的條件

1.良好的偽隨機數生成器演算法
2.高強度的對稱密碼演算法,並確保金鑰有足夠的長度,選用合適的分組模式
3.高強度的公鑰密碼演算法,並確保金鑰有足夠的長度
4。金鑰長度要平衡公鑰密碼強度應該要高於對稱密碼,因為公鑰被破解,從過去到未來的通訊都能夠被破解

下面圖片是要講的知識點。

一、單向雜湊函式

現在假設小明以前寫來一個檔案儲存到硬碟,它的檔案可能面臨被攻擊之後遭到篡改,那它怎麼證明現在他手上的檔案沒有遭到篡改的呢?檔案是真的,“是真的”的性質稱為完整性,也稱為一致性

怎麼保證檔案一致性,也許我們會想到,把檔案複製一份到硬碟,到要用檔案的時候對比一下不就行了嗎。那麼如果檔案很大的時候咋辦,這樣效率非常低。而我們這兒要介紹的單向雜湊函式就可以解決這個問題。

1.什麼是單向雜湊函式

單向雜湊函式:有一個輸入和輸出,其中輸入稱為訊息,輸出稱為雜湊值。單向雜湊函式可以根據訊息的內容計算出雜湊值,而雜湊值可以用來檢查訊息的完整性單向雜湊函式也稱為訊息摘要雜湊函式或者雜湊函式。輸入單向雜湊函式的訊息也稱為原像。單向雜湊函式輸出雜湊值也稱為訊息摘要或者指紋完整性也稱為一致性

這裡的訊息不一定是人類能讀懂的文字,也可能是聲音和圖片等。無論是任何訊息,單向雜湊函式都會將它作為單純的位元序列來來處理,即根據位元序列計算出雜湊值。雜湊值的長度總是固定的。

2.單向函式的性質

a.根據任意長度的訊息計算出固定長度的雜湊值; b.能夠快速計算出雜湊值; c.訊息不同雜湊值也不同(這裡有可能兩個不同的訊息會產生同一個雜湊值)

3.碰撞

兩個不同的訊息產生同一個雜湊值的情況稱為碰撞。如果要將單向雜湊函式用於完整性的檢查,則需要確保事實上不可能人為地發現碰撞。

難以發現碰撞的性質稱為抗碰撞性,密碼學中所使用的單向雜湊函式,都需要具備抗碰撞性。當給定某條訊息的雜湊值時,單向雜湊函式必須確保要找到和該條訊息具有相同雜湊值得訊息特別困難,這一性質稱為弱抗碰撞性單向雜湊函式必須具有弱抗碰撞性

和弱抗碰撞性相對的,還有強抗碰撞性,所謂強抗碰撞性,是指要找到雜湊值相同的兩條不同的訊息是非常困難的這一性質。在這裡,雜湊值可以是任意值。

4.單向性

5.單向函式的具體例項

MD4:能夠產生128位元的雜湊值,由於有人找出了MD4的雜湊碰撞方法,現在已經不安全。

MD5:能夠產生128位元的雜湊值,MD5的強抗碰撞性已經被攻破,現在已經不安全。

SHA-1:能夠產生160位元的雜湊值,強抗碰撞性在2005年已經被攻破,已經被列入”謹慎使用密碼清單“

SHA-2:由SHA-224、SHA-256、SHA-512/224、SHA-512/256、SHA-384、SHA-512組成,還處於安全階段

RIPEMD-160:包括RIPEMD-128、RIPEMD-256、RIPEMD-320等 ,60位元的雜湊函式,RIPEMD-160已經被列入”謹慎使用密碼清單,RIPEMD強抗碰撞性在2006年已經被攻破。RIPEMD-160不知道被攻破了沒有,比特幣中使用的就是RIPEMD-160。

SHA-3:新一代的單向雜湊函式,目前最安全的,以太坊中使用的就是SHA-3演算法

6.Keccak演算法被SHA-3的的理由

採用了與SHA-2完全不同的結構;結構清晰,易於分析;能夠適用於各種裝置,也適用於嵌入式應用;在硬體上的實現顯示出了很高的效能;比其他入選演算法安全性邊界會更大。Keccak可以生成任意長度的雜湊值,但是為了配合SHA-2的雜湊長度,SHA-3標準中規定了SHA-3-224、SHA-3-256、SHA-3-384、SHA-3-512 四個版本。關於.Keccak演算法這裡不多說。

7.單向雜湊函式不能解決的問題

單向雜湊函式能夠辨別"篡改",但無法識別“偽裝”。

二.訊息認證

1.什麼是訊息認證碼

訊息認證碼:是一種確認完整性認證的技術,英文縮寫MAC。

訊息認證碼的輸入包括任意長度的訊息和一個傳送者與接收者之間共享的金鑰,它可以輸出固定長度的資料,這個資料稱為MAC值。計算MAC值必須持有共享金鑰,沒有共享金鑰的人就無法計算出MAC值,訊息認證碼正是利用這一性質來完成認證的。哪怕是1位元的改變,都會使MAC發生變化。訊息認證碼是一種與金鑰相關聯的單向雜湊函式

2.訊息認證碼的使用步驟

a.傳送銀行事先與接收銀行共享金鑰

b.傳送銀行根據匯款請求訊息計算MAC值(使用共享金鑰)

c.傳送銀行將匯款請求訊息和MAC值兩者傳送給接收銀行

d.接收銀行根據接收到的匯款請求訊息計算MAC值(使用共享金鑰)

e.接收銀行將自己計算出來的MAC值和傳送銀行傳送過來的MAC值進行對比

f.如果兩個MAC值一致,則認證成功;如果不一致,則認證失敗。

3.訊息認證碼的應用例項

Swift:環球銀行金融電信協會,銀行與銀行之間通過swift來傳遞訊息。SWIFT中就使用來訊息認證碼

IPsec:IP協議,對通訊內容的認證和完整性校驗都是採用訊息認證碼來完成。

SSL/TLS:對通訊內容的認證和完整性校驗採用訊息認證碼

4.訊息認證碼的實現方法

a.使用單向雜湊函式實現:使用SHA-2之類的單向雜湊函式可以實現訊息認證碼。

b.使用分組密碼實現:使用AES之類的分組密碼可以實現訊息認證碼。具體看分組密碼博文。

5.認證加密

認證加密是一種將對稱密碼與訊息認證碼相結合,同時滿足機密性、完整性和認證三大功能的機制

Encrypt-then-MAC:這種方式是先用對稱加密將明文加密,然後計算密文的MAC值。在Encrypt-then-MAC方式中,訊息認證碼的輸入訊息是密文。通過MAC值就可以判斷這段密文的確是由知道明文和金鑰的人生成。

GCM:是一種認證加密方式,GCM使用AES等128位元分組密碼的CTR模式,並且使用一個反覆進行加密和乘法運算的雜湊函式來計算MAC值。專門用於訊息認證碼的GCM稱為GMAC。

HMAC:是一種使用單向雜湊函式來構造訊息認證碼的方法(RFC2104),其中HMAC的H就是Hash的意思

HMAC使用的單向雜湊函式並不侷限於一種,任何高強度的單向雜湊函式都可以被用於HMAC,如果將來設計出新的單向雜湊函式,也同樣可以使用。


6.對訊息認證碼的攻擊

重放攻擊(看下圖)

金鑰推測攻擊

對於訊息認證碼來說,應保證不能根據MAC值來推測出雙方通訊使用的金鑰。

三.數字簽名

通過數字簽名可以識別偽裝,,還可以防止否認。