IDEA加密算法和解密算法如何設計與實現(xiàn)

IDEA加密算法是已公開的可用算法中速度快且安全性強的分組加密算法,不但具有良好的應用前景,而且還具有極強的抗攻擊能力。那么IDEA加密算法和解密算法是如何設計與實現(xiàn)的呢?今天我就給大家介紹一下。

一、IDEA加密算法簡介

1、IDEA加密算法概述

IDEA加密算法是一個分組長度為64比特的分組密碼算法,密鑰長度為128比特,由8輪迭代操作實現(xiàn)。每個迭代都由三種函數(shù):mod(216)加法、mod(216+1)乘法和逐位異或算法組成。整個算法包括子密鑰產生、數(shù)據(jù)加密過程、數(shù)據(jù)解密過程三部分。該加密算法規(guī)定明文和密文塊均為64比特,密鑰長度為128比特,加解密相同,只是密鑰各異。

(1)IDEA加密算法的加密過程

IDEA總共進行8輪迭代操作,每輪需要6個子密鑰,另外還需要4個額外子密鑰輸出變換,所以總共需要52個子密鑰,這52個子密鑰都是從128比特密鑰中擴展出來的。

輸入的明文為8個字符(即64比特),將64比特數(shù)據(jù)塊分成X1,X2,X3,X4四個子塊,每一子塊16比特。這4個子塊將作為第一輪迭代的輸入,全部共8輪迭代。在每一輪中,這4個子塊相互異或、相加和相乘,且與6個16比特子密鑰相異或、相加和相乘。最后在輸出變換中4個子塊與4個子密鑰進行運算。加密過程如圖1所示。

IDEA加密算法如何設計與實現(xiàn)

(2)解密過程

和加密密鑰一樣,解密密鑰也需要擴展,不同的是解密密鑰是由加密密鑰加法逆或乘法逆構成的,且兩者一一對應。

IDEA加密算法的解密過程和加密過程一樣,只是加密用加密密鑰EK,解密用的是解密密鑰DK。輸入的密文同樣為8個字符(即64比特),將64比特數(shù)據(jù)塊分成Y1,,Y2,,Y,3,Y,4四個子塊,每一子塊16比特。這4個子塊將作為第一輪迭代的輸入,全部共8輪迭代。解密過程如圖2。

IDEA加密算法和解密算法如何設計與實現(xiàn)

IDEA加密算法結構圖如圖3。

IDEA加密算法和解密算法如何設計與實現(xiàn)

二、IDEA加密算法和解密算法如何設計與實現(xiàn)

1、加密密鑰擴展算法的實現(xiàn)

在IDEA加密算法中,實際上是將128比特密鑰擴展為832比特。每一個字節(jié)用0補足16位。具體是如何擴展的呢?在前面的擴展思想中已經知道密鑰串分8個子塊,循環(huán)左移7次,其中第7次循環(huán)是取前4個,所以最終形成832比特(16*8*6+16*4)。擴展密鑰數(shù)組為m_nKeyEncryptBox[52],部分代碼如下:

byte[]asciiBytes=Encoding.Convert(unicode,ascii,unicode.GetBytes(this.m_sEncryptionKey));

//將一組字符編碼成一個字節(jié)序列

char[]asciiChars=newchar[ascii.GetCharCount(asciiBytes,0,asciiBytes.Length)];

//進行字節(jié)到字符再到串的轉換

ascii.GetChars(asciiBytes,0,asciiBytes.Length,asciiChars,0);

//由密鑰m_sEncryptionKey擴展成加密密鑰擴展數(shù)組m_nKeyEncryptBox

for(j=0;j<8;j++)//加密子密鑰[j]循環(huán)左移8+[j+1]位

……

2、IDEA加密算法和解密算法的實現(xiàn)

IDEA加密算法和解密算法是相同的,其處理為:將64比特輸入分成4個16比特的子塊A、B、C、D,然后進行8輪循環(huán),在第j輪循環(huán)中,子密鑰為:key[6*i]-key[6*i+5],其中,i=0……7。部分代碼如下:
publicstaticvoidIdeaCipher(byte[]inbuf,byte[]outbuf,ushort[]key)

