在信息安全保密日益严峻的形势下,信息的存储安全作为信息安全的一个重要方面,被关注的程度远远不够。信息加密技术作为信息安全最有效的方法之一,可通过不同的加密算法来实现,而加密算法的选取直接影响信息的安全程度,那么我们今天就来给大家介绍一下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所示。

IDEA加密算法及其编程实现

每一轮的迭代运算步骤如下:

(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加密算法在硬软件上均可高速进行加解密,其中的加解密子密钥关系如下:

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加密算法。

小知识之变换函数

在化石群各属种含量定量分析的基础上,通过数理统计技术确定的生物组合与古温度之间的定量函数关系。