DES和其他塊密碼系統為什麼能夠工作(ZT)

cklea發表於2008-01-11
. DES和其他塊密碼系統為什麼能夠工作
. 差異和線性密碼分析
. 塊密碼系統:IDEA
. 流密碼系統:RC4
. 公開金鑰演算法:
- Merkle-Hellman Knapsack演算法
- RSA[@more@]1. 塊密碼系統

1.1 Feistel網路

很多的塊密碼系統都是用Feistel網路的形勢。它的結構如下所示:

L_i-1 R_i-1
| |
| /|
/ f ---- K_i
/ |
/ |
/ |
/ |
/ |
/ |
/ XOR
/ |
| |
| |
L_i R_i

在F網路中輸入被切分成為左塊和右塊,第i次的輸出這樣計算

L_i = R_i-1
R_i = L_i-1 XOR f(R_i-1,K_i)
F網路的一個好的性質是函式f可以任意的複雜,而且輸入可以透過下面得到恢復:

R_i-1 = L_i
L_i-1 = R_i XOR f(L_i, K_i)

因此,即使f不是可逆轉的,演算法本身也是可逆轉的,也就是允許解密。

F網路是DES,Lucipher,FEAL,Khutu,LOKI,GOST,Blowfish和其他塊加密演算法的一輪。
從下面的圖你可以看出F網路是DES的一部分。


L_i-1 R_i-1 Key
| / | / | |
| / | Key shift shift Key
| L_i | | |
| | 壓縮排列
| 擴充套件排列 |
| | |
| | |
| XOR-------------------/
| |
| |
| |
| S-Box置換
| |
| |
| |
| P-Box置換
| |
| |
| |
--------------- XOR
|
|
R_i

1.2 安全和塊密碼系統的設計目標

怎麼設計f才能夠使得密碼是安全的呢?

混淆,漫射,雪崩效應是塊密碼設計的密碼。混淆是指讓輸出和輸出之間缺少聯絡。
這點可以透過置換得到。漫射是指在輸出裡面避免輸入之間的聯絡。這點可以透過
排列得到。一個好的塊密碼系統應該擁有雪崩效應,也就是輸出的一個bit可以很快
影響到所有的輸出。

理想的64bit塊的塊密碼系統應該是一個和金鑰相關的64bit->64bit的隨機對映。不
幸的是這樣的話我們就需要一個2^64*2^56=2^120大小的表(如果我們使用56bit金鑰
的話)。

因為這樣的話,我們需要的儲存太多了,於是我們使用偽隨機對映來近似理想函式。
一個不停的在小塊上進行置換並且在塊之間進行排列的演算法被稱為置換-排列網路。
這樣的演算法是乘積密碼系統的一個例子,因為它透過迭代生成混淆和漫射。一個擁有
多輪,並且每輪的結構都相同的密碼系統叫做迭代密碼系統。DES就是一個例子,他
是迭代塊密碼系統,置換-排列密碼系統,也是乘積密碼系統。

1.3 DES安全

DES的設計目標就是上面所述的目標。它的設計也是為防止差異密碼分析。

1.3.1 E-Box和P-Box

DES的E-box的輸入是32bits,輸出是48bits。輸出的48bits是由輸入的32bits透過
某些位重複組成的。特別的,對每個4bits塊,第一個和第四個重複一次,而其他兩
bits不重複。因此E-box產生雪崩效應,這是因為從S-Box在R輪輸出的4bits會在R+1
輪成為6個S-boxs的輸入。而E-box也啟動金鑰的48bits在XOR操作中的使用。

...32 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...
| | | | | | | | | | | | | | | | |
1 48|2 3 4 5|7 6|8 9 10 11|13 12|14 15 16 17|19 18|20 21 22 23|25

DES的P-box是一個直接的32-bit的排列(每個輸入bit僅僅使用一次)

1.3.2 S-box

這裡有8個S-box,每個S-box的輸入是6bit,輸出是4bit。S-box的一些安全特性是:

. 輸入中有1bit的差異至少影響輸出的2bit。
. 可以防止差異分析

1.3.3 DES的弱點

. 某些金鑰是不安全的。在DES的金鑰空間中,64個是不好的選擇。幸運的是,64
個顯然太少了,程式可以檢查你的密碼是不是這64個之列從而提醒你不要使用他們。

- 弱金鑰:這裡有4個弱金鑰:0x00000000000000,0x0000000FFFFFFF,
0xFFFFFFF0000000,0xFFFFFFFFFFFFFF。當你使用這些金鑰時,每一輪的子金鑰
都是一樣的。這就是的金鑰分析變的簡單很多。它也使得E_k(X)=D_k(X),這是
因為DES的加密演算法和解密演算法是一樣的,只是使用的子金鑰是完全相反的順序

- 半弱金鑰:有12個。當你使用這些金鑰的時候,在16輪種,你實際上只有兩個
不同的子金鑰。這是的密碼分析變得簡單很多。

- 可能的弱金鑰:有48個。當你使用這些金鑰的時候,這裡只有4個不同的子金鑰
每個子金鑰使用了4次。同樣,這也是的分析變得簡單了許多。