{

ushortA,B,C,D,E,F;

inti;

//明文[0]和明文[2],明文[4]明文[6]……循環(huán)左移8位后相或A=(ushort)((inbuf[0]&0xFF)|((ushort)(inbuf[2]&0xFF))<<8);

B=(ushort)((inbuf[4]&0xFF)|((ushort)(inbuf[6]&0xFF))<<8);

C=(ushort)((inbuf[8]&0xFF)|((ushort)(inbuf[10]&0xFF))<<8);

D=(ushort)((inbuf[12]&0xFF)|((ushort)(inbuf[14]&0xFF))<<8);

for(i=0;i<8;i++)

{

A=Mul(A,key[6*i]);

B+=key[6*i+1];

//B的值加上密鑰key[……]后返回給B

……

3、解密密鑰擴展算法的實現(xiàn)

解密密鑰也需要擴展,不過,它與加密密鑰擴展不同,它不需要從密鑰串中變換而來。IDEA解密密鑰擴展數(shù)組m_nKeyDecrypt-Box[52]是由加密密鑰數(shù)組m_nKeyEncryptBox處理而來的。其具體處理步驟為:

首先由m_nKeyEncryptBox[0]到m_nKeyEncryptBox[3]四個加密密鑰數(shù)組元素處理成四個解密密鑰數(shù)組元素m_nKeyDecryptBox[51]到m_nKeyDecryptBox[48],然后進行8輪迭代。在第m輪中,由六個加密密鑰數(shù)組元素m_nKeyEncryptBox[4+6*m]到m_nKeyEncryptBox[9+6*m]生成六個解密密鑰數(shù)組元素m_nKeyDe-cryptBox[47-6*m]到m_nKeyDecryptBox[42-6*m]。最終生成832比特的加密密鑰數(shù)組m_nKeyDecryptBox[52]。部分代碼如下:

A=MulInv(m_nKeyEncryptBox[0]);

//調用MulInv處理子密鑰[0]后賦給AB=(ushort)(-m_nKeyEncryptBox[1]);

//子密鑰[1]賦值給BC=(ushort)(-m_nKeyEncryptBox[2]);

//子密鑰[2]賦值給C

m_nKeyDecryptBox[51]=MulInv(m_nKeyEncryptBox[3]);

//調用MulInv處理子密鑰[3]后賦給解密子密鑰[51]……

A=m_nKeyEncryptBox[4+m*6];

//調用MulInv處理子密鑰[4+m*6]后賦給A

m_nKeyDecryptBox[47-m*6]=m_nKeyEncryptBox[5+m*6];

//子密鑰[5+m*6]賦值給[47-m*6]m_nKeyDecryptBox[46-m*6]=A;

//子密鑰A賦值給[47-m*6]A=MulInv(m_nKeyEncryptBox[6+m*6]);

//調用MulInv處理子密鑰[6+m*6]后賦給AB=(ushort)(-m_nKeyEncryptBox[7+6*m]);

//子密鑰[7+6*m]賦值給BC=(ushort)(-m_nKeyEncryptBox[8+6*m]);

//子密鑰[8+6*m]賦值給C

m_nKeyDecryptBox[45-6*m]=MulInv(m_nKeyEncryptBox[9+6*m]);

//調用MulInv處理子密鑰[9+6*m]后賦給解密子密鑰[45-6*m]

……

4、模(216+1)乘法算法

在IDEA加密算法的加密和解密過程中,每一輪迭代都是由分組數(shù)據(jù)之間,分組數(shù)據(jù)和密鑰間進行模加、模乘和逐位異或運算組成的。其中,模乘的核心代碼如下:

publicstaticushortMul(ushortx,ushorty)//明文x,密鑰y進行模(216+1)乘法運算

{

inttemp;

//設一個中間變量tempif(x==0)//若x=0,x=65537-y,x=(ushort)(0x10001-y);

else

if(y==0)

//若y=0,x=65537-xx=(ushort)(0x10001-x);

else

{

temp=x*y;

//否則temp=x*y

y=Low16(temp);

//y取temp的低16位x=(ushort)(temp>>16);

//x取temp的高16位

x=(ushort)((y-x)+((y<x)?1:0));

//若y<x,x=(y-x)+1,否則x=y-x

}

return(ushort)(x&0xFFFF);
……

5、模(216+1)乘逆元算法

模乘逆元算法是在解密密鑰擴展時的主要算法,解密密鑰擴展數(shù)組m_nKeyDecryptBox[52]是由加密密鑰數(shù)組m_nKeyEncrypt-Box通過加法逆或乘法逆處理而來的。模乘逆元算法的核心代碼如下:

publicstaticushortMulInv(ushortx)//密鑰x進行模乘逆元運算

{

ushortt0,t1,q,y;

//定義短整型變量t0,t1,q,yif(x<=1)//若x小于1,返回xreturnx;

t1=(ushort)(0x10001/x);

//65537除x后,把商賦給t1,余數(shù)賦給yy=(ushort)(0x10001%x);

if(y==1)//若y=1,返回65537減t1后的值的低16位returnLow16(0x10001-t1);

t0=1;

//位t0賦初值1do

……

6、IDEA加密算法和解密算法實現(xiàn)的演示界面

IDEA加密算法和解密算法如何設計與實現(xiàn)

?小知識之IDEA

IDEA(International Data Encryption Algorithm)是瑞士的James Massey,Xuejia Lai等人提出的加密算法,在密碼學中屬于數(shù)據(jù)塊加密算法(Block Cipher)類。IDEA使用長度為128bit的密鑰,數(shù)據(jù)塊大小為64bit。從理論上講,IDEA屬于“強”加密算法,至今還沒有出現(xiàn)對該算法的有效攻擊算法。