Rijndael密碼算法

一 什麼是Rijndael

Rijndael是由比利時密碼學家設計的分組密碼算法,於2000年被選爲新一代的標準密碼算法——AES。今後會有越來越多的密碼軟件支持這種算法。

Rijndael的分組長度和**長度可以分別以32比特爲單位在128比特和256比特的範圍內進行選擇。不過在AES的規格中,分組長度固定爲128比特,**長度只有128、192和256比特三種。

二 Rijndael的加密和解密

Rijndael算法也是由多輪構成的,其中每一輪分爲SubBytes、ShiftRows、MixColumns和AddRoundKey4個步驟。它使用的是SPN結構。

1 SubBytes

Rijndael的輸入分組爲128比特,也就是16個字節。首先,需要逐個字節對16字節的輸入數據進行SubBytes處理。所謂SubBytes處理,就是以每個字節的值(0-255的任意值)爲索引,從一張擁有256個值的替換表中查找出對應值的處理。也就是說,將一個字節的值替換成另外一個字節的值。用圖表示如下:

2 ShiftRows

以4個字節爲單位的行(row)按照一定的規則向左平移,且每一行平移的字節數是不同的。下圖是對其中一行進行處理的情形。

3 MixColumns

對一個4字節的值進行矩陣運算,將其變爲另外一個4字節值,下圖是對其中一列進行處理的情形:

4 AddRoundKey

對MixColumns的輸出與輪**進行XOR,即進行AddRoundKey處理,下圖展示了對1個字節進行處理的情形。

到此1輪迭代就結束了。實際上,在Rijndael中需要重複10到14輪計算。

Rijndael的加密過程,每一輪進行的處理爲:

SubBytes->ShiftRows->MixColumns->AddRoundKey

Rijndael的解密過程,順序相關:

AddRoundKey-> InvMixColumns-> InvShiftRows ->InvSubBytes

其中AddRoundKey是與輪**進行XOR運算,這一步在加密和解密時完全相同的。

其他三個步驟見下面三張圖:

InvMixColumns:

InvShiftRows :

InvSubBytes:

三 Rijndael的破譯

對Rijndael來說,每一步都是用數學公式來表達的,這是以前任何密碼算法都不具備的性質。如果Rijndael的公式能夠通過數學運算來求解,那就意味Rijndael能夠通過數學方法進行破譯,而這也就爲新的攻擊方式的產生提供了可能。

不過這還是一種假設,實際上,到現在還沒出現針對Rijndael的有效攻擊。

四 應該使用哪種對稱密碼算法

針對DES、3DES和AES對稱**,到底選哪一種?

首先DES、3DES已經不安全了,不會再應用到任何新的用途。

現在大家應該使用AES(Rijndael),因爲它快速、安全,並且能夠在各種平臺上工作。此外,全世界密碼學家都在對AES進行不斷的驗證,因此即便萬一發現它有什麼缺陷,也會立刻告知全世界並修改這些缺陷。

AES最終候選算法應該可以作爲AES的備份。和Rijndael一樣,這些密碼算法也都經過了嚴格的測試,且沒發現任何的弱點。但NIST最終還是隻選擇了Rijndael作爲標準,並沒有官方認可作爲最終的備份來使用。

一般來說,我們不應該使用任何自制的密碼算法,而應該使用AES。因爲AES在其選定過程中,經過了全世界密碼學家所進行的高品質的驗證工作,而對於自制的密碼算法很難進行這樣的驗證。