. S-box 5是統計強偏。如輸入是a0,a1,a2,a3,a4,a5,輸出是b0,b1,b2,b3,那麼
在64個可能的輸入中,有12個都有a1=b0+b1+b2+b3。理想的應該有32個,而線
性分析正好可以利用這點。

1.3.4 實際應用中的DES。

DES經常在實際應用中被使用。

. 銀行
- 銀行機器
- 銀行間的傳輸
. ISDN
. Kerbeios
. Unix passwd身份識別
. 加密郵件

DES並不是很多新的系統的選擇,這是因為56bit的金鑰太小了。雖然如此,3-DES
在依然是用DES的同時保證了更大的安全性。它的基本思想是使用不同的金鑰加密
多次。在3-DES中

C = E_k1(D_k2(E_k3(P)))
P = D_k3(E_k2(D_k1(C)))

注意到你不能夠簡單C = E_k1(E_k2(P))而得到更好的安全性。如果演算法是一個
群,那麼這個和C = E_k3(P)的效果是完全一樣的。如果演算法不是一個群,那麼
存在一種辦法可以讓你透過2^(n+1)次測試就能夠得到金鑰,而並不是你想象中
的2^(2n),這裡的n是金鑰的長度。而DES不是一個群。

1.4 差別分析

定義dV = V1 XOR V2以及dY = Y1 XOR Y2。

E-box

/
V Key_i
/
/
XOR
|
|
X
|
S-box
|
|
Y
|

上圖展示的是DES的一輪的一部分。差別分析的基本思想是對任意給定的dV,
並不是所有的dY都是等可能的。如果一個密碼分析人員可以使得某人對一對
明文進行加密,而明文的差別是dV,那麼它可以得到對應的一對密文,計算
dY,然後使用dV和dY以及V來得到更多的關於Key_i的資訊。當然,在你的資料
變得有統計價值之前,你需要很多對這樣的資訊。

這個主意對每輪作一次。在密碼系統中輪數越多,這種辦法就越難。

差分分析使得14輪的DES分析確實比BF分析容易很多,但是對16輪的DES越效果很小。
這是因為DES的設計者知道很多差別分析的辦法,然後設計了S-box來抵禦他。


1.5 線性分析

線性分析允許攻擊者獲得一個位的關於金鑰的資訊,前提是他知道明文和對應的
秘文。它的想法是 明文中某些位的異或和密文中某些位的異或的異或給出了一些
關於金鑰中的某些位的異或的資訊。這種分析在S-box的線性近似中出現某些偏倚
的時候工作,比如S-box 5就是DES中最偏得S-box了。

E-box


i_26

key_i的bit 26
/
/
/
XOR
|
| | | a26 | |
| | | | | |
s-box 5
| | | |
b17 b19
b18 b20

上圖顯示了s-box 5的操作過程。如果我們使用線性分析,直到一些關於i_26的資訊,
以及b17,b18,b19,b20,那麼我們就能夠知道這一輪中key_i的bit 26的一些資訊了。
(1) i_26 XOR key_i's bit 26 = a_26
(2) a_26 = b_17 XOR b_18 XOR b_19 XOR b_20,僅僅在64中可能中的12種出現。

線性分析是對DES的最成功的攻擊,但是他並不比BF好多少。

1.6 IDEA

IDEA是另外一個塊密碼系統。它對64bit的塊進行操作,並且使用128bit的金鑰,
IDEA是一個乘積密碼系統。它生成3個代數群:

. 加法(提供漫射特性)
. 乘法(提供混淆特性)
. XOR

IDEA也有一些弱密碼,但是他們並不像DES的那些弱密碼一樣。如果你在IDEA中使用
弱密碼,那麼攻擊者就可以選擇明文來獲取你的密碼)。我們有2^32個弱密碼,但是
因為IDEA的密碼比DES的密碼多得多,所以隨機選擇一個密碼時選到一個若密碼的概
率比DES要小。

1.7 塊密碼系統的加密速度

一些塊密碼系統的加密速度(33MHz的486SX上)

演算法 速度KB/sec 演算法 速度KB/sec
Blowfish(12輪) 182 MDC(使用MD4) 186
Blowfish(16輪) 135 MDC(使用MD5) 135
Blowfish(20輪) 110 MDC(使用SHA) 23
DES 35 NewDES 233
FEAL-8 300 REDOC II 1
FEAL-16 161 REDOC III 78
FEAL-32 91 RC5-32/8 127
GOST 53 RC5-32/12 86
IDEA 70 RC5-32/16 65
Khutu(16輪) 221 RC5-32/20 52
Khutu(24輪) 153 SAFER(6輪) 81
Khutu(32輪) 115 SAFER(8輪) 61
Luby-Rackoff(MD4) 47 SAFER(10輪) 49
Luby-Rackoff(MD5) 34 SAFER(12輪) 41
Luby-Rackoff(SHA) 11 3-way 25
Lucifer 52 Triple-DES 12

