信安报告.docx

上传人:b****9 文档编号:26395919 上传时间:2023-06-18 格式:DOCX 页数:46 大小:528.05KB
下载 相关 举报
信安报告.docx_第1页
第1页 / 共46页
信安报告.docx_第2页
第2页 / 共46页
信安报告.docx_第3页
第3页 / 共46页
信安报告.docx_第4页
第4页 / 共46页
信安报告.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

信安报告.docx

《信安报告.docx》由会员分享,可在线阅读,更多相关《信安报告.docx(46页珍藏版)》请在冰豆网上搜索。

信安报告.docx

信安报告

信息安全—AES加解密算法

 

班级:

08108

使用说明

(一)密钥

在代码中密钥数组定义处,直接输入密钥数组。

即在unsignedcharkey[]中输入密钥。

例如:

unsignedcharkey[]=

{

0x2b,0x7e,0x15,0x16,

0x28,0xae,0xd2,0xa6,

0xab,0xf7,0x15,0x88,

0x09,0xcf,0x4f,0x3c

};

(二)明文

在代码中输入数组定义处,直接输入明文。

(1)数字明文:

可以直接将128位明文打入unsignedcharinput[]中

例如:

unsignedcharinput[]=

{

0x32,0x43,0xf6,0xa8,

0x88,0x5a,0x30,0x8d,

0x31,0x31,0x98,0xa2,

0xe0,0x37,0x07,0x34

};

(2)字符串明文

可以直接将字符串明文打入charstr[32]中,字符个数应不大于32个

例如:

charstr[32]="Hello,MyAESCipher!

";

(三)密文

可以将要解密的密文打入unsignedcharinput2[]中

例如:

unsignedcharinput2[]=

{

0x25,0x27,0xf6,0xa8,

0x88,0x5a,0x30,0x8d,

0x31,0x31,0x98,0xa2,

0xe0,0x37,0x07,0x34

};

(四)运行

运行.cpp文件,即可依次执行加密和解密过程,并依次显示输入明文,加密后的密文,待解密的密文和解密后的明文,以验证加解密过程正确。

本程序为用户提供了分开的加解密过程。

即可同时求得非配对的明文所对应密文和密文所对应明文。

设计文档

一、背景知识

AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。

AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,因此,128位AES的加密强度是56位DES加密强度的1021倍还多。

假设可以制造一部可以在1秒内破解DES密码的机器,那么使用这台机器破解一个128位AES密码需要大约149亿万年的时间。

1998年NIST开始AES第一轮分析、测试和征集,共产生了15个候选算法。

1999年3月完成了第二轮AES2的分析、测试。

2000年10月2日美国政府正式宣布选中比利时密码学家JoanDaemen和VincentRijmen提出的一种密码算法RIJNDAEL作为AES。

在应用方面,尽管DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES。

但是DES迟早要被AES代替。

流密码体制较之分组密码在理论上成熟且安全,但未被列入下一代加密标准。

  

AES加密标准已经解决了DES加密算法遭受攻击出现的漏洞,而且具有更高的效率,在AVR单片机Bootloader的应用中得到较广泛的应用。

AES Bootloader的特点是:

1.应用简单,加密性高,可以有128,192,256位的加密匙;

2.代码小,用IAR编译,小于2K;

3.传送速度快;

例如:

  64K的代码,在波特率采用115200bps,系统时钟3.69MHz下,

-AES128:

 27

-AES192:

 30

-AES256:

 33

二、需求分析

在信息社会飞速发展的今天,信息安全也变得尤为重要。

早在古代时期,人们就研制了各种加密算法,以保护信息的安全可靠。

1972年IBM公司研制出DataEncryptionStandard(DES)加解密算法时,就轰动了全球,从此DES被广泛使用在各种领域。

随着科技的快速发展,用电脑破解DES变得越来越简单,从各方面看,DES已经走到了他的生命尽头。

其56比特的密钥实在太小,虽然三重DES可以解决密钥长度的问题,但是DES的设计主要针对硬件实现,而今在许多领域,需要用软件方法来实现它,在这种情况下,他的效率相对低下。

鉴于此,1997年4月15日美国国家标准和技术研究所(NIST)发起征集AdvancedEncryptionStandard(AES)算法的活动,并成立了AES工作组。

目的是为了确定一个非保密的,公开披露的,全球免费使用的加密算法,用于保护下一世纪政府的敏感信息。

从起名称即可看出,这是对DES算法的改进。

对AES市场提出了四个基本要求:

(1)比三重DES快。

(2)至少与三重DES一样安全。

(3)数据分组长度为128比特。

(4)密钥长度为128/192/256比特。

经过量化和定性的尺度评选标准的评选后,选中了Rijndael算法,他是如此安全,以至于在密码方面最内行的美国国家安全局也决定将用它来保护一些关键数据不被窥视。

AES的显著特性为:

(1)对所有已知攻击免疫。

(2)在各种平台上,执行速度快而且代码紧凑。

