完整版IDEA密码算法.docx
《完整版IDEA密码算法.docx》由会员分享,可在线阅读,更多相关《完整版IDEA密码算法.docx(16页珍藏版)》请在冰豆网上搜索。
![完整版IDEA密码算法.docx](https://file1.bdocx.com/fileroot1/2022-11/22/120f4794-854a-42a5-ba42-1b00337ec4a0/120f4794-854a-42a5-ba42-1b00337ec4a01.gif)
完整版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++编程能力。