资源描述
成都信息工程学院
课程设计报告
AES加密解密软件的实现
课程名称:应用密码算法程序设计学生姓名:樊培
学生学号:20学121058专业班级: 信息对抗技术101
任课教师:陈俊2012年6月7日
void SubBytes(unsigned char State[][4])
int i,j;
for(i=0; i<4; i++)
(for(j=0;j<4; j++)
(State[i][j] = Sbox[State[i]D]];
)
} )行移位(ShiftRows)
一.State的第一行字节保持不变,State的第二行字节循环左移一个字节,State的 第三行字节循环左移两个字节,State的第四行循环左移三个字节。
行移位左偏移量:
变化如图2所示。
Nb
C1
C2
C3
4
1
2
3
6
1
2
3
8
1
3
4
二.关键代码void ShiftRows(unsigned char State[][4])
节
void ShiftRows(unsigned char State[][4])
节
〃采用最原始的方法,以分别为字
unsigned char k;k=State[1][0];
State[1][0]=State[1][1];
State[1][1]=State[1][2];
State[1][2]=State[1][3];
State[1][3]=k;k=State[2][1];
State[2][1]=State[2][3];State[2][3]=k;
k=State[2][0];State[2][0]=State[2][2];
State[2][2]=k;k=State[3][3];
State[3][3]=State[3][2];State[3][2]=State[3][1];
State[3][1]=State[3][0];State[3][0]=k;
4.2.2、 列混合(MixColumn)
一.列混合变换是一个替代操作,是AES最具技巧性的局部。它只在AES的第0, 1,…, Nr 一 1轮中使用,在第N r轮中不使用该变换。乘积矩阵中的每个元素都是一行和一列对 应元素的乘积之和。在MixColumns变换中,乘法和加法都是定义在GF( 28)上的。State的 每一列(2/ 1=0,…,3; J=0,4被理解为GF(28)上的多项式,该多项式与常数多项式 a(x) = a3x3 + a2x2 +axx + a0 相乘并模 M (x) = / +1 约化。
这个运算需要做GF(2')上的乘法。但由于所乘的因子是三个固定的元素02、03、01, 所以这些乘法运算仍然是比拟简单的(注意到乘法运算所使用的模多项式为m(x) = xs +x4 +x3 +x + 1).设一个字节为 b=(b7b6b5b4b3b2blb0),那么
bX 'OP =b;
bX '02' = (b6b5b4b3b2b 1 bOO) + (000b7b70b7b7);
bX '03' =bX '01' +bX’ 02'。
(请注意,加法为取模2的加法,即逐比特异或) 写成矩阵形式为:
最后完成的效果如图:
02
03
01
01
bi
01
02
03
01
b2
()1
01
02
()3
03
01
01
02
二.关键代码
〃其中调用小函数xtime,根据02乘法原理编写,最后03乘是在02乘的基础上进行了03=(27+1 ),同理进行一次02乘,在与本省异或
void MixColumns(unsigned char State[][4]) (
unsigned char output[4][4];
inti, j;
for(j=0;j<4; j++)
{〃0x02乘法
〃0x02乘法
for(i=0; i<4; i++)output[i][j] = xtime(State[i%4][j])a ( State[ (i + 1 ) % 4]0] A xtime( State[ (i + 1 ) % 4][j]))
〃0x03乘法
人 State[ (i + 2 ) % 4][j]//OxO1 乘法人 State[ (i + 3 ) % 4朋;//OxO1 乘法
) } for(i=0; i<4; i++) ( for(j=0; j< 4; j++) (
State[i][j]=output[i]0]; } ) } 02乘法函数: unsigned char xtime (unsigned char input) { int temp; temp = input«1; if(input & 0x80) { temp 八=0x1 b; } return temp; )424、轮密钥加(AddRoundKey)
一.Add RoundKcy称为轮密钥加变换,128位的State按位与128位的密钥XOR: (%/,々j,/?2八/j)<-S()j,々j,b2J•,力3j)㊉(koj,勺八Z2j,h,)对j=。,…,L-I 轮密钥加变 换很简单,却影响了 State中的每一位。密钥扩展的复杂性和AES的其他阶段运算的复杂 性,却确保了该算法的平安性。 最后完成的效果如图:
A0,0
A0,1
AO,2
AO,3
④
K0,0
K0,1
KO,2
KO,3
B0,0
B0,1
BO,2
BO,3
A1,0
A1,1
A1,2
A1,3
K1,0
K1,1
K1,2
K1,3
B1,0
B1,1
B1,2
B1,3
A2,0
A2,1
A2,2
A2,3
K2,0
K2,1
K2,2
K2,3
B2,0
B2,1
B2,2
B2,3
A3,0
A3,1
A3,2
A3,3
K3,0
K3,1
K3,2
K3,3
B3,0
B3,1
B3,2
B3,3
A3,3 ® K3,3 = B3,3 (mod 2)
二.关键代码void AddRoundKey(unsigned char State[][4],unsigned char Key口[4]) (
int i,j;
for(i=0;i<4;i++)
(for(j=0;j<4;j++)
(StateU][i]A=KeyU][i];
)
))
4.2.5、 加密主函数关键代码
〃根据加密函数流程图,进行架构加密主函数,参数分别是一个密钥数组,一个明文分组进 入,参与运算,其中密钥一进入就进入密钥扩展,为以后的加密产生密钥,void Encryption(unsigned char input[16],unsigned char Key[16j)
(
KeyExpansion(Key,ExpandKey);
unsigned char State[4][4];
int i,j,k;
for(i=0; i<4; i++)
{for(j=0; j<4 ;j++)
(State[i][j]= input[4*j+i];
)
)
AddRoundKey(State,ExpandKey(0]);
for(i=1;i<=10;i++)
(SubBytes(State);
ShiftRows(State);if(i!=10)MixColumns(State);
AddRoundKey(State,ExpandKey[i]);if(i>=9)
(printfCn第%d轮加密密钥矩阵为:\n",i);
int m,n;for(m=0;m<4;m++)
(for(n=0;n<4;n++)
(printf("%X,n,ExpandKey[i][n][m]);
)
printf("\n");
}printf("第%d轮加密出的密文为:”,i); for(m=0;m<4;m++)
(for(n=0;n<4;n++)
{printf("%X,",State[n][m]);
)}
printf("\n");)
)
for(j=0;j<4; j++)
{for(k=0; k<4 ;k++)
{input[4*k+j]=State[j][k];
4.3、解密解密流程:
4.3.1、 逆字节替代(InvSubBytes)关键代码
与字节代替类似,逆字节代替基于逆s盒实现。直接进图逆s盒,原理很简单,与字节替 代相同,只是盒子不同void lnvSubBytes(unsigned char State[][4]){
int i,j;
for(i=0; i<4; i++)(
for(j=0; j<4; j++)State[i][j] = lnvSbox[State[i][j]];
4.3.2、 逆行移位(InvShiftRows)
87
F2
4D
97
-►
87
F2
4D
97
6E
4C
90
EC
EC
6E
4C
90
46
E7
4A
C3
4A
C3
46
E7
A6
80
D8
95
80
D8
95
A6
关键代码〃与加密时的行移位区别在于移位方向相反。即向右移动
void lnvShiftRows(unsigned char StateQ[4])(
char k;
k=State[1][3];
State[1][3]=State[1][2];
State[1][2]=State[1][1];
State[1][1]=State[1][OJ;
State[1][O]=k;
k=State[2][3];
State[2][3]=State[2][1];
State[2][1]=k;
k=State[2][2];
State[2][2]=State[2][0];
State[2][0]=k;
k=State[3][0];
State[3][0]=State[3][1];
State[3][1]=State[3][2];
State[3][2]=State[3][3];
State[3][3]=k;)
4.3.3、 逆列混合(InvMixCloumns)关键代码
〃逆列混合操作与列混合一样,只是多项式d(x)不同,因而可以表示为矩阵相乘来实现,输 入矩阵与固定矩阵(十六进制)相乘,void lnvMixColumns(unsigned char State[][4]) {
unsigned char output[4][4];
inti, j;
for(j=0; j< 4; j++)
(
for(i=0; i<4; i++)
output[i][j] = (xtime(xtime(xtime(State[i % 4][j]))) A xtime(xtime(State[i % 4][j]))Axtime(State[i % 4][j]))〃0x0E=14乘法
R (xtime(xtime(xtime(State[ (i + 1 ) % 4][j]))) A xtime(State[ (i + 1 ) % 4][j]) A State[ (i + 1 ) % 4]皿//0x0B=11 乘法
A (xtime(xtime(xtime(State[ (i + 2 ) % 4][j]))) A xtime(xtime(State[ (i + 2 ) % 4][j])) 八 Statef (i + 2)% 4][j])//0x0D=13 乘法A(xtime(xtime(xtime(State[ (i + 3 ) % 4][j]))) A State[ (i + 3 ) % 4][j]);
〃0x09乘法
)
)
for(i=0; i<4; i++)
(for(j=0; j< 4; j++)
(State[i]0]=output[i]DJ;
)
)}
434、轮密钥加(AddRoundKey)与加密完全相同
43.5.解密主函数关键代码
〃与加密函数不同的是,过程相反,根据流程图构造解密主函数,轮数相同,由于是AES本 质是对称函数,所以是相反的而己void lnvEncryption(unsigned char input。6],unsigned char Key[16])
KeyExpansion(Key,ExpandKey);unsigned char State[4][4];
for(j=0;j<4; j++)(
for(k=0; k<4 ;k++){
State[j][k] = input[k*4+j];}
)AddRoundKey(State,ExpandKey[10]);
for(i=9; i>=0; i--)(
InvShiftRows(State);InvSubBytes(State);
AddRoundKey(State, Expand Key [i]);if(i)lnvMixColumns(State);
if(i<=1)P输出最后解密两轮密钥和密文7printf(”\n第却轮密钥矩阵为:\n",10-i);
int m,n;for(m=0;m<4;m++)
(for(n=0;n<4;n++)
{printf("%X,",ExpandKey[i][n][m]);
)printf("\n");
)printf ("第%d轮解密出的消息为
for(m=0;m<4;m++)(
for(n=0;n<4;n++){
printf("%X,",State[n][m]);)
)printf ("\n");
))
printf("\n最后解密出的明文消息为:");for(int m=0;m<4;m++)
for(int n=0;n<4;n++)课程设计成绩评价表
指导老师评阅成绩表
学习与工作
态度(30%)
选题意义 (10%)
文献综 述(10%)
研究水平与设 计能力(20%)
课程设计说明说(论 文)撰写质量(20%)
设计创新(10%)
总分
指导老师签名:年 月 日
课程设计辩论记录及评价表
学生 讲述情况
教师主要 提问记录
学生回答 问题情况
辩论评分
评分工程
分值
评价参考标准
评分
总分
优
良
中
及格
差
选题意义
10
9
8
7
6
4
文献综述
10
9
8
7
6
4
研究水平与设计能力
20
19
17
15
13
10
课程设计说明书(论 文)撰写质量
20
19
17
15
13
10
设计创新
10
9
8
7
6
4
辩论效果
30
28
25
22
19
15
辩论小组成员签名
辩论小组组长签名:年 月 日
课程设计成绩评定表
成绩汇总
评分工程
评分
比例
分数
课程设计总 分
指导老师评分
50%
辩论小组评分
50%
)}
printf("\n");
for(j=0;j<4;j++)
{for(k=0; k<4 ;k++)
{input[k*4+j] = State[j][k];
}
)5.测试报告
由于加密解密分两种方式,一种是由键盘输入进行加密解密。另一种是文件读入加密解密5.1主界面
xxxxxxxxmxxxxxxxxxx亲,欢迎您使用AES加密解密软件!
请选择你所需要的功能前面的数字.我想进行加密〈密钥+明文从键盘输入〉
1 .我想进行加密〈密钥+明文从文件读入〉.我想进行解密(密钥+明文从键盘输入〉
2 .我想进行解密〈密钥+明文从文件输入〉.软件说明
3 .我不想用这个软件了,退出!
根据数字选择使用软件,下面分开测试:
5.2 测试键盘输入明文和密钥加密键盘输入1,选择加密,并输入:HoveYouYouKnow?共计16个字符,再任意输入16字符 的密钥,为方便起见,测试时,输入为1IIIII11I1111I111,最后加密成功之后输出中间密
钥与密文状态其中最后加密密文为:A 1.00, E9, BD,13,9A,CC,51,76,6A,3F,B8, AA34,6A,C
标选择的是:加密一一(密钥♦明文从键盘输入)请领入他所需要处理的16位的明文:I LoueVouVouKnow?
[尔输入的消息为:I LoueVouVouKnow?
请撤入你所需要处理的16位的密钥:[尔输入的消息为:
第9轮加密密钥矩阵为:
F8,39,27,BB,DB,28,7,F9,
90,46,36.3E,57,56,6,8C,
第9轮加密出的密文为:9C,46,65,D4,20,B9,E9,6E,F6,AE,62,89,12,48,97,8D,第1。轮加密密钥矩阵为:
7F,56,43,E0,A4,7E,44,19,
34,38,72,27,63,6E,74,AB,
第1。抡加密出的密文为:A1,0,E9,BD,13,9A,CC,51,76,6A,3F,B8,AA,34,6A,C,测试键盘输入密文和密钥加密
选择3,进入解密界面。为测试是否成功加密,采用上次加密时的密文进行输入,如图结果 说明加密解密是成功的。
:尔选择的是:解密一一《密钥♦密文从键盘输入〉请输入你所需要处理的16位的密文《16进制>:A100E9BD139ACC51766A3FB8Afi346A0C 你输入的消息为:A1 0 E9 BD 13 9A CC 51 76 6A 3F B8 AA 34 6A C
请输入你所需要处理的16位的密钥:
你输入的消息为:iiiiiiiiiiiiiiii第9轮密钥矩阵为:
F7,F6,F6,F6,C6,C7,C7,C7,
F7,F6,F6,F6,C6,C7,C7,C7,
第 9 轮解密出的消息为:BC-45,1B,AB,20,58,5A,A0,45,58,58,1B,CF,FF,58,DA,第1。轮密钥矩阵为:
31,31,31,31,31,31,31,31,
31,31,31,31,31,31,31,31,
第 10轮解密出的消息为:49,4C,6F,6,65,59,6F,5,59,6P,5,4B,6E,6F,77,3F,最后解密出的明文消息为:I LoueYouVouKnow?
1.3 测试文件输入明文和密钥加密〃选择2进入文件加密界面,输入保存有明文的文件名:Mingwen.lxt.密钥文件名:Key.txt 输出到空文件State.txt中进行保存
2你选择的是:加宙——《密钥♦明文从文件输入)
遁领人襄翻开明文文件名:Mingwen.txt读入的数据为:X,X,I
适碗及费打皆密钥文件名:Key.txt读入的数据为:i,c,a,n,t,s,t,o,p,l,o,v,e,y,o,u 第9轮加密密钥矩阵为: DF,43,81,53,
6D.4F,C7.E5,5,41,71,8A,
DD,15,D0,A0,第9轮加密出的密文为:1C,4B,11,F7,C3,21,DD,E0,11,B,E9,5F,C4,29,7B,9C,
第1。轮加定密钥矩阵为:
80,33,61,92,DD-7C-A6-77,
D8.3D-D7.FD.
5,28,7,5D,第10轮加宙出的密文为:2C,CE,7F,4C,F3,57,87,1F,5A,98,55,1C,19,9B,C6,92,
留文已经输入到外部硬盘上的State, txt文件上测试文件输入密文和密钥加密
〃选择4进入界面解密,同理,为检验是否加密成功,采用上次加密时密文输出到State.txt 上的密文进行解密,密钥文件相同,与上图相比,结果正确。解密成功!
你选择的是:解密〈密钥+定文从文件输入)谓懒△襄翻开明文文件名:State.txt
读入的数据为:,,?△,L,?W,?T,Z,?U,*-,!,???
道顿△塞尹■拉密钥文件名:Key.txt读入的数据为:i,c,a,n,t,s,t,o,p,l,o,v,e,sr,o,u.
第9轮密钥矩阵为:
DE,CB,FC,23, AA,B8,88,4C, DA,D4,E7,3A, BF,AD,88,4F,第9轮解密出的消息为:C7,C9,63,63,82,B7,63,EB,1,B7,34,7B,63,E2,AD,63,
第1。抡密钥矩阵为:
69,63,61,6E,74,73,74,6F,
70,6C,6F,76,65,79,6F,75, 第10抡解超出的消息为:58,58,49,52,65,61,6C,6C,79,4C,6F,76,65,59,6F<,75J, 最后解密出的明文消息为:X XIReallyLoveVou
1.4 软件说明是为注明信息而设置,说明版权,可省略,
“软件说明找
成都信息工程学院网络工程学院
信息对抗技术工。级工班
樊培
实践就可以改变世界!努力吧!
2012年6月10日.课程设计报告总结
这次课程设计我最大的收获就是凡事都要自己动手去做,有些事情自己不做,啥子都不会, 有畏惧感,害怕,始终把事情放在那,就形成恶性循环,这样子一直都做不来,一直都不会 有进步,所以不管什么事情都要亲自去尝试一下,难易程度自己感知,不要听信他人的谣言, 或者误导,以为怎么怎么样。
还有就是,做代码的时候查阅了相关的书籍,很杂很乱,这对于选择有用的材料,有 价值的材料进行使用,会提高效率,最开始各种涉猎,很多,但是实用的却没有多少,白白 耽误了很多时间。我觉得还是首先了解全局,了解总体,高屋建领,做好准备工作,写好报 告,把每个过程搞懂了,才能动手去写代码,连基本的理论都不懂,就去操作,实在是慢, 当然在了解的基础上,也要去实践,去检验自己的做法是否是对的,不能光搞理论,计算机 是一个动手就得答案的科学,多检验,多算,多观察。这样子影响更深,更不会忘,一辈子 的经验,自己动手得到的答案,远比查阅资料了解来的有意义,有效果。
在写代码的时候参考了一些参考资料,发现一些牛人啊,他们写的代码简介,精炼,确 实让人敬佩,我用很多行代码实现的功能,别人两三句循环就解决了,主要是平时没怎么编 写代码,没有经验,还是要多写代码,多领悟,才能有他们的成就。而且我简介的代码都是 很好的数学算法,我学的数学没怎么用在这个上面,不能直接用最低级的算法,最普通的算 法,这样子永远不能简化,要简化就要用一些数学算法,下标改变啊,循环啊啥的这些可以 实现意想不到的效果,实现功能和简介的双重母的。多实践!
最后我要感谢解放军信息工程大学的寻者,寻者是他的昵称,在我调试过程中,他给了 我很大的帮助,真心的不知道说什么,我有很多的问题都是询问他解决的,而且那天他花了 一整晚上的时间和我一起探讨,一起专研,帮我调试,这对于目前一个物质社会,节奏超快 的社会,我真心感觉好幸运,好人还是多,这就坚定了我要做好人的决心。助人为乐,真心 感觉很好!特别是那些在需要中的人们是、多么期盼的帮助。帮助别人就是帮助自己,万分 感谢寻者!致敬!
6 .参考文献
u ] TJ
12 3
rL rl fL
谭浩强.C程序设计(第三版).北京:清华大学出版社,2005
张仕斌.张金全等.应用密码学.西安电子科技大学出版社,2009
寻者 .AES 力IJ密算法 C++. htlp:// cnblogs. com/mingcn/archive/2010/I0/31/aes c. htm 1/2010/10/30附录资料:不需要的可以自行删除
Abstract: Based on the comprehensive analysis on the plastic part's structure service requirement, mounding quality and mould menu factoring cost. A corresponding injection mould of internal side core pulling was designed. By adopting the multi-direction and multi-combination core-pulling. A corresponding injection mould of internal side core pulling was designed, the working process of the mould was introduced C语言详解-枚举类型注:以下全部代码的执行环境为VC++ 6.0
在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这 项工作,您的代码可能是:
# define MON 1dcfinc TUE 2
# define WED 3define THU 4
# define FRI 5define SAT 6
# define SUN 7在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。
1 .定义一种新的数据类型-枚举型
以下代码定义了这种新的数据类型-枚举型enum DAY
(
MON=1,TUE, WED, THU, FRI, SAT, SUN1;
(I)枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
2 2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。
(3)第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加h(4)可以人为设定枚举成员的值,从而自定义某个范围内的整数。
(5)枚举型是预处理指令#dcflnc的替代。
(6)类型定义以分号;结束。
2 .使用枚举类型对变量进行声明新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float,双精度浮点型double,字符型char,短整型short等等。用这些基本数据 类型声明变量通常是这样:
char a; 〃变量a的类型均为字符型charcharletter;
int x,y,
z; 〃变量x,y和z的类型均为整型intint number;
double m, n;double result; 〃变量result的类型为双精度浮点型double
既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。
方法一:枚举类型的定义和变量的声明分开enum DAY
(
MON= 1, TUE, WED, THU, FRI, SAT, SUN};
enum DAY yesterday;enum DAY today;
enum DAY tomorrow; 〃变显 tomorrow 的类型为枚举型 enum DAYenum DAY good_day, bad_day; //变量 good_day 和 bad_day 的类型均为枚举型 enum DAY 方法二:类型定义与变量声明同时进行:
enum 〃跟第一个定义不同的是,此处的标号DAY省略,这是允许的。
Saturday, sunday = 0, monday, tuesday, Wednesday, thursday,
friday} workday; //变量workday的类型为枚举型enum DAY
cnum week { Mon=l, Tuc, Wed, Thu, Fri Sat, Sun} days; 〃变最 days 的类型为枚举型 enum weekcnum BOOLEAN { false, true } cnd_flag, match_flag; 〃定义枚举类型并声明了两个枚举型变 量
方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:
typedef enum workday (Saturday, sunday = 0, monday, tuesday, Wednesday, thursday, friday
} workday;//此处的workday为枚举型enum workday的别名workday today, tomorrow; 〃变量 today 和 tomorrow 的类型为枚举型 workday,也即 enum workday
cnum workday 中的 workday 可以省略:
typedef enum (Saturday, sunday = 0, monday, tuesday, Wednesday, thursday, friday
} workday; //此处的workday为枚举型enum workday的别名workday today, tomorrow; 〃变量 today 和(oinorrow 的类型为枚举型 workday,也即 enum workday 也可以用这种方式:
typedef enum workday (Saturday, sunday = 0, monday, luesday, Wednesday,
thursday, fridayI;
workday today, tomorrow; 〃变量 today 和 tomorrow 的类型为枚举型 workday,也即 cnum workday注意:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常 量。错误例如如下所示:
错误声明一:存在同名的枚举类型typedef enum (
Wednesday, thursday, friday } workday;typedef enum WEEK (
Saturday, sunday = 0, monday, } workday;错误声明二:存在同名的枚举成员
typedef enum {
Wednesday, thursday, friday } workday. 1;typedef enuin WEEK (
Wednesday, sunday = 0, monday, } workday_2;.使用枚举类型的变量
2.1 对枚举型的变量赋值。
实例将枚举类型的赋值与基本数据类型的赋值进行了比照:
方法一:先声明变量,再对变量赋值#include<stdio.h>
/*定义枚举类型*/cnum DAY { MON=1,TUE, WED, THU, FRI, SAT, SUN };
void main()(
/*使用基本数据类型声明变量,然后对变量赋值*/
int x, y, z;
x= 10;
y = 20; z = 30;
/*使用枚举类型声明变量,再对枚举型变量赋值*/
enuin DAY yesterday, today, tomorrow;
yesterday = MON;
today = TUE;
tomorrow = WED;
printf("%d %d %d \n", yesterday, today, tomorrow);)
方法二:声明变量的同时赋初值#include <stdio.h>
/*定义枚举类型*/enum DAY { MON=1,TUE, WED, THU, FRI, SAT, SUN };
void main()(
/*使用基本数据类型声明变量同时对变量赋初值*/
int x=10, y=20, z=30;
/*使用枚举类型声明变量同时对枚举型变量赋初值*/
enum DAY yesterday = MON,today = TUE,
tomorrow = WED;
printf("%d %d %d \n", yesterday, today, tomorrow);}
方法三:定义类型的同时声明变量,然后对变量赋值。
#include <stdio.h>/*定义枚举类型,同时声明该类型的三个变量,它们都为全局变量*/
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } yesterday, today, tomorrow;/*定义三个具有基本数据类型的变量,它们都为全局变量*/
int x, y, z;void main()
(
/*对基本数据类型的变量赋值*/
x= 10; y = 20; z=30;
/*对枚举型的变量赋值*/
yesterday = MON;
today =TUE;
tomorrow = WED;
printf("%d %d %d \n", x, y, z); 〃输出:10 20 30
printf("%d %d %d \n'\ yesterday, today, tomorrow); 〃输出:I 2 3}
方法四:类型定义,变量声明,赋初值同时进行。
#include <stdio.h>/*定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量*/
enum DAY{
MON=1,
TUE,
WED.
THU,
FRI,
SAT,
SUN yesterday = MON, today = TUE, tomorrow = WED;目录
1、选题背景42、设计的目标4
2.1 基本目标:4
2.2 较高目标:53、功能需求分析5
4、模块划分6
4.1、 密钥调度6
4.2、 加密8
4.2.1、 字节代替(SubBytes) 8
4.2.2、 行移位(ShiftRows) 10
4.2.3、 列混合 (MixColumn) 11
4.2.4、 轮密钥加 (AddRoundKey) 13
4.2.5、 加密主函数14
4.3、 解密16
4.3.1、 逆字节替代(IrwSubBytes) 16
4.3.2、 逆行移位 (InvShiftRows) 17
4.3.3、 逆歹U混合(InvMixCloumns) 17
4.3.4、 轮密钥加(AddRoundKey) 18
4.3.5、 解密主函数18.测试报告20
5.1 主界面20
5.2 测试键盘输入明文和密钥加密20
5.3 测试键盘输入密文和密钥加密21
5.4 测试文件输入明文和密钥加密22
5.5 测试文件输入密文和密钥加密22
5.6 软件说明23.课程设计报告总结23
6 .参考文献24/*定义三个具有基本数据类型的变量,并赋初值。它们都为全局变量*/
int x = 10, y = 20, z = 30;void main()
(
printf("%d %d %d \n”, x, y, z); //输出:1020 30
printf("%d %d %d \n", yesterday, today, tomorrow); 〃输出:1 2 3)
1.2 对枚举型的变量赋整数值时,需要进行类型转换。
#include <stdio.h>enum DAY { MON= I, TUE, WED, THU, FRI, SAT, SUN };
void main()(
enum DAY yesterday, today, tomorrow;
yesterday = TUE;
today = (enum DAY) (yesterday + 1); 〃类型转换
tomorrow = (enum DAY) 30; 〃类型转换
//to
展开阅读全文