加密
- RSA
- MD5
- SHA-1
- DES
- 3DES
RSA
RSA是一種非對稱加密算法(公鑰加密,私鑰解密)。對極大數因數分解的難度決定RSA算法的可靠性。換句話說對RSA因數分解難度越大,也就證明RSA算法越可靠。假設有人找到了一種快速分解因數的算法,那么RSA加密算法的可靠性就會急速下降
什么是質數?
質數就是素數,除了1和他本身外,沒有其他約數。
什么是互質關系?
如果,兩個數除了1之外沒有其他公因數,那么這兩個數的關系就為互質關系,比如21和8就為互質關系。
歐拉函數
假設給定任意正整數n,那么在小于等于n的正整數之中有多少個與n構成互質關系:
歐拉函數公式:φ(n)=φ(p)φ(q)=(p-1)(q-1),pq互質關系。
模反元素
如果,兩個整數 e,r互質,那么一定可以找到一個整數d使得,ed-1被r整除。那么d就叫做e的"模反元素"。
公鑰與私鑰的產生
假設 A 想通過一個不可靠的媒體向B發送一條消息,那么A可以用以下方式來產生消息:
- 隨意選擇兩個足夠大的質數p和q且 p!=q,計算N = pq。
- 根據歐拉函數,求的 r = φ(N) = φ(p)φ(q) = (p-1)(q-1)。
- 選擇一個小于r的整數e,且與r互為質數,算出e關于r的"模反元素"d
- 將p,q的記錄銷毀
這樣就得到了數對公鑰(N,e),私鑰(N,d)。
加密消息
假設A已經產生了公鑰(N,e),現在B想給A發送一個消息m,B已經知道了A的公鑰(N,e),B首先會對消息m按照他們事先約定好的格式把消息m轉換為一個小于N且與N互質的整數n。比如,B可以將要發送的每一個字轉換為這個字的unicode,然后把這些數字連在一起組成一個數字。假設他的消息非常長的話,就可以把這個消息轉換為幾段,然后對每一段轉換為n。然后在利用公鑰加密成結果 c ,在發送給A。
解密消息
如果想要得到私鑰,那么 N 是已經知道的,只需要知道d
- 由加密步驟可 ed-1 = r ,既 d = (r+1)/e
- e由公鑰可得,那么只要推導出 r 即可
- 計算 r 有兩種方式,第一計算所有小于等于n的正整數有多少個與n互為質數的,也就是因式分解。第二種是算出 qp,也就是對N因式分解。
所以說,如果找到可以快速因式分解的算法RSA的可靠性將大幅度下降。
A得到B發送過來的消息,就可以用A的秘鑰來解碼。
簽名消息
RSA也可以為一個消息署名,這樣做的目的是什么?驗證私鑰加密的消息在傳輸過程中,有沒有被篡改。但是,并不能保證消息的私密性,因為公鑰的公開的。假設A想給B發送一個署名消息的話,那么他可以為他的消息計算一個散列值,然后用他的私鑰加密這個散列值,并把這個"署名"放在消息的后面,這個消息只有用他的公鑰才能解密。B得到A發送過來的消息時,B可以用公鑰解密這個散列值,然后對消息在計算一個自己的散列值,兩個散列值比較,來查看消息有沒有被篡改,并且知道持有私鑰的是不是A本人。
速度
比如DES和其它對稱算法來說,RSA要慢很多。實際上B一般使用一種對稱加密算法來加密他的信息,然后用RSA來加密比較短的對稱密碼,然后將用RSA加密的對稱密碼和用對稱算法加密的消息發送給A.
MD5
什么是消息摘要算法?
消息摘要算法的主要特征是加密過程不需要密鑰,并且加密過的數據無法被解密,只有輸入相同的明文數據經過相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密鑰的管理與分發問題。
MD5 算法流程
(1)補位
MD5算法是對輸入的數據進行補位,使得如果數據位長度LEN對512求余的結果是448。即數據擴展至K512+448位。即K64+56個字節,K為整數。補位操作始終要進行,即使數據長度LEN對512求余的結果已是448。
具體的補位操作:補一個1,然后補0至滿足要求。總共最少要補一位,最多補512位。
(2)補數據長度
用一個64位的數字表示數據的原始長度b,把b用兩個32位數表示。當遇到b大于 2^64這種極少遇到的情況時,那么只取B的低64位。這時,數據就被填充成長度為512位的倍數。也就是說,此時的數據長度是16個字(32位)的整數倍數。用M[0...N-1]表示此時的數據,其中的N是16的倍數。
填充的方法如下:
- 在信息的后面填充一個1和無數個0,直到滿足上面的條件才停止用0對信息的填充。
- 在這個結果后面附加一個以64位二進制表示的填充前信息長度(單位為Bit),如果二進制表示的填充前長度超過64位,則取低64位。
- 經過這兩步的處理,信息的位長 = N512 + 448 + 64 = (N + 1) 512,即長度恰好是512的整數倍。這樣做的原因是為滿足后面處理中對信息長度的要求。
(3)初始化MD緩沖器
用一個四個字的緩沖器(A,B,C,D)來計算報文摘要,A,B,C,D分別是32位的寄存器,初始化使用的是十六進制表示的數字
A = 0X01234567
B = 0X89abcdef
C = 0Xfedcba98
D = 0X76543210
(4)處理位操作函數
假設處理后的原文長度是M
主循環次數 = M / 512
每個主循環中包含 512 / 32 * 4 = 64 次子循環。
上面這種圖就是單次子循環的流程。
- 首先定義4個輔助函數,每個函數的輸入是三個32位的字,輸出是一個32位的字。
X,Y,Z為32位整數
F(X, Y, Z) =(X&Y) | ((~X) & Z)
G(X, Y, Z) =(X&Z) | (Y & (~Z))
H(X, Y, Z) =XYZ
I(X, Y, Z)=Y^(X|(~Z))
生成4個32位數據,最后聯合起來成為一個128bit散列。基本方式為,求余,取余,調整長度,與鏈接變量進行循環運算,得出結果。
在主循環下面64次子循環中,F,G,H,I交替使用,第一個16次使用F,第二個16次使用G,第三個16次使用H,第四個16次使用I。 - 紅色的田字,代表相加的意思。
- Mi是第一步處理后的原文。在第一步中,處理后原文的長度是512的整數倍。把原文的每512位在分成16等份,命名為M0 ~ M15,每一等份長度32。在64次子循環中,每16次循環,都會交替用到M1~M16之一。
- Ki 一個常量,在64次子循環當中,每一次用到的常量都是不同的。
- 黃色的 <<< S
左移S位,S的值也是常量。
現定義:
FF(a ,b ,c ,d ,Mj ,s ,ti ) 操作為 a = b + ( (a + F(b,c,d) + Mj + ti) << s)
GG(a ,b ,c ,d ,Mj ,s ,ti )操作為 a = b + ( (a + G(b,c,d) + Mj + ti) << s)
HH(a ,b ,c ,d ,Mj ,s ,ti)操作為 a = b + ( (a + H(b,c,d) + Mj + ti) << s)
II(a ,b ,c ,d ,Mj ,s ,ti)操作為 a = b + ( (a + I(b,c,d) + Mj + ti) << s)
注意:“<<”表示循環左移位,不是左移位。
總結:總結下MD5的整個流程是,拿原文總長度對 512求余,如果不是448,進行填充。使得補位的結果除以 512余448。然后,在補數據長度,把剩下的64位,放上原文的數據長度。下面開始循環加工操作,有多少次主循環,數據原文長度/512 次主循環。每個主循環下面有64次子循環。64次子循環劃分4個分組,每一次操作對a,b,c,d中的其中三個作一次非線性函數運算,定義4個輔助函數 F,G,H,I,每16次子循環更換一個輔助函數,依次輪流。即FF(a ,b ,c ,d ,Mj ,s ,ti ) 操作為 a = b + ( (a + F(b,c,d) + Mj + ti) << s)。Mj是處理后的原文長度等分成16份,放在16個數組當中。每16次循環都會使用。把循環最終產生的 A,B,C,D拼接在一起,就是所求的MD5。
SHA-1
SHA-1和MD5一樣屬于一種,消息摘要算法,不可逆。同樣也是MD4的基礎上擴展的。SHA-1目前已經不夠安全。
生成SHA-1摘要算法流程
(1)填充
輸入 SHA-1的消息長度應大于0比特小于2^64比特。當然和MD5前步驟處理流程相同,首先對數據求余填充至448位,第一位補1后面補0,留下64位,不過有點區別是,SHA-1,是在最后一個分組后面保存原始消息的長度。
(2)計算W0~W79
完成填充之后,我們以512為一個單位進行下面的處理。這一步要對每個單位計算80個32比特的值(W0~W79),這80個值單步處理中。首先,將輸入分組的512比特分成32bit * 16,并將它命名為W0 ~ W15。然后,剩下的W16~W79的計算方法如下,以 W16為例:
分組處理
接下來我們根據輸入分組進行80個步驟的處理,目的是根據輸入分組的信息來改變內部狀態(160比特)。對所有的輸入分組都要執行這一操作。(上面提到的輸入分組,就是512bit單位)
160比特的內部狀態是通過名為A,B,C,D,E的5個32比特的緩沖區來表示的。這些緩沖區和剛才提到的W0 ~ W79是不同的概念。上圖中是將5個緩沖區的值與輸入分組的信息進行混合,然后在執行80個步驟的處理。所有處理結束之后最終的內部狀態(160比特)。
DES
DES是一種對稱加密算法,密鑰加密,密鑰解密。由于DES加密密鑰實際可用為56比特,過短可以實際通過暴力來破解。因此,除了用它來解密以前的密文以外,現在我們不應該在使用DES了。
DES 實現流程
DES 只能加密64比特的數據,如果要加密的明文比較長,就需要對DES加密進行迭代(反復),而迭代的具體方式就稱為模式(mode)。DES是一種16輪循環的Feistel網絡。
具體的步驟是:
- 將輸入的數據等分為兩部分
- 將輸入的右側直接發送到輸出的右側
- 將輸入的右側發送到輪函數
- 將函數根據右側數據和子密鑰,計算出一串看上去是隨機的比特序列
- 將上一步得到的比特序列與左側數據進行XOR運算,并將結果作為加密后的左側
這樣以來右側根本就沒有加密,因為我們需要用不同的子密鑰對一輪的處理重復若干次,并在每兩輪處理之間將左側和右側的數據對調。對調只在兩輪之間進行,最后一輪結束之后不需要對調。
3DES
三重DES是為了增加DES的強度,將DES重復3次所得到的一種密碼算法,通常縮寫為3DES。3DES被認為是十分安全的,雖然它的速度較慢。
密鑰1,密鑰2,密鑰3全部使用不同的比特序列的三重DES稱為3DES。