TEA加密算法的文件加密和解密的實(shí)現(xiàn)
一、TEA加密算法簡(jiǎn)介
TEA加密算法是由英國(guó)劍橋大學(xué)計(jì)算機(jī)實(shí)驗(yàn)室提出的一種對(duì)稱分組加密算法。它采用擴(kuò)散和混亂方法,對(duì)64位的明文數(shù)據(jù)塊,用128位密鑰分組進(jìn)行加密,產(chǎn)生64位的密文數(shù)據(jù)塊,其循環(huán)輪數(shù)可根據(jù)加密強(qiáng)度需要設(shè)定。
文件加密過(guò)程中,加法運(yùn)算和減法運(yùn)算用作可逆的操作。算法輪流使用異或運(yùn)算和加法運(yùn)算提供非線性特性,雙移位操作使密鑰和數(shù)據(jù)的所有比特重復(fù)地混合,最多16輪循環(huán)就能使數(shù)據(jù)或密鑰的單個(gè)比特的變化擴(kuò)展到接近32比特。因此,當(dāng)循環(huán)輪數(shù)達(dá)到16輪以上時(shí),該算法具有很強(qiáng)的抗差分攻擊能力,128比特密鑰長(zhǎng)度可以抗擊窮舉搜索攻擊,該算法設(shè)計(jì)者推薦算法迭代次數(shù)為32輪。
TEA加密算法本身非常簡(jiǎn)練,無(wú)論采用軟件方式還是硬件方式,實(shí)現(xiàn)起來(lái)都非常容易。
1、TEA加密算法的C語(yǔ)言程序
加密過(guò)程
staticvoidcode(uint[]v,uint[]k)
{
uinty=v[0];
uintz=v[1];
//v(0)和v(1)為明文塊
uintsum=0;
uintdelta=0x9e3779b9;
uintn=16;
//n=32
while(n...>0)
{
sum+=delta;
y+=(z<<4)+k[0]^z+sum^(z>>5)+k[1];
z+=(y<<4)+k[2]^y+sum^(y>>5)+k[3];
}
v[0]=y;
v[1]=z;
v(0)和v(1)為密文塊
}
解密過(guò)程:
staticvoiddecode(uint[]v,uint[]k)
{
uintn=16;
uintsum;
uinty=v[0];
uintz=v[1];
uintdelta=0x9e3779b9;
sum=delta<<4;
由于進(jìn)行16輪運(yùn)算,所以將delta左移4位,減16次后剛好為0,32輪運(yùn)算則左移5位
while(n...>0)
{
z=(y<<4)+k[2]^y+sum^(y>>5)+k[3];
y=(z<<4)+k[0]^z+sum^(z>>5)+k[1];
sum=delta;
}
v[0]=y;
v[1]=z;
}
其中,64比特?cái)?shù)據(jù)分為v[0],v[1]兩個(gè)32比特?cái)?shù),128比特?cái)?shù)據(jù)分為k[0]~k[3]的4個(gè)32比特?cái)?shù),delta由黃金數(shù)得到:delta=(25-1)231=0x9E3779B9。每一輪使用delta的不同倍數(shù),使得倍數(shù)的所有比特頻繁地變化。與DES相比,TEA采用了較長(zhǎng)的密鑰,可變的循環(huán)輪數(shù),不存在DES算法中S盒的“陷門(mén)”問(wèn)題,具有更好的安全性能。另外,無(wú)論是硬件實(shí)現(xiàn)還是軟件實(shí)現(xiàn),TEA都比DES更簡(jiǎn)單。因此,TEA是一種較為優(yōu)秀的對(duì)稱分組加密算法。
二、TEA加密算法的文件加解密實(shí)現(xiàn)
1、文件加密過(guò)程實(shí)現(xiàn)
(1)文件的完整讀取
用string[]lines=System.IO.File.ReadAllLines(String)實(shí)現(xiàn)打開(kāi)一個(gè)文件,并確保將文件的所有行都讀入一個(gè)字符串?dāng)?shù)組,關(guān)閉該文件,得到完整的文件內(nèi)容。
(2)文件內(nèi)容、密鑰預(yù)處理
讀取的文件內(nèi)容很可能包含大量的文本信息,這些文本信息可能包含中英文和一些標(biāo)點(diǎn)符號(hào),由此在進(jìn)行加密前需要進(jìn)行統(tǒng)一的編碼格式轉(zhuǎn)換,然后轉(zhuǎn)換成字節(jié)數(shù)組,如:System.Text.Encodingchs=System.Text.Encoding.GetEncoding(_gb2312!);byte[]bytes=chs.GetBytes(String);以便加密可以順利進(jìn)行。使用不同的字符編碼得到的字節(jié)數(shù)組不盡相同,例如,使用UTF8編碼得到的字符串?dāng)?shù)組就比使用gb2312編碼的略有膨脹。同樣用該辦法將密鑰轉(zhuǎn)換成字節(jié)數(shù)組。
(3)無(wú)符號(hào)整數(shù)數(shù)組與字節(jié)數(shù)組互轉(zhuǎn)方法
為了使密鑰和密文更難被破解和方便運(yùn)用TEA加密算法,在密鑰轉(zhuǎn)換和內(nèi)容轉(zhuǎn)換時(shí)設(shè)計(jì)了兩項(xiàng)辦法。
a、字節(jié)數(shù)組轉(zhuǎn)無(wú)符號(hào)整數(shù)
根據(jù)傳入?yún)?shù)#字節(jié)數(shù)組V_字節(jié)數(shù)組下標(biāo)i,判斷如果下標(biāo)加4后長(zhǎng)度大于字節(jié)數(shù)組長(zhǎng)度返回0;若小于字節(jié)數(shù)組長(zhǎng)度,則執(zhí)行如下或運(yùn)算操作:
uintoutput;
output=(uint)v[i];
output|=(uint)(v[i+1]<<8);
output|=(uint)(v[i+2]<<16);
output|=(uint)(v[i+3]<<24);
returnoutput;
即將字節(jié)數(shù)組中的下標(biāo)位與下標(biāo)后一位左移8位后進(jìn)行或運(yùn)算,將所得結(jié)果與下標(biāo)后第二位左移16位后進(jìn)行或運(yùn)算,再將結(jié)果與下標(biāo)后第三位左移24位后進(jìn)行或運(yùn)算,最終結(jié)果為一無(wú)符號(hào)整數(shù)。
b、無(wú)符號(hào)整數(shù)轉(zhuǎn)字節(jié)數(shù)組
首先創(chuàng)建長(zhǎng)度為4的字節(jié)數(shù)組V,然后將無(wú)符號(hào)整數(shù)與十六進(jìn)制的0xFF進(jìn)行與運(yùn)算,所得結(jié)果存入V[0];將無(wú)符號(hào)整數(shù)右移動(dòng)8位后與0xFF進(jìn)行與運(yùn)算,所得結(jié)果存入V[1];將無(wú)符號(hào)整數(shù)右移動(dòng)16位后與0xFF進(jìn)行與運(yùn)算,所得結(jié)果存入V[2];將無(wú)符號(hào)整數(shù)右移動(dòng)24位后與0xFF進(jìn)行與運(yùn)算,所得結(jié)果存入V[3];至此完成轉(zhuǎn)換,經(jīng)過(guò)驗(yàn)證,能正確還原字節(jié)數(shù)組。
(4)TEA加密算法加密
TEA加密算法的密鑰長(zhǎng)度為128位,首先判斷密鑰字節(jié)數(shù)組長(zhǎng)度,如密鑰字節(jié)數(shù)組長(zhǎng)度小于16位,則將其長(zhǎng)度擴(kuò)展到16位,多余的位數(shù)用16進(jìn)制的0x20代替(轉(zhuǎn)換成10進(jìn)制為32,ASCII碼表的32對(duì)應(yīng)為鍵盤(pán)的空格鍵,即用個(gè)空格代替)。然后將字節(jié)數(shù)組切分成4份,每4位為一新的字節(jié)數(shù)組,采用字節(jié)數(shù)組轉(zhuǎn)無(wú)符號(hào)整數(shù)方法,完成密鑰格式化成長(zhǎng)度為4的無(wú)符號(hào)整數(shù)數(shù)組。
判斷明文字節(jié)數(shù)組長(zhǎng)度是否為偶數(shù),如不是則用0x0增補(bǔ)一位。依次取兩位,用字節(jié)數(shù)組轉(zhuǎn)無(wú)符號(hào)整數(shù)方法轉(zhuǎn)換成2位無(wú)符號(hào)整數(shù)數(shù)組,與密鑰無(wú)符號(hào)整數(shù)數(shù)組進(jìn)行TEA加密算法,重復(fù)上述操作,直到數(shù)組所有字節(jié)加密完成,復(fù)制進(jìn)新的密文字節(jié)數(shù)組,至此完成文件加密過(guò)程。加密過(guò)程如圖1所示。

2、文件解密過(guò)程實(shí)現(xiàn)
相比文件加密過(guò)程,文件解密過(guò)程較簡(jiǎn)單。首先運(yùn)用加密過(guò)程的辦法對(duì)密鑰進(jìn)行預(yù)處理,得到長(zhǎng)度為4的無(wú)符號(hào)整數(shù)數(shù)組。同樣運(yùn)用加密過(guò)程使用的辦法處理密文字節(jié)數(shù)組,依次取兩位,用字節(jié)數(shù)組轉(zhuǎn)無(wú)符號(hào)整數(shù)方法轉(zhuǎn)換成2位無(wú)符號(hào)整數(shù)數(shù)組,與密鑰無(wú)符號(hào)整數(shù)數(shù)組進(jìn)行TEA解密算法,重復(fù)上述操作,直到數(shù)組所有字節(jié)解密完成,復(fù)制進(jìn)新的密文字節(jié)數(shù)組,然后判斷最末位是否0x0,如是則修剪最末位,得到明文字節(jié)數(shù)組,再進(jìn)行轉(zhuǎn)換則可以還原明文。
3、文件加密程序運(yùn)行效果如下