2. 流密碼系統
2.1 流密碼系統 vs 塊密碼系統

塊密碼系統在明文的一塊一塊進行操作,對每個輸入產生一個輸出塊。流密碼系統
則不一樣,他每次加密或者解密一個bit。流密碼系統在歐洲更流行一些,而在美國
塊密碼則要更流行一些。

一個流密碼系統使用一個函式使用金鑰作為輸入然後產生一系列的偽隨機的bits。
每個bit都和明文中的一個bit進行異或,產生密文的一個bit。

2.2 RC4

RC4是一個一次生成一個byte的流密碼系統。金鑰被用來生成一個含有256個元素的表
So,S1,S2,...,S255,他們是0到255這些數的一個排列。一旦這個表被初始化完成之
後,下面的RC4虛擬碼就可以一次生成一個byte了。

i = j = 0;
while(generating) {
i = (i+1) mod 256
j = (j+S_i) mod 256
swap S_i and S_j
t = (S_i + S_j) mod 256
output = S_t
}


RC4被Lotus Notes,Oracle SQL以及一些其他產品使用。

3. 公開金鑰演算法

公開金鑰演算法是基於單向的活頁窗函式的。就像前面提到的那樣,一個單向函式
在一個方向上很容易的,但是相反方向卻是很難的。使用活頁窗的單項函式在一個
方向是很容易的,在另外一個方向上如果你不使用一個密碼就是很難的。如果你
直到密碼,那麼另外一個方向也是很容易的。

公開金鑰演算法使用兩個密碼:私有金鑰和公開金鑰。Alice生成一個金鑰對,然後
它公開他的公開金鑰並且保留對應的私有金鑰。為了給ALice傳送一個訊息,Bob
可以使用Alice的公開金鑰進行加密,然後Alice可以使用它自己的私有金鑰進行
解密。和對稱加密體系不同的是,兩個使用公開金鑰體系的人不必要交換密碼。
我們要做的只是在公開金鑰目錄裡面找到Alice的公開金鑰就ok了。而至於怎麼實現
一個安全的公開金鑰分發系統則是另外一個問題了。

使用公開金鑰對訊息進行加密可以認為是單向函式的一個方向。而對應的私有金鑰
就是一個活頁窗,他使得函式的另外一個方向上的計算變得簡單。

3.1 Merkle-Hellman Knapsack演算法

MHK是一個公開金鑰演算法,他的安全性由揹包問題的NP-完全性得到保證。演算法的設計
者認為要解密使用者加密的資訊,攻擊者需要解決揹包問題。但是不幸的是這裡有些
錯誤:揹包問題確實是NP完全的,但是問題的例項或許可以不需要解決這個NP完全的
問題就得到解答。

揹包問題指的是:給定一個向量M和一個數值S,計算一個bool向量B,使得M和B
的點乘等於S。

怎麼把這個變成一個公開金鑰演算法呢?加密的時候,我們首先把輸入劃分成為長度
偽||M||的位元塊。然後計算C_i = Sum_i B_i * M_i,這裡的B_i是明文。得到的串
C_i就是密文。而M就是公開金鑰。

對應的私有金鑰是另外一個向量M'。M'有下面的性質:(1)M'是一個快速增加的向量
(2) Sum_i B_i * M_i' = S,也就是說M'也可以用來從S中解出B。

下面幾點事實時的這個演算法是一個可行的公開金鑰演算法:(1) 從M'計算出B只需要
多項式時間,(2) 容易把一個快速增加的揹包序列轉換成為一個普通的揹包序列。
(2)使得你可以從你選定的私有金鑰快速的計算出你的公開金鑰。但是不幸的是,
使用者從私有金鑰計算出公開金鑰的演算法可能也能夠讓對手可以容易從公開金鑰計算出
私有金鑰來,那麼加密資訊就可以被很容易的解密了。這就是演算法的弱點。

美國的MHK演算法的專利在1997年八月19日過期。


3.2 RSA

MH演算法是基於揹包問題的,而RSA的安全性則是基於大數的分解的。

為了計算公開-私有密碼對:

1. 隨機選擇兩個大的素數p和q
2. 計算n=pq
3. 選擇和(p-1)(q-1)互素的數e,注意e不一定需要是一個隨機的數
4. 計算d = e^-1 mod (p-1)(q-1)

公開金鑰是 (e,n),私有金鑰是(d,n)

加密的時候: c = m^e mod n
解密的時候: m = c^d mod n

我們需要證明E_d(E_e(m)) = m

E_d(E_e(m)) = (m^e)^d
= m^(ed)
= m^(k(p-1)(q-1)+1)
= m*m^(k(p-1)(q-1))
= m*(m^((p-1)(q-1)))^k
= m*1^k
= m (mod n)

上面證明中的一個關鍵步驟是m^((p-1)(q-1)) = 1 (mod n),這點透過下一章的群倫
的討論來說明。

總的說來,如果因式分解容易,那麼RSA就很容易破解。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7196059/viewspace-997048/,如需轉載,請註明出處,否則將追究法律責任。

相關文章