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所示。

TEA加密算法在網(wǎng)絡(luò)傳輸中保護(hù)文件數(shù)據(jù)安全的應(yīng)用

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)行效果如下

TEA加密算法在網(wǎng)絡(luò)傳輸中保護(hù)文件數(shù)據(jù)安全的應(yīng)用

TEA加密算法在網(wǎng)絡(luò)傳輸中保護(hù)文件數(shù)據(jù)安全的應(yīng)用

小知識(shí)之陷門(mén)計(jì)算機(jī)操作的陷門(mén)設(shè)置是指進(jìn)入程序的秘密入口,它使得知道陷門(mén)的人可以不經(jīng)過(guò)通常的安全檢查訪問(wèn)過(guò)程而獲得訪問(wèn)。程序員為了進(jìn)行調(diào)試和測(cè)試程序,已經(jīng)合法地使用了很多年的陷門(mén)技術(shù)。當(dāng)陷門(mén)被無(wú)所顧忌的程序員用來(lái)獲得非授權(quán)訪問(wèn)時(shí),陷門(mén)就變成了威脅。對(duì)陷門(mén)進(jìn)行操作系統(tǒng)的控制是困難的,必須將安全測(cè)量集中在程序開(kāi)發(fā)和軟件更新的行為上才能更好地避免這類攻擊。