IDEA加密算法及其編程實(shí)現(xiàn)
在信息安全保密日益嚴(yán)峻的形勢(shì)下,信息的存儲(chǔ)安全作為信息安全的一個(gè)重要方面,被關(guān)注的程度遠(yuǎn)遠(yuǎn)不夠。信息加密技術(shù)作為信息安全最有效的方法之一,可通過(guò)不同的加密算法來(lái)實(shí)現(xiàn),而加密算法的選取直接影響信息的安全程度,那么我們今天就來(lái)給大家介紹一下IDEA加密算法是如何通過(guò)編程實(shí)現(xiàn)的。
一、IDEA加密算法
1、IDEA加密算法簡(jiǎn)介
IDEA是一種數(shù)據(jù)塊加密算法,加密的數(shù)據(jù)塊為64 b,密鑰長(zhǎng)度是128 b。該加密算法在硬件和軟件上均可高速進(jìn)行加解密,而且加密過(guò)程與解密過(guò)程相同,僅加密密鑰與解密密鑰不同,他設(shè)計(jì)了一系列加密輪次,每輪加密都使用從完整的加密密鑰中生成的一個(gè)子密鑰,被認(rèn)為是目前世界公開(kāi)的最好最安全的加密算法。雖然密碼分析者能對(duì)輪數(shù)減少的變形做一些分析工作,這么長(zhǎng)的密鑰在今后若干年內(nèi)應(yīng)該是安全的。
IDEA加密算法既用混亂又用擴(kuò)散,他的設(shè)計(jì)原則是一種來(lái)自于不同代數(shù)群的混合運(yùn)算,且這個(gè)代數(shù)群進(jìn)行的運(yùn)算,無(wú)論用硬件還是軟件都易于實(shí)現(xiàn);算法輸入的64位數(shù)據(jù)被分成4個(gè)16位子分組作為第一輪的輸入,總共有8輪迭代。在每一輪中,相互間進(jìn)行運(yùn)算同時(shí)也與6個(gè)16位的子密鑰進(jìn)行運(yùn)算(每輪均不同),最后還與4個(gè)16位的子密鑰進(jìn)行輸出變換,產(chǎn)生輸出,其中共52個(gè)16位的子密鑰參與運(yùn)算。整個(gè)算法包括3部分:
(1)子密鑰的產(chǎn)生
輸入:128 b密鑰;
輸出:52個(gè)16 b的子密鑰。
(2)加密過(guò)程
輸入:52個(gè)子密鑰和64 b數(shù)據(jù);
輸出:64 b數(shù)據(jù)。
(3)解密過(guò)程
IDEA加密算法的加密過(guò)程與解密過(guò)程的子密鑰不相同,且二者是一一對(duì)應(yīng)的。
2、IDEA加密算法子密鑰的生成
IDEA共需要52個(gè)子密鑰,每一個(gè)有16 b,由128 b密鑰生成。自密鑰將128 b分成8組,每組16 b,得到k1,k2,…,k8;將128 b循環(huán)左移25位后做16 b分組,得到子密鑰k9,k10,…,k16;再將這128 b循環(huán)左移25位后做同樣的分組得到子密鑰k17,k18,…,k24;以此類推,直到生成所有的子密鑰。
3、IDEA加密算法加密過(guò)程
該加密算法中密鑰為128 b,明文分組長(zhǎng)度是64 b。64 b被分為4個(gè)16 b的子塊:X1,X2,X3,X4作為第一輪的輸入,每一輪中,將4個(gè)輸入子塊與6個(gè)16 b子密鑰分別做模2的16次方加法、模2的16+1次方的乘法、異或操作,得到4個(gè)輸出作為下一輪的輸入。如此共進(jìn)行8輪,最后用4個(gè)子密鑰作輸出變換。其整體結(jié)構(gòu)如圖1所示。

