C#.NET怎么實現(xiàn)IDEA加密算法

IDEA加密算法使用長度為128位的密鑰,對64位的數(shù)據(jù)進行加密或解密操作,算法只使用了模(216+1)乘法、模216加法和按住異或運算,被廣泛運用在各種領(lǐng)域,那么我們今天就來介紹一下用C#.NET是怎么實現(xiàn)的。

一、IDEA加密算法簡介

IDEA屬于數(shù)據(jù)塊加密算法類,在加密之前.IDEA算法要求將128位的密鑰擴展為52個16位的加密密鑰EK(Encrypuon- Key),然后由EK計算出52個16位的解密密鑰DK(DecryptionKey)。

IDEA加密算法具體步驟如圖1所示,由8個相似圈(Round)和一個輸出變換(OutputTransformation)組成的迭代算法。首先64位需要加密或解密的數(shù)據(jù)分組被分成4個16位子分組:T1,12,T3.T4.這4個子分組成為算法的第一輪的輸入,使用三種函數(shù)進行計算:

C#.NET怎么實現(xiàn)IDEA加密算法

①“田”表示模216加法.在加法計算時,計算輸入的類型時和輸出類型都要求是無符號短整型(16位正整數(shù)),加法結(jié)果值可能超過了范圍,可以使用強制類型轉(zhuǎn)換,轉(zhuǎn)換結(jié)果自動實現(xiàn)模216運算。

②“0”表示模(216 +1)乘法,方法代碼如下:

Ulnt16 multi( Ulnt16 a,Ulnt16 b){

Uint32 temp;

if (a- =0&&b= =O}temp =0;}

elseif(8==0){ temp =65536 *6;}

else if(b==0){ temp =65536.a;)

else temp=a,b;

temp=a*b;

a=(Ulnt16)( temp%65537);

retuma;}

③“0"表示和按位異或運算,c#有“⌒”運算符,可以直接實現(xiàn)按位異或運算。

總共經(jīng)過8輪運算后,在輸出變換中4個子分組與最后4個子密鑰進行運算,產(chǎn)生的4個子分組重新連接到一起產(chǎn)生密文。解密過程基本上一樣,只是密鑰不一樣。

實際在C#.NET中使用IDEA加密算法,密鑰一般是不變的,因此可將擴展后的加密密鑰EK(52組)和解密密鑰DK(52組)事先計算出來,存儲在程序的數(shù)組變量中,這樣就可以加快加密解密的速度。

二、IDEA加密密鑰EK和解密密鑰DK的獲得

IDEA的密鑰是128位,在選擇用于IDEA的密鑰時,應(yīng)該排除那些稱為“弱密鑰”的密鑰,作者通過使用不斷重復(fù)出現(xiàn)的128位原始密鑰,通過特別選定的密文可以測試和觀察出密鑰所含的線性因子,而且在8輪的迭代中,線性因子不斷地擴展進入密鑰,最后可得出其中的55位密鑰的值,具體為第26-40、72-83和99 -12,這也就是說弱密鑰數(shù)有251個,但密鑰的總數(shù)是2128個,仍有277個密鑰可供選擇。

加密密鑰EK的生成是從128位密鑰擴展出52個加密子密鑰,每個子密鑰16位,過程如下:

①由128位的密鑰生成EK的前8個子密鑰;

②前8個子密鑰循環(huán)左移25位,得到EK的下8個子密鑰,將這個過程循環(huán)7次;

③在第7次循環(huán)時,只需取前4個子密鑰。

解密密鑰EK的獲得方法如下:

①對這個加密密鑰EK的52個子密鑰進行換位操作,原來的48、49、50、51、46、47、42、44、43、45、40、41、36、38、37、39、34、35、30、32、31、33、28、29、24、26、25、27、22、23、18、20、19、21、16、17、12、14、13、15、10、ll、6、8、7、9、4、5、O、1、2、3位置分別調(diào)換成新的O—5l位置;

②換位后,對位置是l、2、7、8、13、14、19、20、25、26、31、32、37、38、43 .44、49、50的子密鑰進行模216的加法逆運算,運算公式是A =65536 -x,A是結(jié)果;

③對位置是O、3、6、9、12、15、18 .21、24、27、30、33、36、39.42 \45、48.51的子密鑰進行模216 +1的乘法逆運算,運算公式是(x* A) t7065537=1,A乘法逆運算是結(jié)果。0和1的乘法逆是自己,其它可以通過窮舉算法獲得。

三、IDEA加密算法加密解密過程在C#中的詳細(xì)實現(xiàn)

程序假設(shè)加密密鑰DK(52個子密鑰)和解密密鑰EK(52個子密鑰)已經(jīng)存在數(shù)組EK[52]和DK[52]中,64位加密或解密數(shù)據(jù)存在數(shù)組data[4]中,代碼為:

Ulnd6 data[4];//定義64位加密或解密數(shù)據(jù)存儲空間,

Ulnd6 code EK[52]=l……};//加密密鑰EK

Ulnt16 code DK[52]={……l;//解密密鑰DK

加密過程的代碼如下:

shorti;

Ulnt16 tmp,ryn,DT2;

for(i =0;i<48;i+;6){//共8輪

data[0]=multi( data[0] ,EK[i+0]);

data[l]=(Ulnt16)(EK[i+l] +data[l]);

data[2] = ( Ulnd6) (EK[i+2] +data[2l);

data[3] = multi( data[3] ,EK[i+3l) ;

DTI = data[0] ^data[2] ;DT2 = data[l] ^data[3];

DTl = multi( IYIl,EK[4 +i)) ;DT2 = Ulnd6( DTI + DT2) ;

DT2=multi( DT2,EK[5 +i]);IY12=Ulnt16( DTI+DT2);

data[0]^= DT2; data[2]^= DT2;

data[1]“=DT2; data[3]“=DT2;

tmp=data[1];data[ll=data[2];data[2]=tmp;l

tmp=data[l];data[l]=data[2];

data[2]=tmp;//第8輪不交換

data[0]=multi( data[0] ,EK[48]);

data[l)=(Ulnt16) (EK[49] +data[ll);

data[2]=(UInt16)( EK[ 50]+data[2]);

data[3]=multi( data[3],EK[51J);

輸出的data[]數(shù)組即加密后的數(shù)據(jù),解密操作和加密的步驟基本相同,其代碼基本一樣,只是密鑰有所區(qū)別,解密時子密鑰使用解密密鑰數(shù)組DK[]。

小知識之C#.net

C#是一個語言,.net是一個平臺,上面支持用C#或者VB .Net寫代碼。
另外,C#不但可以開發(fā)基于.net的應(yīng)用程序,也可以開發(fā)基于WinForm的程序,這就是區(qū)別。