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ù)進行計算:

①“田”表示模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ū)別。