(3)设计简单。

而这正是我们的时代所急需的保密算法应具有的优点与特征。

当前的大多数分组密码,其轮函数是Feistel结构,即将中间状态的部分比特不加改变地简单放置到其他位置。

而AES算法没有使用这个结构,而是在每一轮都使用代换和混淆并行的处理整个数据分组,已达到更为可靠得加密算法。

他仅仅在论密钥加阶段使用密钥,因此,算法的开始和结束都有轮密钥加阶段。

轮密钥加实质是一种Vername密码形式,本身不难破解,但另外的3各阶段一起提供了混淆、扩散以及非线性功能,综合在一起安全有效。

而其每个阶段都可逆,对其解密使用逆函数即可,原理为

,所以设计简单用于实现。

因此,AES现在已经占领了密码界中老大的地位,是现在所使用的最安全,最快速,最简单,最广泛的加解密算法。

其重要性可见一斑,而我们学习这种算法也正是大势所趋。

三、AES总体设计及框图

AES加密数据块和密钥长度可以是128比特、192比特、256比特中的任意一个。

AES加密有很多轮的重复和变换。

大致步骤如下:

1、密钥扩展(KeyExpansion),2、初始轮(InitialRound),3、重复轮(Rounds),每一轮又包括:

SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(FinalRound),最终轮没有MixColumns。

本代码实现128比特的AES加密算法。

想搞定AES算法,首先要写出4种基本变换,包括SubBytes(字节替代)、ShiftRows(行移位)、MixColumns(列混淆)、AddRoundKey(轮密钥加),然后写出产生每轮所使用的密钥的密钥扩展函数(KeyExpansion),最后用for(i=1,i++)进行十轮循环即可(注意最后一轮即i=10时不进行列混淆运算)。

解密方法为加密的逆运算。

首先要写出4种基本变换的逆运算,包括InvSubBytes(逆字节替代)、InvShiftRows(逆行移位)、InvMixColumns(逆列混淆)、AddRoundKey(轮密钥加函数保持不变,但相加矩阵为逆矩阵),最后用for进行十轮循环(i=9,i--)即可(注意最后一轮即i=0时不进行列混淆运算)。

总体设计框图如下:

明文及密钥的组织排列方式(按列输入)

四、功能设计及框图说明

(一)加密过程基本算法

1、ByteSubstitution(字节替代)

置换表:

unsignedcharsBox[]=

{/*0123456789abcdef*/

0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76,/*0*/

0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0,/*1*/

0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15,/*2*/

0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75,/*3*/

0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84,/*4*/

0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf,/*5*/

0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8,/*6*/

0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2,/*7*/

0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73,/*8*/

0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb,/*9*/

0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79,/*a*/

0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08,/*b*/

0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a,/*c*/

0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e,/*d*/

0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf,/*e*/

0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16/*f*/};

设计框图如下:

实现函数为:

voidAES:

:

SubBytes(unsignedcharstate[][4])

{

intr,c;

for(r=0;r<4;r++)//r为行数

{

for(c=0;c<4;c++)//c为列数

{

state[r][c]=Sbox[state[r][c]];//以状态数的高4位为行数,低4位为列数,取s盒中相应元素为替换值。

}

}

}

2、ShiftRows(行移位变换)

行移位变换完成基于行的循环位移操作,具体变换方法为:

行移位变换作用于行上,其中第0行不变,第1行循环左移1个字节,第2行循环左移2个字节,第3行循环左移3个字节。

设计框图如下:

实现函数为:

voidAES:

:

ShiftRows(unsignedcharstate[4][4])//行移位,定义4*4数组

{

unsignedchart[4];

intr,c;

for(r=1;r<4;r++)//第一行不变,从第二行开始移位(坐标从开0始)。

{

for(c=0;c<4;c++)

{

t[c]=state[r][(c+r)%4];//利用中间数组t实现循环左移。

(把后面的值存出来再赋值给前面)

}

for(c=0;c<4;c++)

{

state[r][c]=t[c];//保存移位后的状态变量

}

}

}

3、MixColumns(列混淆变换)

逐列混淆,具体变换方法为:

用常数逐行循环右移组成常数矩阵,再用它乘以状态矩阵,乘法为基于有限域(28)的乘法。

设计框图如下:

实现函数:

voidAES:

:

MixColumns(unsignedcharstate[][4])

{

unsignedchart[4];

intr,c;

for(c=0;c<4;c++)//c为列数

{

for(r=0;r<4;r++)//r为行数

{

t[r]=state[r][c];//取第c列暂存到t[r]中,做乘法。

}

for(r=0;r<4;r++)//矩阵乘法,对应行列相乘相加。

{

state[r][c]=FFmul(0x02,t[r])//FFmul为有限域GF(28)上的乘法

^FFmul(0x03,t[(r+1)%4])//t(r+1)表示常数矩阵的行移位关系

^FFmul(0x01,t[(r+2)%4])

^FFmul(0x01,t[(r+3)%4]);

}

}

}

 