每一輪的迭代運(yùn)算步驟如下:
(1) X1和第1個(gè)子密鑰塊做乘法運(yùn)算;
(2)X2和第2個(gè)子密鑰塊做加法運(yùn)算;
(3)X3和第3個(gè)子密鑰塊做加法運(yùn)算;
(4) X4和第4個(gè)子密鑰塊做乘法運(yùn)算;
(5)步驟(1)和步驟(3)的結(jié)果做異或運(yùn)算;
(6)步驟(2)和步驟(4)的結(jié)果做異或運(yùn)算;
(7)步驟(5)的結(jié)果與其本身做乘法運(yùn)算;
(8)步驟(6)和步驟(7)的結(jié)果做加法運(yùn)算;
(9)步驟(8)和步驟(6)的結(jié)果做乘法運(yùn)算;
(10)步驟(7)和步驟(9)的結(jié)果做加法運(yùn)算;
(II)步驟(3)和步驟(9)的結(jié)果做異或運(yùn)算,
(12)步驟(2)和步驟(10)的結(jié)果做異或運(yùn)算;
(13)步驟(4)和步驟cio)的結(jié)果做異或運(yùn)算。
結(jié)果的輸出為步驟(10),步驟(1 1),步驟(12),步驟(13)的運(yùn)算結(jié)果。第8輪結(jié)束后,最后輸出變換有四步:
(1) X1和第1個(gè)子密鑰塊做乘法運(yùn)算;
(2) X2和第2個(gè)子密鑰塊做加法運(yùn)算;
(3) X3和第3個(gè)子密鑰塊做加法運(yùn)算;
(4) X4和第4個(gè)子密鑰塊做乘法運(yùn)算。
4、IDEA加密算法解密過(guò)程
IDEA加密算法在硬軟件上均可高速進(jìn)行加解密,其中的加解密子密鑰關(guān)系如下:

