您的当前位置:首页正文

IDEA密码

来源:九壹网
 陕西科技大学试验报告

班级: 学号: 姓名 试验组别: 试验日期: 报告日期: 成绩: 报告内容:(目的和要求、原理、步骤、数据、计算、小结等)

实验名称:IDEA密码算法

一、实验目的

(1)通过实验熟练掌握IDEA密码算法; (2)学会IDEA算法程序设计; (3)提高C++程序设计能力。

二、实验要求

(1)要求密钥和明文都从键盘输入。

(2)程序中子密钥生成正确,运行后能正确输出密文

三、实验原理

64比特的数据块分成4个子块X1,X2,X3和X4,每一个子块16比特,作为第1轮的输入,全部共8轮迭代。运算步骤如下:

(1) X1和第1个子密钥块作乘法运算。 (2) X2和第2个子密钥块作加法运算。 (3) X3和第3个子密钥块作加法运算。 (4) X4和第4个子密钥块作乘法运算。 (5) (1)和(3)结果作异或运算。 (6) (2)和(4)结果作异或运算。

(7) (5)的结果与第5个子密钥块作乘法运算。 (8) (6)和(7)结果作加法运算。

(9) (8)的结果与第6个子密钥块作乘法运算。 (10) (7)和(9) 结果作加法运算。 (11) (1)和(9)结果作异或运算。 (12) (3)和(9) 结果作异或运算。

第 1 页 陕西科技大学试验报告

(13) (2)和(10) 结果作异或运算。

(14) (4)和(10) 结果作异或运算。结果的输出为(11),(13),(12),(14)。 除最后一轮(第8轮)外,第2和第3块交换。第8轮结束后,最后输出的变换有:

(1) X1和第1个子密钥块作乘法运算。 (2) X2和第2个子密钥块作加法运算。 (3) X3和第3个子密钥块作加法运算。 (4) X4和第4个子密钥块作乘法运算。

子密钥块每轮6个,最后输出变换4个,共52个。首先将128比特的密钥分成8个子密钥,每个子密钥16比特。这8个子密钥正好是第1轮的6个及第2轮的前两个。再将密钥左旋25比特,再将它分成8个子密钥。前4个是第2轮的子密钥,后4个是第3轮的子密钥。将密钥再左旋25比特,产生后8个子密钥。依此类推,直到算法结束。

设密钥kk1k2k128分成8段,依次为

Z1(1)k1k2k16,(1)Z2k17k18k32,…

(1)(2)Z6k81k82k96,Z1(2)k97k98k112,Z2k113k114k128

再将k向左旋移位25比特 k26k27k128k1k2k25

(2)(2)(2)分8段,前4段是第2轮的子密钥Z3,Z4,Z5,Z6;后4段依次是Z1,Z2,(3)(3),Z4。继续以上步骤,直到52个子密钥生成完毕。 Z3(2)(3)(3)解密过程和加密完全一样,只不过解密用的子密钥不同。 解密密钥和加密密钥有一个对应关系。 这里Z1表示Zmod(21)乘法的逆,即Z⊙Z=1mod(216161161)

Z表示Zmod2加法运算的逆,即ZZ=0mod2

16下面讨论解密的运算地正确性。用A表达步骤(1)~ (4),B表达 (5)~ (14) 步骤,包括第2、第3两部分的交换。(在图中,第8轮结束后不交换,但是为了B完整性,在第8轮做了交换,所以第9轮的输入要给他们再换回来)

第 2 页 陕西科技大学试验报告

明文设为

(X1,X2,X3,X4),密文为(Y1,Y2,Y3,Y4)

(9)YW82Z2, 3(9)YWYW83Z1811加密运算的第9轮有:⊙,2(9)Z3,

(9)Y4W84⊙Z4Y,Y,Y,Y 1234作为解密运算的输入,解密运算的第1轮有:

J11Y1⊙(Z1(9))1W81⊙Z1(9)⊙(Z1(9))1=W81 J12Y2(9)(Z2)W83(9)(Z3)W82(9)Z2(9)(Z2)=W83

J13Y3(9)Z3(9)(Z3)=W82

(9)(9)1(9)1⊙(Z4)=W84 J14Y4⊙(Z4)W84⊙Z4可见解密第1轮A的输出恰好是加密第8轮的输出。(?为什么是这样?因为在图中第8轮结束后,多交换了一次?本来应是W81,W83,W82,W84)

再看IDEA加密算法的主要构成模块MA,如图所示:

