IDEA加密算法是已公开的可用算法中速度快且安全性强的分组加密算法,不但具有良好的应用前景,而且还具有极强的抗攻击能力。那么IDEA加密算法和解密算法是如何设计与实现的呢?今天我就给大家介绍一下。
一、IDEA加密算法简介
1、IDEA加密算法概述
IDEA加密算法是一个分组长度为64比特的分组密码算法,密钥长度为128比特,由8轮迭代操作实现。每个迭代都由三种函数:mod(216)加法、mod(216+1)乘法和逐位异或算法组成。整个算法包括子密钥产生、数据加密过程、数据解密过程三部分。该加密算法规定明文和密文块均为64比特,密钥长度为128比特,加解密相同,只是密钥各异。
(1)IDEA加密算法的加密过程
IDEA总共进行8轮迭代操作,每轮需要6个子密钥,另外还需要4个额外子密钥输出变换,所以总共需要52个子密钥,这52个子密钥都是从128比特密钥中扩展出来的。
输入的明文为8个字符(即64比特),将64比特数据块分成X1,X2,X3,X4四个子块,每一子块16比特。这4个子块将作为第一轮迭代的输入,全部共8轮迭代。在每一轮中,这4个子块相互异或、相加和相乘,且与6个16比特子密钥相异或、相加和相乘。最后在输出变换中4个子块与4个子密钥进行运算。加密过程如图1所示。
(2)解密过程
和加密密钥一样,解密密钥也需要扩展,不同的是解密密钥是由加密密钥加法逆或乘法逆构成的,且两者一一对应。
IDEA加密算法的解密过程和加密过程一样,只是加密用加密密钥EK,解密用的是解密密钥DK。输入的密文同样为8个字符(即64比特),将64比特数据块分成Y1,,Y2,,Y,3,Y,4四个子块,每一子块16比特。这4个子块将作为第一轮迭代的输入,全部共8轮迭代。解密过程如图2。
IDEA加密算法结构图如图3。
二、IDEA加密算法和解密算法如何设计与实现
1、加密密钥扩展算法的实现
在IDEA加密算法中,实际上是将128比特密钥扩展为832比特。每一个字节用0补足16位。具体是如何扩展的呢?在前面的扩展思想中已经知道密钥串分8个子块,循环左移7次,其中第7次循环是取前4个,所以最终形成832比特(16*8*6+16*4)。扩展密钥数组为m_nKeyEncryptBox[52],部分代码如下:
byte[]asciiBytes=Encoding.Convert(unicode,ascii,unicode.GetBytes(this.m_sEncryptionKey));
//将一组字符编码成一个字节序列
char[]asciiChars=newchar[ascii.GetCharCount(asciiBytes,0,asciiBytes.Length)];
//进行字节到字符再到串的转换
ascii.GetChars(asciiBytes,0,asciiBytes.Length,asciiChars,0);
//由密钥m_sEncryptionKey扩展成加密密钥扩展数组m_nKeyEncryptBox
for(j=0;j<8;j++)//加密子密钥[j]循环左移8+[j+1]位
……
2、IDEA加密算法和解密算法的实现
IDEA加密算法和解密算法是相同的,其处理为:将64比特输入分成4个16比特的子块A、B、C、D,然后进行8轮循环,在第j轮循环中,子密钥为: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]……循环左移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、解密密钥扩展算法的实现
解密密钥也需要扩展,不过,它与加密密钥扩展不同,它不需要从密钥串中变换而来。IDEA解密密钥扩展数组m_nKeyDecrypt-Box[52]是由加密密钥数组m_nKeyEncryptBox处理而来的。其具体处理步骤为:
首先由m_nKeyEncryptBox[0]到m_nKeyEncryptBox[3]四个加密密钥数组元素处理成四个解密密钥数组元素m_nKeyDecryptBox[51]到m_nKeyDecryptBox[48],然后进行8轮迭代。在第m轮中,由六个加密密钥数组元素m_nKeyEncryptBox[4+6*m]到m_nKeyEncryptBox[9+6*m]生成六个解密密钥数组元素m_nKeyDe-cryptBox[47-6*m]到m_nKeyDecryptBox[42-6*m]。最终生成832比特的加密密钥数组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加密算法的加密和解密过程中,每一轮迭代都是由分组数据之间,分组数据和密钥间进行模加、模乘和逐位异或运算组成的。其中,模乘的核心代码如下:
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)乘逆元算法
模乘逆元算法是在解密密钥扩展时的主要算法,解密密钥扩展数组m_nKeyDecryptBox[52]是由加密密钥数组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,余数赋给yy=(ushort)(0x10001%x);
if(y==1)//若y=1,返回65537减t1后的值的低16位returnLow16(0x10001-t1);
t0=1;
//位t0赋初值1do
……
6、IDEA加密算法和解密算法实现的演示界面
小知识之IDEA
IDEA(International Data Encryption Algorithm)是瑞士的James Massey,Xuejia Lai等人提出的加密算法,在密码学中属于数据块加密算法(Block Cipher)类。IDEA使用长度为128bit的密钥,数据块大小为64bit。从理论上讲,IDEA属于“强”加密算法,至今还没有出现对该算法的有效攻击算法。