完整版IDEA密码算法.docx

上传人:b****5 文档编号:3439966 上传时间:2022-11-23 格式:DOCX 页数:16 大小:396.16KB
下载 相关 举报
完整版IDEA密码算法.docx_第1页
第1页 / 共16页
完整版IDEA密码算法.docx_第2页
第2页 / 共16页
完整版IDEA密码算法.docx_第3页
第3页 / 共16页
完整版IDEA密码算法.docx_第4页
第4页 / 共16页
完整版IDEA密码算法.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

完整版IDEA密码算法.docx

《完整版IDEA密码算法.docx》由会员分享,可在线阅读,更多相关《完整版IDEA密码算法.docx(16页珍藏版)》请在冰豆网上搜索。

完整版IDEA密码算法.docx

完整版IDEA密码算法

陕西科技大学实验报告

班级:

信息062学号:

200612030223姓名:

孙丹龙实验组别:

实验日期:

报告日期:

成绩:

报告内容:

(目的和要求、原理、步骤、数据、计算、小结等)

实验名称:

IDEA密码算法实验

一、实验目的

(1)通过实验熟练掌握IDEA密码算法,学会IDEA算法程序设计

(2)提高C++程序设计能力。

二、实验要求

(1)熟练掌握IDEA密码算法。

(2)学会IDEA算法程序设计,提高C++程序设计能力。

(3)独立完成实验,并按时完成实验报告。

三、实验原理(流程图):

64比特的数据块分成4个子块X,,X2,X3和X4,每一个子块16比特,作为第1轮的输入,全部共8轮迭代。

运算步骤如下:

(1)X1和第1个子密钥块作乘法运算。

(2)X2和第2个子密钥块作加法运算。

(3)X3和第3个子密钥块作加法运算。

(4)X4和第4个子密钥块作乘法运算。

(5)

(1)和⑶结果作异或运算。

(6)

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

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

(8)(6)和⑺结果作加法运算。

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

(10)(7)和(9)结果作加法运算。

(11)

(1)和(9)结果作异或运算。

(12)(3)和(9)结果作异或运算。

(13)

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

(14)(4)和(10)结果作异或运算。

结果的输出为(11),(13),(12),(14)。

除最后一轮(第8轮)外,第2和第3块交换。

第8轮结束后,最后输出的变换有:

(1)Xj和第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个子密钥。

依此类推,直到算法结束。

r

&

K3

K4

K5

K6

1

0-15

16-31

32-47

48-63

64-79

80-95

2

96-111

112-127

25-40

41-56

57-72

73-88

3

89-104

105-120

121-8

:

9-24「

50-65

66-81

4

82-97

98-113

114-1

2-17

18-33

34-49

5

75-90

91-106

107-122

123-10

11-26

27-42

6

43-58

59-74

100-115

116-3

4-19

20-35

7

36-51

52-67

68-83

P84-99「

125-12

13-28

8

29-44

45-60

61-76

77-92

93-108

109-124

9

22-37

38-53

54-69

70-85

-

-

表1IDEA的密钥扩展过程

设密钥kk1k2&28分成8段,依次为

再将k向左旋移位25比特k26k27k128k1k2k25

分8段,前4段是第2轮的子密钥z32),z42),z52),z62);后4段依次是乙⑶,z23),

z33),z43)。

继续以上步骤,直到52个子密钥生成完毕。

解密过程和加密完全一样,只不过解密用的子密钥不同。

解密密钥和加密密钥有一个对应关系。

这里Z1表示Zmod(2161)乘法的逆,即ZOZ1=1mod(2161)

Z表示Zmod216加法运算的逆,即Z田Z=0mod216

F面讨论解密的运算地正确性。

用A表达步骤

(1)~(4),B表达(5)~(14)步骤,包

括第2、第3两部分的交换。

(在图中,第8轮结束后不交换,但是为了B完整性,在第8

轮做了交换,所以第9轮的输入要给他们再换回来)

明文设为(X1,X2,X3,X4),密文为(丫心上飞)

加密运算的第9轮有:

丫1WOZ1(9),丫2W8-Z2(9),丫3W82—Z39),

丫4W84OZJYl'Y2"3,丫4作为解密运算的输入,解密运算的第1轮有:

可见解密第1轮A的输出恰好是加密第8轮的输出。

(?

为什么是这样?

因为在图中第

8轮结束后,多交换了一次?

本来应是W81,W83,W82,W84)

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

W81

I81

MA(r)(

I81I83,I82I

184)

W82

I83

MA(r)(

I81I83,

I82I

84)

W83

I82

MA(l)(

I81I83,I82I

184)

W84

I84

MA(l)(

I81I83,

I82I

84)

Vn

J11

MA(r)(

J11J13,J12

J14)

=W81

MA(r)

(W81

W82,W83

W84)

W81

W82

=I81

MA(r)(I81I83

I82

I84)

I83

MA(r)

(I81I83

I82

I84

=I81

I83

W83

W84=

=I82

MA⑴(I81I83,

I82

I84)

I84

MA(l)(

I81I83,

I82I

84)

=I82

I84

MA(l)(U,V)表示MA的左边的输出,MA⑴(U,V)表示MA的右边的输出。

则有:

所以Vii丨81

MA(r)(I81

MA(r)(I8i

I83,I82

I84)=I81

I83,I82I84)

同样可证:

V12丨83,V13丨82,V14打4这就证明了解密运算的第1轮B的输出,

正好是加密运算第8轮的A的输入,不过第2块和第3块交换。

依此类推,可证:

V81111,

V82I13,V$3I12,V84I14所以最后一轮的输出为:

V81o(Z1⑴)1go(Z1⑴)1=X1O(Z1⑴)O(Z1⑴)1=X1

V83^(Z21))』(Z21))=X2圧(Zy)^(Z21))=X2

V82^(Z31))113田(Z31))=X3田(Z31))田(Z31))=、

V84o(z4°)1丨14o(z4°)1=X4o(z4°)o(Z41))1=X4

故输出的明文为(x“x2,x3,x4)

四、实验数据(源代码):

//IDEA密码算法

#inelude

#inelude

#inelude

usingnamespaeestd;

constunsignedintN=256;〃mod(pow(2,8))=256

constunsignedintMUL=65537;〃16比特的整数做mod(pow(2,16)+1)=65537的乘法运算

输入明文字符串m和密钥序列k

图1总体流程图

图2加密算法

 

constunsignedintADD=65536;〃16比特的整数做mod(pow(2,16))=65536的加法运算

stringkey_change(unsignedintn,intk)〃十进制数倒序变换为k位二进制

