在信息安全保密日益严峻的形势下,信息的存储安全作为信息安全的一个重要方面,被关注的程度远远不够。信息加密技术作为信息安全最有效的方法之一,可通过不同的加密算法来实现,而加密算法的选取直接影响信息的安全程度,那么我们今天就来给大家介绍一下IDEA加密算法是如何通过编程实现的。
一、IDEA加密算法
1、IDEA加密算法简介
IDEA是一种数据块加密算法,加密的数据块为64 b,密钥长度是128 b。该加密算法在硬件和软件上均可高速进行加解密,而且加密过程与解密过程相同,仅加密密钥与解密密钥不同,他设计了一系列加密轮次,每轮加密都使用从完整的加密密钥中生成的一个子密钥,被认为是目前世界公开的最好最安全的加密算法。虽然密码分析者能对轮数减少的变形做一些分析工作,这么长的密钥在今后若干年内应该是安全的。
IDEA加密算法既用混乱又用扩散,他的设计原则是一种来自于不同代数群的混合运算,且这个代数群进行的运算,无论用硬件还是软件都易于实现;算法输入的64位数据被分成4个16位子分组作为第一轮的输入,总共有8轮迭代。在每一轮中,相互间进行运算同时也与6个16位的子密钥进行运算(每轮均不同),最后还与4个16位的子密钥进行输出变换,产生输出,其中共52个16位的子密钥参与运算。整个算法包括3部分:
(1)子密钥的产生
输入:128 b密钥;
输出:52个16 b的子密钥。
(2)加密过程
输入:52个子密钥和64 b数据;
输出:64 b数据。
(3)解密过程
IDEA加密算法的加密过程与解密过程的子密钥不相同,且二者是一一对应的。
2、IDEA加密算法子密钥的生成
IDEA共需要52个子密钥,每一个有16 b,由128 b密钥生成。自密钥将128 b分成8组,每组16 b,得到k1,k2,…,k8;将128 b循环左移25位后做16 b分组,得到子密钥k9,k10,…,k16;再将这128 b循环左移25位后做同样的分组得到子密钥k17,k18,…,k24;以此类推,直到生成所有的子密钥。
3、IDEA加密算法加密过程
该加密算法中密钥为128 b,明文分组长度是64 b。64 b被分为4个16 b的子块:X1,X2,X3,X4作为第一轮的输入,每一轮中,将4个输入子块与6个16 b子密钥分别做模2的16次方加法、模2的16+1次方的乘法、异或操作,得到4个输出作为下一轮的输入。如此共进行8轮,最后用4个子密钥作输出变换。其整体结构如图1所示。
每一轮的迭代运算步骤如下:
(1) X1和第1个子密钥块做乘法运算;
(2)X2和第2个子密钥块做加法运算;
(3)X3和第3个子密钥块做加法运算;
(4) X4和第4个子密钥块做乘法运算;
(5)步骤(1)和步骤(3)的结果做异或运算;
(6)步骤(2)和步骤(4)的结果做异或运算;
(7)步骤(5)的结果与其本身做乘法运算;
(8)步骤(6)和步骤(7)的结果做加法运算;
(9)步骤(8)和步骤(6)的结果做乘法运算;
(10)步骤(7)和步骤(9)的结果做加法运算;
(II)步骤(3)和步骤(9)的结果做异或运算,
(12)步骤(2)和步骤(10)的结果做异或运算;
(13)步骤(4)和步骤cio)的结果做异或运算。
结果的输出为步骤(10),步骤(1 1),步骤(12),步骤(13)的运算结果。第8轮结束后,最后输出变换有四步:
(1) X1和第1个子密钥块做乘法运算;
(2) X2和第2个子密钥块做加法运算;
(3) X3和第3个子密钥块做加法运算;
(4) X4和第4个子密钥块做乘法运算。
4、IDEA加密算法解密过程
IDEA加密算法在硬软件上均可高速进行加解密,其中的加解密子密钥关系如下:
其中;-Zi表示Zi,模216的加法逆元,即- Zi+Zi≡_mod 216,Zi-1表示Zi模216 +1的乘法逆元,即- ZiZi≡0 mod 216+1。
由上表可见:解密的子密钥块是由加密子密钥的加法逆或乘法逆构成的。解密密钥可以通过查表法获得。
二 、IDEA加密算法的编程实现
编程实现的加解密思路是:先读入要加密的文件,统计实际文件的长度,依次分块读出数据,从文件中读出的最后一批数据,长度可能会等于0,所以要先判断,若不为0定有8B以上的空间,将文件的长度存于最后8字节中,文件加密、解密完后将明文写入文件中。
1、子密钥的生成
将128 b分成8组,再循环左移25位后做16 b分组,依次类推,直到生成所需的52个子密钥。其关键代码如下:
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位密钥左环移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)/*密钥左环移25位*/
{
ULO NG32 itmpfirst一O,itmp=0;
ULONG32 i;
inkey[0]=(inkey[0]<<25)J(inkey[0]>>7);
/*取低25位,因为前面已经做了环移,原始的低7位已经移到了高位,保存*/
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、实现加密的代码
将明文4个子块与6个子密钥分别做模2的16次方的加法、模2的16+1次方乘法、异或操作,得到4个输出作为下一轮的输入,进行8轮迭代,再将4个子密钥做输出变换。其源代码如下:
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]);
/*轮变换函数*/
/*交换中间两个*/
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、解密过程的实现
解密过程是加密过程的逆,只是子密钥不同而已,其实现的源代码如下:
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);
/*交换中间两个*/
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加密算法中对实现速度影响最大的是模乘部分,即求乘法逆元,该算法中利用辗转相除法来求得逆元,提高了整个加密算法的执行效率:
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加密算法加密速度快,密钥产生方法简单,硬件、软件均容易实现。该加密算法若采用搜索破译要2的128次方大约10的38次方次试探,8轮迭代使得没有任何捷径破译,对于差分和线性攻击是安全的,若将字节有16 b增至32 b,密钥长度应相应长256 b,采用232模加,232 +1模乘,则可进一步强化IDEA加密算法。
小知识之变换函数
在化石群各属种含量定量分析的基础上,通过数理统计技术确定的生物组合与古温度之间的定量函数关系。