其中GF乘法即实现按位相乘,将被乘数依次左移后,与依次右移的乘数最低位相乘相加,标准算法应该是循环8次(b与a的每一位相乘,结果相加),但这里只用到最低2位,解密时用到的逆列混淆也只用了低4位,所以在这里高4位的运算是多余的,只计算低4位。

设计框图如下:

=

+

+

实现函数:

unsignedcharAES:

:

FFmul(unsignedchara,unsignedcharb)

{

unsignedcharbw[4];//只计算低4位

unsignedcharres=0;

inti;

bw[0]=b;

for(i=1;i<4;i++)

{

bw[i]=bw[i-1]<<1;//乘法按位进行,将被乘数依次左移一位进行乘法运算。

if(bw[i-1]&0x80)

{

bw[i]^=0x1b;

}

}

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

{

if((a>>i)&0x01)//乘法按位进行,只分别运算最后一位(非零数)。

{

res^=bw[i];//加法为异或

}

}

returnres;

}

 

4、AddRoundKey(轮密钥加变换)

简单来说就是逐字节相加,即矩阵的每个元素分别相加,而在有限域GF(28)上的加法是模2加法,即异或。

设计框图如下:

实现函数:

voidAES:

:

AddRoundKey(unsignedcharstate[][4],unsignedchark[][4])

{

intr,c;

for(c=0;c<4;c++)//c为列数

{

for(r=0;r<4;r++)//r为行数

{

state[r][c]^=k[r][c];//密钥与状态异或相加

}

}

}

(二)密钥扩展(KeyExpansion)

将输入的密钥扩展为11组密钥组,以为各轮加密和解密提供轮密钥。

其中第0组为输入密钥本身,一组为4字(16字节)。

输入密钥直接被复制到扩展密钥数组的前四个字,然后每次用四个字填充扩展密钥数组余下的部分,w[i]的值依赖于w[i-1]和w[i-4]异或。

w数组中下标为4的倍数的元素采用复杂函数g运算。

1、一般字节:

其第n组第i列为第n-1组第i列与第n组第i-1列之和(模2加法,1<=i<=3)。

设计框图如下:

2、特殊字节:

所有w中下标为4的倍数的,即第一列,i=0时,有特殊的处理。

将前一列即第n-1组第3列的4个字节循环左移1个字节,并对每个字节进行字节替代变换SubBytes,将第一行(即第一个字节)与轮常量rc[n]相加,最后再与前一组该列相加。

设计框图如下:

实现函数:

voidAES:

:

KeyExpansion(unsignedchar*key,unsignedcharw[][4][4])

{

inti,j,r,c;

unsignedcharrc[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36};//轮常量rcon[]

for(r=0;r<4;r++)//r为行数

{

for(c=0;c<4;c++)//c为列数

{

w[0][r][c]=key[r+c*4];//输入密钥按列直接拷贝为第一组扩展密钥

}

}

for(i=1;i<=10;i++)//扩展十组密钥

{

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

{

unsignedchart[4];

for(r=0;r<4;r++)

{t[r]=j?

w[i][r][j-1]:

w[i-1][r][3];}//判断是不是每一组的第一列,分别将其前一列赋值给t[r]

if(j==0)//若是每组的第一列,就执行G变换

{

unsignedchartemp=t[0];//t[0]为第一行,即一列中的第一个字节

for(r=0;r<3;r++)

{

t[r]=Sbox[t[(r+1)%4]];//向左移位加s盒变换

}

t[3]=Sbox[temp];//循环向左移位加s盒变换,最后一字节为原来的第一字节

t[0]^=rc[i-1];//与轮常量异或

}

for(r=0;r<4;r++)//行循环,完成一列的运算

{

w[i][r][j]=w[i-1][r][j]^t[r];//最后与前一组的该列异或相加

}

}

}

}

(三)解密的基本算法

AES解密算法与加密不同,基本运算中除了AddRoundKey(轮密钥加)不变外,其余的都需要进行逆变换,即InvSubBytes(逆字节替代)、InvShiftRows(逆行移位)、InvMixColumns(逆列混淆)。

1、InvSubBytes(逆字节替代)

在逆字节替代中,用逆字节s盒替换原来的s盒,函数内容不变。

逆置换表:

unsignedcharinvsBox[256]=

{/*0123456789abcdef*/

0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb,/*0*/

0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb,/*1*/

0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e,/*2*/

0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25,/*3*/

0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92,/*4*/

0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84,/*5*/

0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06,/*6*/

0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b,/*7*/

0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73,/*8*/

0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e,/*9*/

0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b,/*a*/

0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4,/*b*/

0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f,/*c*/

0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef,/*d*/

0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61,/*e*/

0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d/*f*/

};

实现函数:

voidAES:

:

InvSubBytes(unsignedcharstate[][4])

{

intr,c;

for(r=0;r<4;r++)

{

for(c=0;c<4;c++)

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

当前位置:首页 > 高等教育 > 哲学

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

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