MA(l)(U,V)表示MA的左边的输出,MA(r)(U,V)表示MA的右边的输出。则有:W81I81MA(r)(I81I83,I82I84) W82I83MA(r)(I81I83,I82I84) W83I82MA(l)(I81I83,I82I84) W84I84MA(l)(I81I83,I82I84) V11J11MA(r)(J11J13,J12J14)=W81MA(r)(W81W82,W83W84)

(r)(r) W81W82=I81MA(I81I83,I82I84)I83MA(I81I83,I82I84)

=I81I83

第 3 页 陕西科技大学试验报告

W83W84=I82MA(l)(I81I83,I82I84)I84MA(l)(I81I83,I82I84)

=I82I84

(r)(r)所以V11I81MA(I81I83,I82I84)MA(I81I83,I82I84)=I81

同样可证:V12I83,V13I82,V14I84这就证明了解密运算的第1轮B的输出,正好是加密运算第8轮的A的输入,不过第2块和第3块交换。依此类推,可证:V81I11,

V82I13,V83I12,V84I14所以最后一轮的输出为:

V81⊙(Z1)(1)1I11⊙(Z1(1))1=X1⊙(Z1(1))⊙(Z1(1))1=X1

(1)(Z2)=X2

V83V82(1)(Z2)I12(1)(Z2)(1)(Z2)=X2

(1)(Z3)I13(1)(Z3)=X3(1)(Z3)(1)(Z3)=X3

(1)1(1)1(1)(1)1V84⊙(Z4)I14⊙(Z4)=X4⊙(Z4)⊙(Z4)=X4

故输出的明文为(X1,X2,X3,X4)

第 4 页 陕西科技大学试验报告

程序流程图:

请选择

1 2

加密 退出

输入密钥 输入明文

将明文以及密钥作相 应的转换

明文、密钥循环

作用8次

用最后4个密钥对输出 的四个明文作变换

输出密文

四、实验数据

#include #include #include

int b[8]={0},key1[128]={0},g[16]={0};

void chang1(char c,int b[8]) //将一个字母转换成二进制数 {

int i=0; int d=c; while(d!=0) { b[i++]=d%2; d=d/2;

第 5 页 陕西科技大学试验报告

} }

long chang2(int d[],long n) //将一串16位的二进制数转换成一个十进制数 { int i;

for(i=0;i<16;i++) n=n+d[i]*(int)pow(2,i); return n; }

void chang3(long x,int d[]) //将一个十进制数装换成二进制数 {

int i=0; while(x!=0) { d[i++]=x%2; x=x/2; } }

int chang4(int d[]) //将一串二进制数转换成十进制数 {

int i,n=0; for(i=0;i<8;i++) n=n+d[i]*(int)pow(2,i); return n; }

void revolve(int a[128]) //将一串128位的二进制左旋25位 {

int c[25],i; for(i=0;i<25;i++) c[i]=a[i]; for(i=0;i<103;i++) a[i]=a[i+25]; for(i=0;i<25;i++) a[i+103]=c[i]; }