{

stringresult;

for(inti=O;i

{

if((i!

=O)&&!

(i%4))result+=",";

if(n%2)result+="1";

elseresult+="0";

n/=2;

}

returnresult;

}

stringchange(unsignedintn,intk)//十进制数顺序变换为k位二进制

{

stringresult;

for(inti=0;i

{

if((i!

=0)&&!

(i%4))result=","+result;

if(n%2)result="1"+result;

elseresult="0"+result;

n/=2;

}

returnresult;

}

voidset_key(unsignedintkey[],unsignedintz[9][6])〃生成密钥模块

{

inti,j,k,flag=O,t=O;

unsignedintsum,temp[9][6][16];

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

{

for(j=0;j<6;j++)

{

for(k=0;k<16;k++)

temp[i][j][k]=key[(flag+t++)%128];

if(!

(i==j==0)&&((6*i+j)%8)==7)flag+=25;

}

}

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

{

for(j=0;j<6;j++)

{

sum=0;

for(k=0;k<16;k++)

if(temp[i][j][k])

sum+=pow(2,k);

z[i][j]=sum;

}

}

}

voidset_m(unsignedintwrite[],unsignedintx[])〃生成明文模块

{

inti,j;

unsignedintsum;

for(i=0;i<64;i+=16)

{

sum=0;

for(j=0;j<16;j++)

if(write[i+j])sum+=pow(2,j);

x[i/16]=sum;

}

}

voidstring_bb(stringstr,unsignedintresult[])〃字符序列转换为二进制

{

inti,j;

unsignedinttemp;

for(i=0;i

{

temp=str[i];

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

{

if(temp%2)result[8*i+j]=1;

elseresult[8*i+j]=0;

temp=temp/2;

}

}

}voidencrypt(unsignedintx[],unsignedintz[9][6]){

intt,j;

result[4]=result[0]Wesult[2];〃

(1)和⑶结果作异或运算

result[5]=result[1]Aresult[3];〃

(2)和⑷结果作异或运算

result[6]=(result[4]*z[t][4])%MUL;〃(5)的结果与第5个子密钥块作乘法运算

result[7]=(result[5]+result[6])%ADD;//(6)和⑺结果作加法运算result[8]=(result[7]*z[t][5])%MUL;〃(8)的结果与第6个子密钥块作乘法运算

result[9]=(result[6]+result[8])%ADD;//(7)和(9)结果作加法运算

result[10]=result[0]Aresult[8];

result[11]=result[2]Aresult[8];

result[12]=result[1]Aresult[9];

result[13]=result[3]Aresult[9];

cout<<"\n第"<

for(j=0;j<14;j++)

cout<<"\tStep"<

//

(1)和(9)结果作异或运算

//(3)和(9)结果作异或运算

//

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

//(4)和(10)结果作异或运算

"<

\t\t"<

cout<<"\nresult[10]="<

cout<<"result[13]="<

cout<<""<

x[0]=result[10];x[1]=result[12];x[2]=result[11];x[3]=result[13];〃除最后一轮(第

9轮)

外,第2和第3块交换

cout<<"\t"<

}

intmain()

{

inti,j,t;

unsignedintsum,temp,x[4],z[9][6],key[128],write[64];

stringm,k,str;

cout<<"\t\t\tlDEA密码算法";

cout<<"\n请输入明文字符串:

";cin»m;

cout<<"\n请输入密钥:

";cin»k;

cout<<"\n\t\t密钥为k="<

string_bb(k,key);〃将密钥字符序列转换为二进制,存放于数组key[128]

cout<<"k="<

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

{

cout<

if((i!

=O)&&(i%8)==7)cout<<"";

if((i!

=O)&&(i%32)==31)cout<

}

string_bb(m,write);〃将明文字符序列转换为二进制,存放于数组write[64]

cout<<"\n\t\t\t明文是m="<

cout<<"m="<

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

{

cout<

if((i!

=0)&&(i%8)==7)cout<<"";

if((i!

=0)&&(i%32)==31)cout<

}

set_key(key,z);〃生成密钥模块z[9][6]

cout<<"\n=====>密钥模块:

\n"<

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

{

for(j=0;j<6;j++)

{

cout<<"z["<

if(j%2)cout<

}

cout<

}

for(i=0,j=0;i<4;i++,j+=2)x[i]=m[j+1]*pow(2,8)+m[j];

set_m(write,x);〃生成明文模块x[4]

cout<<"\n=====>明文模块:

\n"<

for(i=0;i<4;i+=2)

cout<<"x["<

************************************************************************

encrypt(x,z);return0;

}

五、程序运行结果:

1、运行程序,提示输入明文字符串m和密钥序列k,然后输出明文和密文以及将各自转换为16位二进制表示形式,如下图所示:

g*F:

VTC++\Dehi]ig\M件TUI?

A宪码筒法-

■・・・・・・・・・・■・■・■・■・■・■・■■:

M・■・

IDER密诃舁袪

请辙入明文宁符串!

Tainsert

请输入密4^compute

^^.^Ik-tOnpiitersECin'ity

明文是n=Tsinghua

2、由密钥序列k生成密钥模块,如下图所示:

兀"F:

\VClIDEA密珂算法-“J

"■“》密钥楝块匕

zLinn

1100.0110.1111,0110

z[lK2J

1011.0110.0000.1110

z(ll[3]

1010,111B.W10,111<

z[lH4J

1010.&L10.Q100.1110

^[1J[5]

im.iiie.i0i0.eii*

zCllIGl

?

(2iri1

R11110^1081,0110

2rs)[2i

ZL21C3]

0001,1101,8101,1100

2[2][4j

Bioi^1161*0iGained

M[2][GJ

0100,1181^1800^1131

ziEOlCl]

0101,1100^16811,1101

3[3312]

B81SrllQO,01Ol,1191

zlT31[3]

0011,1181,1800.1101

z[3][43

lliar1101rBJlS,113Q

匕[3】囚1

0001,1181,8181^1100

E][^1

B161F1101r8iBa,nag

^C41CL]

1001,1161,1081,11Bl

S[43T2J

0160^1101,1008,1181

乂⑷口]

0101,1166^1601,1101

z

DOlOUlSBrQIOlUlBl

M【豹巧J

QBuaiiiaflMaiei

ZE43161

iiHuuu^eii^iiBe

e(5ILl]

ZE5JE21

uiei,liei”uiuo,ii0tj

e⑸⑶

ZC5314J

U10M,11011101

z[5lL&]

auiM^iiuu^iuiuioi

z(6)[l]

0011,11613060,1101

z[^](2]

1110^1101,0110,1160

z[6H3]

0001,1161.0101>1100

zH][4J

0101.1101,0100,1100

”【£】[£】

1001,1101.1001^1101

eHIEGI

0100.1101^1^00,1161

2[?

)[1]

0101,1100,1001,1101

eC7J[21

0010.11^0,0101,1101

2L7H31

0011,1101,1000,1101

■E73E4]

1110,1101,0110,1100

zL7)[5J

0001,1101,0101,1100

eE7][6]

0101,1101,0100,1100

zLSHl]

1001,1101.1001,1101

ECIJE2J

010QPllQia@00.11Ol

sCSJEJ]

R1R1-1100,1001.1101

e(S](41

001fl.1100,R101.llA1.

^CS)[51

mu.liei.lflan.iiQi

zrftirgl

til0_1101,RH«,llftA

^[9irt]

aam.”mai,0ibi,1ibh

^[43121

Blial,1101“BlBO^llHn

1901,1101.1601.1101

z[43C4J

^100,1101.1808,11H1

1[C]

0101,11QQ,1601,1101

2[93L£J

&01G丄

3、由明文字符串m生成明文模块,如下图所示:

4、循环迭代8次,如下图所示:

复ftexe

f・.NJtNJtN良貝良貝覽W覽・軾此貿MKMlC袒見・科BtJlXJlIfJtlCjtNjtXjt

弟丄趙

Stepl

丄101,001丄,01B0,lilt

Step2

1101,1110,1101,0110

Step3

丄101.110S,11B1,1103

Step4

0110.0001,1001,1191

StepS

0000.1111,1001,0011

StepG

1011,1111,B1B0,1011

Step?

1111,0111,1101,1110

StepS

i0i:

Uatli,lest

Step?

BailP1101,iibi,iiii

SteplO

0011,0181,1011,1101

Stevll

1110^1110,1001,0003

Ste>)12

llie^0B01,000叫0011

Ilia,1811,8110,1B11

Ste>)14

0101p010B「0010^0003

res«UL10]=tie721110,1lie,10F11,0000result[121=632&71110.1011,0110^1011result1111=5760?

[jJO月阴1.阳腼『同PUresult[131=21536肌阳山1胴川如叫肿胴

影趟

 

六、实验小结:

本次试验让我们进一步掌握了IDEA加密算法以及其设计思想,运用了较广知识点,比

如,数制之间的转换及储存形式,二进制数之间的加法、乘法、取余、异或运算以及移位等等。

在次,统一运用十进制计算,最后以二进制形式输出,简化了编程步骤,方便数据之间的处理。

由于迭代次数较多,在编程中没能理清各个变量之间的关系,出现了许多错误,但在同学的帮助和自己的努力下,一一予以解决。

通过本次实验,不但巩固了对IDEA加密算

法的掌握情况,而且锻炼了自己的VC/C++编程能力。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1