1 / 24
文档名称:

AES原理及其在c语言上的实现.doc

格式:doc   大小:238KB   页数:24页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

AES原理及其在c语言上的实现.doc

上传人:木木在江边 2023/3/28 文件大小:238 KB

下载得到文件列表

AES原理及其在c语言上的实现.doc

文档介绍

文档介绍:该【AES原理及其在c语言上的实现 】是由【木木在江边】上传分享,文档一共【24】页,该文档可以免费在线阅读,需要了解更多关于【AES原理及其在c语言上的实现 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。工程施工
工程施工
工程施工
AES加密解密算法及其在c语言上的实现
引言
对称密码算法主要用于保证数据的机密性,通信双方在加密/,密码学界已经对它们进行了深入的研究[1]。最常用的对称密码算法是数据加密标准(DES)算法,它是由IBM在美国国家安全局(NSA)授意之下研制的一种使用56位密钥的分组密码算法。自1977年公布成为美国政府的商用加密标准以来已使用20多年[2]。DES的主要问题是其密钥长度较短,,最后一次在1998年美国政府终于决定不再继续延用DES作为联邦加密标准,也就表明了DES将退出加密标准的舞台,而新的标准AES(AdvancedEncryptionStandard)将粉墨登场[3].AES是美国国家标准技术研究所NIST旨在取代DES的新一代的加密标准[3~5]。NIST对AES候选算法的基本要求是:对称分组密码体制;密钥长度支持128,192,256位;明文分组长度128位;算法应易于各种硬件和软件实现。1998年NIST开始AES第一轮征集、分析、测试,共产生了15个候选算法。1999年3月完成了第二轮AES的分析、(MARS,RC6,Rijndael,Serpent,Twofish)成为候选算法。最后,Rijn2dael[5],这个由比利时人设计的算法与其它候选算法在成为高级加密标准(AES)的竞争中取得成功,于2000年10月被NIST宣布成为取代DES的新一代的数据加密标准,即AES。尽管人们对AES还有不同的看法[6~8],但总体来说,Rijndael作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。AES设计有三个密钥长度:128,192,256比特,相对而言,AES的128比特密钥比DES的56比特密钥强1021倍[4].
AES加密/解密算法原理
对称密码算法根据对明文消息加密方式的不同可分为两大类,即分组密码和流密码。分组密码将消息分为固定长度的分组,输出的密文分组通常与输入的明文分组长度相同。AES算法属于分组密码算法,它的输入分组、输出分组以及加/解密过程中的中间分组都是128比特。密钥的长度K为128,192或256比特。用Nk=4,6,8代表密钥串的字数(1字=32比特),(加密轮数与密钥长度的关系见表1)。每一轮都需要一个和输入分组具有同样长度(128比特)的扩展密钥Ke的参与。由于外部输入的加密密钥K长度有限,所以在AES中要用一个密钥扩展程序(KeyExpansion)把外部密钥K扩展成更长的比特串,以生成各轮的加密密钥。AES的加密与解密框图如图1所示。
工程施工
工程施工
工程施工
128位数据分组
128位数据分组

