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

IDEA加密算法及其編程實(shí)現(xiàn)

每一輪的迭代運(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)系如下:

IDEA加密算法及其編程實(shí)現(xià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)系。