其中;-Zi表示Zi,模216的加法逆元,即- Zi+Zi≡_mod 216,Zi-1表示Zi模216 +1的乘法逆元,即- ZiZi≡0 mod 216+1。
由上表可見(jiàn):解密的子密鑰塊是由加密子密鑰的加法逆或乘法逆構(gòu)成的。解密密鑰可以通過(guò)查表法獲得。
二 、IDEA加密算法的編程實(shí)現(xiàn)
編程實(shí)現(xiàn)的加解密思路是:先讀入要加密的文件,統(tǒng)計(jì)實(shí)際文件的長(zhǎng)度,依次分塊讀出數(shù)據(jù),從文件中讀出的最后一批數(shù)據(jù),長(zhǎng)度可能會(huì)等于0,所以要先判斷,若不為0定有8B以上的空間,將文件的長(zhǎng)度存于最后8字節(jié)中,文件加密、解密完后將明文寫入文件中。
1、子密鑰的生成
將128 b分成8組,再循環(huán)左移25位后做16 b分組,依次類推,直到生成所需的52個(gè)子密鑰。其關(guān)鍵代碼如下:
INT32 idea makekey(ULONG32 *inkey, ULONG16 *outkey) /*子密鑰的生成*/
{
ULONG32 i,j,k;
ULONG16 Pkey=(ULONG16)inkey*for(i- O*i<6I i++)
{
k - i<<3;
for(j一O;j<8lj++) /*生成8組密鑰*/
{
outkey[k+j]=Pkey[j]
}
}
key leftmove (inkey);
1* 128位密鑰左環(huán)移25位*/
}
for(i=O;i<4;i++)
{
outkey[48+i]=Pkey[i];
}
return SUCCESS;
}
outkey[48+i] = Pkey[i],
}
return SUCCESS;
INT32 key leftmove(ULONG32*inkey)/*密鑰左環(huán)移25位*/
{
ULO NG32 itmpfirst一O,itmp=0;
ULONG32 i;
inkey[0]=(inkey[0]<<25)J(inkey[0]>>7);
/*取低25位,因?yàn)榍懊嬉呀?jīng)做了環(huán)移,原始的低7位已經(jīng)移到了高位,保存*/
itmpfirst=inkey[0]&Oxlffffff;
inkey[0]&=Oxfe000000;
/*低25位清0*/
for(i=lii<4;i++)
{
inkey[i]=(inkey[i]<<25)I(inkey[i]>>7);
itmp= inkey[i] & Oxlffffff;
inkcy[i-1]1= itmp;
inkey[i] &= Oxfe000000;
inkey[i-1]1- itmpfirst*
/*低25位清o*/
/*把最高25位移到最低25位*/
return SUCCESS;
2、實(shí)現(xiàn)加密的代碼
將明文4個(gè)子塊與6個(gè)子密鑰分別做模2的16次方的加法、模2的16+1次方乘法、異或操作,得到4個(gè)輸出作為下一輪的輸入,進(jìn)行8輪迭代,再將4個(gè)子密鑰做輸出變換。其源代碼如下:
INT32 idea enc( ULONG16*data,ULONG16*outkey)
/*加密*/
{
ULONG32 i;
ULONG16 tmp;
if(NULL==data I I NULL==outkey)
{
return FAIL;
}
for(i-0;i<48Ii+=6) /*8輪變換*/
{
handle data( data ,&outkey[i]);
/*輪變換函數(shù)*/
/*交換中間兩個(gè)*/
tmp=data[1];
data[1]=data[2];
data[2]=tmp;
}
tmp=data[l1];
/*最后一輪不交換*/
data[1]=data[2],
data[2]=tmp*
data[0]=MUL(data[0],outkey[48]);
/*(a*b)*/
data[1]+=outkey[49];
data[2]+=outkey[50],
data[3]一MUL(data[3],outkey[51]);
return SUCCESS;
}
3、解密過(guò)程的實(shí)現(xiàn)
解密過(guò)程是加密過(guò)程的逆,只是子密鑰不同而已,其實(shí)現(xiàn)的源代碼如下:
INT32 idea dec( ULONG16* data, ULONG16 * outkey)ULONG32 i;
ULONG16 tmp;
if(NULL==data I I NULL=;outkey)
{
return FAIL+
}
for(i=O;i< 48;i+-6)/*8輪*/
{
handle data( data ,&outkey[il);
/*交換中間兩個(gè)*/
tmp - data[1];
data[1] = data[2l;
data[2] = tmp;
tmp= data[1];
/*最后一輪不交換 */
data[1] = data[2];
data[2] = tmp;
data[0] = MUL(data[Ol,outkey[48J) ;
data[1] += outkey[49] ;
data[2] += outkey[50];
data[3] = MUL(data[3],outkey[51]);
return SUCCESS;
}
4、求乘法逆元
IDEA加密算法中對(duì)實(shí)現(xiàn)速度影響最大的是模乘部分,即求乘法逆元,該算法中利用輾轉(zhuǎn)相除法來(lái)求得逆元,提高了整個(gè)加密算法的執(zhí)行效率:
INT 32 i—1,i=O,c=a,x,y;
INT 32 b=maxin;
While (c!=0)
{
x-b/c
}
y=b-x*c;
b=c;
c=y;
y=j;
j=i-j*x;
i=y;
}
IDEA加密算法加密速度快,密鑰產(chǎn)生方法簡(jiǎn)單,硬件、軟件均容易實(shí)現(xiàn)。該加密算法若采用搜索破譯要2的128次方大約10的38次方次試探,8輪迭代使得沒(méi)有任何捷徑破譯,對(duì)于差分和線性攻擊是安全的,若將字節(jié)有16 b增至32 b,密鑰長(zhǎng)度應(yīng)相應(yīng)長(zhǎng)256 b,采用232模加,232 +1模乘,則可進(jìn)一步強(qiáng)化IDEA加密算法。
小知識(shí)之變換函數(shù)
在化石群各屬種含量定量分析的基礎(chǔ)上,通過(guò)數(shù)理統(tǒng)計(jì)技術(shù)確定的生物組合與古溫度之間的定量函數(shù)關(guān)系。









