一 什麼是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在其選定過程中,經過了全世界密碼學家所進行的高品質的驗證工作,而對於自制的密碼算法很難進行這樣的驗證。