摘 要: 介紹了高級加密標準Rijndael算法的背景和特點,深入研究和分析了該算法的實現原理和過程,并給出了該算法在文件加解密過程實現的關鍵代碼。
關鍵詞: Rijndael算法;狀態(tài);密鑰
1 Rijndael算法的背景
AES(Advanced Encryption Standard)是美國聯(lián)邦標準局于1997年開始向全世界征集的加密標準[1],屬于對稱加密算法,代表了當今最先進的編碼技術,最終獲勝的是RijnDael算法。統(tǒng)計顯示,即使使用目前世界上運算速度最快的計算機,窮盡128 bit密鑰也需要幾十億年的時間,更不用說去破解采用256 bit密鑰長度的AES算法了。
Rijndael算法由比利時計算機科學家Vincent Rijmen和Joan Daemen開發(fā),它使用128 bit、192 bit、256 bit的密鑰長度,比56 bit的DES更健壯可靠[3]。美國國家標準技術研究所選擇Rijndael作為美國政府加密標準AES的加密算法,取代早期的數據加密標準DES[1]。Rijndael作為一種迭代分組加密算法,其數據塊長度和密鑰長度均是可變的,因此它匯聚了強安全性、高性能、高效率、易用、靈活等優(yōu)點被廣泛應用在各個領域中。
2 Rijndael算法的設計原理
Rijndael作為加密標準AES算法,其128 bit輸入分組用以字節(jié)為單位的矩陣方陣描述[4]。該數組被復制到State數組。數據塊長度、密鑰長度可以被設定為128 bit、192 bit、256 bit三個可選長度,相應的加密輪數分別為10、12、14,每一輪循環(huán)都有一個循環(huán)密鑰,它來自于初始密鑰。
2.1 Rijndael算法的加密流程
加密過程分為四個階段:密鑰擴展、輪密鑰加、Nr-1(128 bit、192 bit、256 bit密鑰長度,Nr分別為10、12、14)輪變換及最后一輪變換。輪變換包括字節(jié)代換、行移位、列混淆和輪密鑰加四個過程,最后一輪變換包括字節(jié)代換、行移位和輪密鑰加三個過程。其流程圖如圖1所示。
(1)狀態(tài):指明文分組及每次變換的中間結果[4],是一個4×Nb的矩陣,Nb為數據塊長度除以32。
?。?)字符代換:用一個簡單的查表操作代替了基于矩陣乘法的復雜仿射變換。S盒是一個16×16字節(jié)矩陣,包含8 bit值所能表達的256種可能的變換。把Statc中每個字節(jié)的高4位作為行值,低4位作為列值,取出S盒中對應行列的元素作為新的字節(jié)輸出。
2.2 解密過程
Rijndael解密過程是加密的逆過程,每輪循環(huán)中的步驟都被它們的逆所替換,值得注意的是:循環(huán)密鑰使用起來應該顛倒次序。
3 Rijndael算法的應用
Rijindael算法常被用于文件的加解密過程,加密時先將讀入的明文依次分組,用加密密鑰將明文加密后寫入文件中;解密時用解密密鑰將文件中的密文解密后將明文寫入結果文件中。
3.1 Rijindael算法在文件加解密應用的實現
try
{// 創(chuàng)建新的Rijndael 對象以產生Key和IV
Rijndael RijndaelAlg= Rijndael.Create();
//需要加密的字符串及保存的文件名
string sData = "Here is some data to encrypt.";
string FileName = "CText.txt";
//利用Key和IV加密字符串到文件中
EncryptTextToFile(sData,FileName,RijndaelAlg.Key, RijndaelAlg.IV); //利用Key和IV從文件中解密
string Final=DecryptTextFromFile(FileName, RijndaelAlg.Key, RijndaelAlg.IV);
Console.WriteLine(Final); //顯示密碼
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
3.2加密模塊實現
public static void EncryptTextToFile(String Data, String FileName, byte[] Key, byte[] IV)
{
try
{//創(chuàng)建文件
FileStream fStream=File.Open(FileName, FileMode.OpenOrCreate);
//創(chuàng)建新的Rijndael對象
Rijndael RijndaelAlg=Rijndael.Create();
//創(chuàng)建加密流,以passed key 和initialization vector (IV)填充
CryptoStream cStream = new CryptoStream(fStream,
RijndaelAlg.CreateEncryptor(Key, IV),
CryptoStreamMode.Write);
//用加密流創(chuàng)建StreamWriter
StreamWriter sWriter = new StreamWriter(cStream);
try
{ //加密
sWriter.WriteLine(Data);
}
catch (Exception e)
{
Console.WriteLine("An error occurred:{0}",e.Message);
}
finally
{
sWriter.Close();
cStream.Close();
fStream.Close();
}
}
catch (CryptographicException e)
{
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("A file error occurred: {0}", e.Message);
}
}
3.3 解密模塊的實現
public static string DecryptTextFromFile(String FileName, byte[] Key, byte[] IV)
{
try
{ //創(chuàng)建文件流
FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);
//創(chuàng)建新的Rijndael對象
Rijndael RijndaelAlg = Rijndael.Create();
//創(chuàng)建加密流,以passed key和initialization vector (IV)填充
CryptoStream cStream = new CryptoStream(fStream,
RijndaelAlg.CreateDecryptor(Key, IV),
CryptoStreamMode.Read);
//用加密流創(chuàng)建StreamWriter
StreamReader sReader = new StreamReader(cStream);
string val = null;
try
{ //解密
val = sReader.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("An error occurred:{0}",e.Message);
}
finally
{
sReader.Close();
cStream.Close();
fStream.Close();
}
return val; //返回密碼結果
}
catch (CryptographicException e)
{
Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
return null;
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine("A file error occurred:{0}", e.Message);
return null;
}
}
Rijndael算法一直經受著世界各國密碼機構和專家的攻擊,最有名的當屬Squre攻擊[4]。目前Rijndael算法已被廣泛應用于身份認證、數字簽名、數據加密等方面,由于硬件的加解密速度要比軟件快,且可在物理上保證系統(tǒng)安全,國內很多單位用硬件的方法來實現該算法。
參考文獻
[1] 段鋼.加密與解密(第3版)[M].北京:電子工業(yè)出版社,2008.
[2] 馮登國.信息安全中的數學方法與技術[M].北京:清華大學出版社,2009.
[3] Http://zhidao.baidu.com.
[4] DAEMEN J, RIJMAN V.高級加密標準算法(AES)—Rijndael的設計[M].谷大武,徐勝波譯.北京:清華大學出版社,2003.