void main() {

char c[8],key[16];

unsigned long d1[4]={0},d2[8]={0},d3[56]={0},d4[8][6]={0},d5[4],

a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,t;

int b1[4][16],b2[8][16],g1[8],g2[8],n,x[4],y[4];

第 6 页 陕西科技大学试验报告

int i,j,k=0,l;

printf(\"\\n\\n\\---------------欢迎使用IDEA加密系统-----------------\\n\\n\"); printf(\"\\\请选择: 1.加密 2.退出\\n\\n\"); do { printf(\"请选择:\"); scanf(\"%d\ switch(n) { case 1: { printf(\"请输入8个明文字母:\"); scanf(\"%s\

printf(\"请输入16个密钥字母:\"); scanf(\"%s\

for(j=0;j<8;j=j+2) //将每一个明文字母转换为二进制数 { chang1(c[j+1],b); for(i=0;i<8;i++) b1[j/2][i]=b[i]; chang1(c[j],b); for(i=0;i<8;i++) b1[j/2][8+i]=b[i]; }

for(i=0;i<4;i++) d1[i]=chang2(b1[i],d1[i]); //将16位的二进制数转换为十进制数

{ chang1(key[j+1],b); for(i=j*8;i<(j*8+8);i++) key1[i]=b[i]; chang1(key[j],b); for(i=j*8+8;i<(j*8+16);i++) key1[i]=b[i]; }

/* for(i=0;i<128;i++) printf(\"%d\ printf(\"\\n\\n\"); revolve(key1); for(i=0;i<128;i++)

第 7 页 for(j=0;j<16;j=j+2) //将16个密钥字母转换为128个二进制

陕西科技大学试验报告

printf(\"%d\*/

j=7;

while(j!=0) //将128位的二进制一直左旋,直到产生52个子密钥

{ for(i=0;i<128;i++) b2[i/16][i%16]=key1[i]; for(l=0;l<8;l++) { d3[k]=chang2(b2[l],d3[k]); k++; } revolve(key1); j--; }

for(i=0;i<48;i++) //将52个密钥的前48个分成8组 d4[i/6][i%6]=d3[i]; for(i=0;i<4;i++) //后四个密钥 d5[i]=d3[i+48]; // printf(\"%dl\\n\

for(i=0;i<8;i++) { a1=(d1[0]*d4[i][0])%((long)(pow(2,16)+1)); a2=(d1[1]+d4[i][1])%((long)(pow(2,16))); a3=(d1[2]+d4[i][2])%((long)(pow(2,16))); a4=(d1[3]*d4[i][3])%((long)(pow(2,16)+1)); a5=a1^a3; a6=a2^a4; a7=(a5*d4[i][4])%((long)(pow(2,16)+1)); a8=(a6+a7)%((long)(pow(2,16))); a9=(a8*d4[i][5])%((long)(pow(2,16)+1)); a10=(a7+a9)%((long)(pow(2,16))); d1[0]=a1^a9; d1[2]=a2^a10; d1[1]=a3^a9; d1[3]=a4^a10; // printf(\"%dl\\n\ } t=d1[1]; d1[1]=d1[2];

第 8 页 陕西科技大学试验报告

d1[2]=t;

// printf(\"%dl\\n\

d1[0]=(d1[0]*d5[0])%((long)(pow(2,16)+1)); d1[1]=(d1[1]+d5[1])%((long)(pow(2,16))); d1[2]=(d1[2]+d5[2])%((long)(pow(2,16))); d1[3]=(d1[3]*d5[3])%((long)(pow(2,16)+1)); // printf(\"%dl,%dl\

printf(\"密文为:\\n用二进制表示,每串由高位到低位:\\n\"); for(j=0;j<4;j++) {

// printf(\"%dl\\n\ chang3(d1[j],g);

for(i=0;i<8;i++) g2[i]=g[i+8]; x[j]=chang4(g2); for(i=7;i>=0;i--) printf(\"%d\ printf(\" \"); for(i=0;i<8;i++) { g1[i]=g[i]; } y[j]=chang4(g1); for(i=7;i>=0;i--) printf(\"%d\ printf(\" \"); } printf(\"\\n用十进制表示:\"); for(j=0;j<4;j++) printf(\"%d %d \ printf(\"\\n\"); break; } case 2: n=0; break; default: printf(\"请重新输入!\\n\"); } }while(n!=0);

第 9 页 陕西科技大学试验报告

printf(\"\\n\"); }

五、程序运行结果

1) 程序结构说明文档

本程序包括5个子函数:chang1()、chang2()、chang3()、chang4()、revolve()。

chang1()函数的作用是将一个字母转换成8位二进制数;

chang2()函数的作用是将一串16位的二进制数转换成一个十进制数; chang3()函数的作用是将一个十进制数装换成二进制数; chang4()函数的作用是将一串8二进制数转换成十进制数; revolve()函数的作用是将128位的数左旋25位;

主函数中调用五个子函数,对程序进行整理,使程序相对完善。

2) 程序使用说明文档

使用此程序时,首先进行一次选择,加密、退出,选择一次以后,按照提示输入密钥、明文。在操作执行一次以后,程序会等待下次选择,如果选择错误,程序会提示”重新输入”,如果操作结束,就输入相应序号退出程序

六、实验小结

通过这次实验,我对IDEA密码 加密有了更加深刻的理解,熟练的掌握了IDEA密码算法,学会IDEA算法程序设计。本次实验相对而言比较复杂,多次使用了二进制和十进制的转换,加大了编程难度。由于开始时有点畏惧这次实验,编程进度有点缓慢。通过耐心的思考,将算法原理简单化,提高了全面思考问题的的能力以及C++程序设计能力。编程中定义了全局变量以及编写了五个子函数,温习了以前所学的编程知识。程序总体运行较为顺利。

程序设计要求我们必须细心必须有耐力,这样才能做出好得程序正确得程序!

通过本次实验,我认识到了自己的不足,以后会多加练习,将理论与实践结合起来。 程序有不足之处,望老师指点!

第 10 页 陕西科技大学试验报告

第 11 页

因篇幅问题不能全部显示,请点此查看更多更全内容

Top