与扩展秘钥的异或运算
与扩展秘钥的异或运算
反S盒变换
S盒变换
反行变换变换
行变换变换
列变换变换
反列变换变换
与扩展秘钥的异或
与扩展秘钥的异或
S盒变换
反S盒变换
行变换
反行变换
输出128位数据
与扩展秘钥的异或运算
输出128位数据
与扩展秘钥的异或运算
AES加密与解密流程图
工程施工
工程施工
工程施工
(1)加密变换
设X是AES的128比特明文输入,Y是128比特的密文输出,则AES密文Y可以用下面的复合变换表示:
Y=Ak(r+1)·R·S·Akr·C·R·S·Ak(r21)·⋯·C·R·S·Ak1(X)
其中“·”:表示对X的一个变换Aki(X)=XÝKi(Ki为第i轮的子密钥,为比特串的异或运算)。S:S盒置换。。R:行置换。C:列置换.
这里是特殊的乘法运算,将在下面详细介绍。
(2)解密变换
解密变换是加密变换的逆变换,这里不再详述。
AES加密/解密算法的实现
分组加密
表1是三种不同类型的AES加密密钥分组大小与相应的加密轮数的对照表。加密开始时,输入分组的各字节按表2的方式装入一个矩阵State中。如输入ABCDEFGHIJKLMNOP,则输
入块影射到如表2的状态矩阵State中。
表1
AES类型
秘钥长度
分组大小
加密轮数
AES-128
4字
4字
10
AES—192
6字
4字
12
AES-256
8字
4字
14字
表2
A
E
I
M
B
F
J
N
C
C
A
O
D
H
L
P
(),ShiftRows(),MixColumns()和Ad2dRounKey()将在接下来的部分介绍,密钥扩展程序(KeyExpansion)将在下面介绍。
Cipher(bytein[434],byteout[434],wordw[43(Nr+1)])
begin
bytestate[4,4]
state=in;
工程施工
工程施工
工程施工
AddRoundKey(state,w) //SeeSec。。4
forround=1step1toNr21
SubBytes(state) //。1。1
ShiftRows(state) //SeeSec。3。
MixColumns(state) //SeeSec。3。1。3
AddRoundKey(state,w+round34)
endfor
SubBytes(state)
ShiftRows(state)
AddRoundKey(state,w+Nr34)
out=state
end
S盒变换SubBytes()
对输入矩阵的任一个元素A做如下变换S[A]:(1)。如A=11010100时,x=c,y=4。(2)从AES算法给定的S2Box(16行16列的矩阵,其中每个元素为一个字节,具体的S2Box略)中找出S[A]=S[x,y]=11010100时,S[A]=S[x,y]=S[c,4]={1c}=00011101。或直接通过下面的公式将A=b7b6b5b4b3b2b1b0变为S[A]=b’7b’6b’5b’4b'3b’2b’1b’0。这里c=(c0,c1,c2,c3,c4,c5,c6,c7)=(0,1,1,0,0,0,1,1)。
行变换ShiftRows()
在行变换中,中间状态矩阵State的第一行不变;第二至第四行做如下变换,即将表3的状态矩阵变为表4的状态矩阵。
表3
A1
A2
A3
A4
B1
B2
B3
B4
C1
C2
C3
C4
D1
D2
D3
D4
变换为
表4
A1
A2
A3
A4
B2
B3
B4
B1
C3
C4
C1
C2
D4
D1
D2
D3
列变换MixColumns()
列变换是对中间状态矩阵State逐列进行变换。其变换为如下的矩阵运算:
工程施工
工程施工
工程施工
经过上面的运算,原来的一列就被替换成下面的式子所表达的新列:
S(0,c)′=({02}×S(0,c))({03}×S(1,c))S(2,c)S(3,c)
S(1,c)′=S(0,c)({02}×S(1,c))({03}×S(2,c))S(3,c)
S(2,c)′=S(0,c)S(1,c)({02}×S(2,c))({03}×S(3,c)
S(3,c)′=({03}×S(0,c))S(1,c)S(2,c)({02}×S(3,c))
这里为按位异或运算,其中的乘法×按照下面介绍的模乘同余规则进行计算.
列变换中要用到的模乘同余规则和我们一般用到的乘法有些不同,由于每一个元素都是一个字节,于是可把这个字节看成一个形式上的七次多项式,即将b7b6b5b4b3b2b1b0视为b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x+b0,如{11011001}2={d9}16可以被看成是x7+x6+x4+x3+1。列变换希望把一个字节变换为一个新的字节,所以需要把两个形式上的七次多项式的乘法结果变为一个新的形式上的七次多项式,然后才能将其恢复为一个字节的长度。这里采用模一个八次不可约多项式的同余乘法,即将两七次多项式的乘法结果除以这个八次不可约多项式再取其余式。在AES中这个八次不可约多项式为m(x)=x8+x4+x3+x+1。例如:(x6+x4+x2+x+1)×(x7+x+1)=x13+x11+x9+x8+x6+x5+x4+x3+1(x13+x11+x9+x8+x6+x5+x4+x3+1)mod(x8+x4+x3+x+1)=x7+x6+1对应为{57}×{83}={c1}。
与扩展密钥的异或运算AddRoundKey()
扩展密钥只参与了这一个变换。根据加密的轮数用相应的扩展密钥的四个数据项和中间状态矩阵上的列进行按位异或。[S(0,c)′,S(1,c)′,S(2,c)′,S(3,c)′]=[S(0,c),S(1,c),S(2,c),S(3,c)]XOR[W(round×nb+c)]
密钥扩展程序KeyExpansion
AES算法利用外部输入密钥K(密钥串的字数为Nk),通过密钥扩展程序得到共4(Nr+1)字的扩展密钥w[4×(Nr+1)]。涉及如下三个模块:
(1)位置变换RotWord()。把一个四个字节的序列[a0,a1,a2,a3]左移一个字节变为[a1,a2,a3,a0].(2)SubWord()。对一个四字节的输入字[a0,a1,a2,a3]的每一个字节进行S盒变换,然后作为输出(见31111)。
(3)变换Rcon[]。Rcon[i]表示32比特字符串[xi21,00,00,00]。例如,Rcon[1]=[01000000],Rcon[2]=[02000000],Rcon[3]=[04000000],Rcon[4]=[08000000],⋯,Rcon[10]=[36000000].(4)扩展密钥的生成。扩展密钥的前Nk个字就是外部密钥K;以后的字w[[i]]等于它前一个字w[[i21]]与前第Nk个字w[[i2Nk]]的异或,即w[[i]]=w[[i21]]XORw[[i2Nk]]。但是若i为Nk的倍数,则w[i]=w[i2Nk]XORSubWord(RotWord(w[[i21]]))XORRcon[i/Nk].
举例:
①设外部输入的加密密钥CipherKey=2b7e1516
28aed2a6abf7158809cf4f3c
Nk=4,则w0=2b7e1516w1=28aed2a6w2=abf71588w3=09cf4f3c;
工程施工
工程施工
工程施工
w4=w0XORSubWord(RotWord(w3))XORRcon[4/Nk]=a0fafe17;
w5=w[[i21]]XORw[[i2Nk]=w[[4]]XORw[[1]]=88542cb1;⋯
w43=b6630ca6.
②输入明文:00112233445566778899aabbccddeeff;
输入密钥:000102030405060708090a0b0c0d0e0f
各轮密文:
round[0]。input00112233445566778899aabbccddeeff;
round[0]。ksch000102030405060708090a0b0c0d0e0f
round[1]。start00102030405060708090a0b0c0d0e0f0

round[10].output69c4e0d86a7b0430d8cdb78070b4c55a
OUTPUT:69c4e0d86a7b0430d8cdb78070b4c55a
对文件的加密/解密
在完成了DES分组加密算法实现的基础上,现在利用密文分组链接(CBC)方式将其用于对文件的加密/解密(密钥长度可选),程序的操作步骤如下:(1)根据文件处理方式选择模块,选择对文件加密、对文件解密或是退出程序。(2)输入密钥K的长度(128比特、192比特、256比特)和密钥.(3)用密钥扩展程序对密钥加以扩展。128比特、192比特、256比特密钥分别对应KeyExpansion128(key),KeyExpansion192(key),KeyExpansion256(key),分别生成
72bytes,204bytes,236bytes的扩展密钥。(4)创建加密/解密文件。文件都是以文本格式存
储的。(5)从等待加密/解密文件中取出16字节。若是未取出16个字节文件就结束,(STATE)中。(6)根据密钥的长度对STATE中的数据进行加密/、192比特、256比特分别对应Cipher128(InvCipher128),Cipher192(InvCipher192),Cipher256(In2vCipher256).并把加密/解密后的数据保存在STATE中。把STATE中的数据写入加密/解密文件中。(7)如果等待加密/解密的文件已经结束,则关闭文件,回到操作(1);否则回到操作(5)。这样程序就实现了对一个文件的加密/解密操作。
结束语
本文在研究分析了AES加密原理的基础上着重说明了AES算法实现的具体步骤,包括扩展密钥的异或运算、AddRoundKey()、列变换MixColumns()、行变换ShiftRows()、S盒变换SubBytes()等,以及各步骤的轮换顺序和最重要的密钥扩展程序KeyExpansion等,并用C语言完整地实现了AES算法。
工程施工
工程施工
工程施工
AES在C语言上实现程序
#include<>
#include<stdio。h>
#ifndefuint8
#defineuint8unsignedchar
#endif
#ifndefuint32
#defineuint32unsignedlongint
#endif
typedefstruct
{
uint32erk[64];/*encryptionroundkeys*/
uint32drk[64];/*decryptionroundkeys*/
intnr;/*numberofrounds*/
}
aes_context;
//#defineTEST
/*uncommentthefollowinglinetousepre-computedtables*/
/*otherwisethetableswillbegeneratedatthefirstrun*/
/*#defineFIXED_TABLES*/
#ifndefFIXED_TABLES
/*forwardS—box&tables*/
uint32FSb[256];
uint32FT0[256];
uint32FT1[256];
uint32FT2[256];
uint32FT3[256];
/*reverseS—box&tables*/
uint32RSb[256];
uint32RT0[256];
uint32RT1[256];
uint32RT2[256];
uint32RT3[256];
/*roundconstants*/
工程施工
工程施工
工程施工
uint32RCON[10];
/*tablesgenerationflag*/
intdo_init=1;
/*tablesgenerationroutine*/
#defineROTR8(x)(((x<<24)&0xFFFFFFFF)|\
((x&0xFFFFFFFF)>〉8))
#defineXTIME(x)((x<〈1)^((x&0x80)?0x1B:0x00))
#defineMUL(x,y)((x&&y)?pow[(log[x]+log[y])%255]:0)
voidaes_gen_tables(void)
{
inti;
uint8x,y;
uint8pow[256];
uint8log[256];
/*computepowandlogtablesoverGF(2^8)*/
for(i=0,x=1;i〈256;i++,x^=XTIME(x))
{
pow[i]=x;
log[x]=i;
}
/*calculatetheroundconstants*/
for(i=0,x=1;i〈10;i++,x=XTIME(x))
{
RCON[i]=(uint32)x〈〈24;
}
/*generatetheforwardandreverseS—boxes*/
FSb[0x00]=0x63;
RSb[0x63]=0x00;
for(i=1;i<256;i++)
{
工程施工
工程施工
工程施工
x=pow[255-log[i]];
y=x;y=(y<〈1)|(y〉〉7);
x^=y;y=(y〈〈1)|(y〉〉7);
x^=y;y=(y<<1)|(y>〉7);
x^=y;y=(y〈<1)|(y>〉7);
x^=y^0x63;
FSb[i]=x;
RSb[x]=i;
}
/*generatetheforwardandreversetables*/
for(i=0;i〈256;i++)
{
x=(unsignedchar)FSb[i];y=XTIME(x);
FT0[i]=(uint32)(x^y)^
((uint32)x<<8)^
((uint32)x<〈16)^
((uint32)y<〈24);
FT0[i]&=0xFFFFFFFF;
FT1[i]=ROTR8(FT0[i]);
FT2[i]=ROTR8(FT1[i]);
FT3[i]=ROTR8(FT2[i]);
y=(unsignedchar)RSb[i];
RT0[i]=((uint32)MUL(0x0B,y))^
((uint32)MUL(0x0D,y)<<8)^
((uint32)MUL(0x09,y)〈<16)^
((uint32)MUL(0x0E,y)〈<24);
RT0[i]&=0xFFFFFFFF;
RT1[i]=ROTR8(RT0[i]);
RT2[i]=ROTR8(RT1[i]);
RT3[i]=ROTR8(RT2[i]);
}
}
工程施工
工程施工
工程施工
#else
/*forwardS-box*/
staticconstuint32FSb[256]=
{
0x63,0x7C,0x77,0x7B,0xF2,0x6B,0x6F,0xC5,
0x30,0x01,0x67,0x2B,0xFE,0xD7,0xAB,0x76,
0xCA,0x82,0xC9,0x7D,0xFA,0x59,0x47,0xF0,
0xAD,0xD4,0xA2,0xAF,0x9C,0xA4,0x72,0xC0,
0xB7,0xFD,0x93,0x26,0x36,0x3F,0xF7,0xCC,
0x34,0xA5,0xE5,0xF1,0x71,0xD8,0x31,0x15,
0x04,0xC7,0x23,0xC3,0x18,0x96,0x05,0x9A,
0x07,0x12,0x80,0xE2,0xEB,0x27,0xB2,0x75,
0x09,0x83,0x2C,0x1A,0x1B,0x6E,0x5A,0xA0,
0x52,0x3B,0xD6,0xB3,0x29,0xE3,0x2F,0x84,
0x53,0xD1,0x00,0xED,0x20,0xFC,0xB1,0x5B,
0x6A,0xCB,0xBE,0x39,0x4A,0x4C,0x58,0xCF,
0xD0,0xEF,0xAA,0xFB,0x43,0x4D,0x33,0x85,
0x45,0xF9,0x02,0x7F,0x50,0x3C,0x9F,0xA8,
0x51,0xA3,0x40,0x8F,0x92,0x9D,0x38,0xF5,
0xBC,0xB6,0xDA,0x21,0x10,0xFF,0xF3,0xD2,
0xCD,0x0C,0x13,0xEC,0x5F,0x97,0x44,0x17,
0xC4,0xA7,0x7E,0x3D,0x64,0x5D,0x19,0x73,
0x60,0x81,0x4F,0xDC,0x22,0x2A,0x90,0x88,
0x46,0xEE,0xB8,0x14,0xDE,0x5E,0x0B,0xDB,
0xE0,0x32,0x3A,0x0A,0x49,0x06,0x24,0x5C,
0xC2,0xD3,0xAC,0x62,0x91,0x95,0xE4,0x79,
0xE7,0xC8,0x37,0x6D,0x8D,0xD5,0x4E,0xA9,
0x6C,0x56,0xF4,0xEA,0x65,0x7A,0xAE,0x08,
0xBA,0x78,0x25,0x2E,0x1C,0xA6,0xB4,0xC6,
0xE8,0xDD,0x74,0x1F,0x4B,0xBD,0x8B,0x8A,
0x70,0x3E,0xB5,0x66,0x48,0x03,0xF6,0x0E,
0x61,0x35,0x57,0xB9,0x86,0xC1,0x1D,0x9E,
0xE1,0xF8,0x98,0x11,0x69,0xD9,0x8E,0x94,
0x9B,0x1E,0x87,0xE9,0xCE,0x55,0x28,0xDF,
0x8C,0xA1,0x89,0x0D,0xBF,0xE6,0x42,0x68,
0x41,0x99,0x2D,0x0F,0xB0,0x54,0xBB,0x16
};
/*forwardtables*/
#defineFT\
\