AES加解密实验报告.docx

上传人:b****3 文档编号:5706720 上传时间:2023-05-09 格式:DOCX 页数:10 大小:194.12KB
下载 相关 举报
AES加解密实验报告.docx_第1页
第1页 / 共10页
AES加解密实验报告.docx_第2页
第2页 / 共10页
AES加解密实验报告.docx_第3页
第3页 / 共10页
AES加解密实验报告.docx_第4页
第4页 / 共10页
AES加解密实验报告.docx_第5页
第5页 / 共10页
AES加解密实验报告.docx_第6页
第6页 / 共10页
AES加解密实验报告.docx_第7页
第7页 / 共10页
AES加解密实验报告.docx_第8页
第8页 / 共10页
AES加解密实验报告.docx_第9页
第9页 / 共10页
AES加解密实验报告.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

AES加解密实验报告.docx

《AES加解密实验报告.docx》由会员分享,可在线阅读,更多相关《AES加解密实验报告.docx(10页珍藏版)》请在冰点文库上搜索。

AES加解密实验报告.docx

AES加解密实验报告

 

《信息安全体系》课程设计报告

 

班级:

物联网2013级1班

姓名:

学号:

课程设计题目:

AES加密算法

所属课程:

物联网信息安全

实验室(中心):

软件实验室60801

指导教师:

完成时间:

2016年6月6日

 

1.问题分析和任务定义

问题分析:

´AES是一个对称分组密码算法,根据使用的密码长度,AES最常见的有3种方案,用以适应不同的场景要求,分别是AES-128、AES-192和AES-256。

´AES加密过程涉及到4种操作:

字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。

解密过程分别为对应的逆操作。

由于每一步操作都是可逆的,按照相反的顺序进行解密即可恢复明文。

´AES算法是基于置换和代替的。

置换是数据的重新排列,而代替是用一个单元数据替换另一个。

AES使用了几种不同的技术来实现置换和替换。

任务(功能)定义:

(数据结构部分)

(1)明文转换:

Utf8.encode(strUni);//将得到的明文或密钥通过Utf8编码

Utf8.decode(strUtf);//将UTF-8编码的字符串解码成多字节Unicode字符

Base64.encode=function(str,utf8encode)//将UTF-8编码得到的字符通过Base64编码

Base64.decode=function(str,utf8decode)//将UTF-8解码得到的字符通过Base64解码

(2)轮密钥加:

Aes.addRoundKey=function(state,w,rnd,Nb)//将128位的state矩阵按位与128位密钥异或

(3)字节代替:

Aes.subBytes=function(s,Nb)//将状态矩阵的每个字节,进行4*Nb矩阵的遍历并替换

(4)列混淆:

Aes.mixColumns=function(s,Nb)//将状态矩阵逐列混合

(5)行位移:

Aes.shiftRows=function(s,Nb)//状态矩阵的第0行不变,第1行向左移一个字节,第2行向左移两个字节,第三行向左移三个字节

(6)密钥扩展:

Aes.keyExpansion=function(key)//将输入的密钥扩展为11组128位密钥组,其中第0组为输入密钥本身

2.环境简介

开发环境:

WebStrom11.0.2

环境简介:

WebStorm是jetbrains公司旗下一款JavaScript开发工具。

被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScriptIDE”等。

与IntelliJIDEA同源,继承了IntelliJIDEA强大的JS部分的功能。

3.程序设计

根据算法密钥的长度,AES有3种不同方案用以满足不同的场景需求,分别是AES-128、AES-192和AES-256。

本次内容主要对AES-128进行设计,另外两种的思路基本一样,只是密钥扩展的过程会稍有不同,加解密的轮数会适当增加,但加解密的操作都是一样的。

(1)AES加解密流程

(2)字节替代

字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。

主要算法:

Aes.subBytes=function(s,Nb){

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

for(varc=0;c

s[r][c]=Aes.sBox[s[r][c]];

}

returns;

};

(3)行位移

第一行保存不变,第二行循环左移1个字节,第三行循环左移2个字节,第四行循环左移3个字节。

 

主要算法:

Aes.shiftRows=function(s,Nb){

vart=newArray(4);

for(varr=1;r<4;r++){

for(varc=0;c<4;c++)t[c]=s[r][(c+r)%Nb];

for(varc=0;c<4;c++)s[r][c]=t[c];

}

returns;

};

(4)列混淆

根据矩阵的乘法可知,在列混淆的过程中,每个字节对应的值只与该列的4个值有关系。

此处的乘法和加法都是定义在GF(28)上的,需要注意如下几点:

1)将某个字节所对应的值乘以2,其结果就是将该值的二进制位左移一位,如果该值的最高位为1(表示该数值不小于128),则还需要将移位后的结果异或00011011;

2)乘法对加法满足分配率

3)此处的矩阵乘法与一般意义上矩阵的乘法有所不同,各个值在相加时使用的是模2加法(相当于是异或运算)。

主要算法:

Aes.mixColumns=function(s,Nb){

for(varc=0;c

vara=newArray(4);

varb=newArray(4);

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

a[i]=s[i][c];

b[i]=s[i][c]&0x80?

s[i][c]<<1^0x011b:

s[i][c]<<1;

}

s[0][c]=b[0]^a[1]^b[1]^a[2]^a[3];

s[1][c]=a[0]^b[1]^a[2]^b[2]^a[3];

s[2][c]=a[0]^a[1]^b[2]^a[3]^b[3];

s[3][c]=a[0]^b[0]^a[1]^a[2]^b[3];

}

returns;

};

(5)轮密钥加

任何数和自身的异或结果为0。

加密过程中,每轮的输入与轮密钥异或一次;因此,解密时再异或上该轮的密钥即可恢复输入。

主要算法:

Aes.addRoundKey=function(state,w,rnd,Nb){

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

for(varc=0;c

state[r][c]^=w[rnd*4+c][r];}

returnstate;

};

(6)密钥扩展

密钥扩展过程说明:

    1) 将初始密钥以列为主,转化为4个32bits的字,分别记为w[0…3];

    2) 按照如下方式,依次求解w[j],其中j是整数并且属于[4,43];

    3) 若j%4=0,则w[j]=w[j-4]⊕g(w[j-1]),否则w[j]=w[j-4]⊕w[j-1];

  函数g的流程说明:

    4) 将w循环左移一个字节;

    5) 分别对每个字节按S盒进行映射;

    6) 与32bits的常量(RC[j/4],0,0,0)进行异或,RC是一个一维数组,其值如下。

(RC的值只需要有10个,而此处用了11个,实际上RC[0]在运算中没有用到,增加RC[0]是为了便于程序中用数组表示。

由于j的最小取值是4,j/4的最小取值则是1,因此不会产生错误。

      RC={00,01,02,04,08,10,20,40,80,1B,36}

主要算法:

Aes.keyExpansion=function(key){

varNb=4;//明文列数

varNk=key.length/4;//密钥列数128位,NK=4;

varNr=Nk+6;//轮数

varw=newArray(Nb*(Nr+1));

vartemp=newArray(4);

for(vari=0;i

varr=[key[4*i],key[4*i+1],key[4*i+2],key[4*i+3]];

w[i]=r;

}

for(vari=Nk;i<(Nb*(Nr+1));i++){

w[i]=newArray(4);

for(vart=0;t<4;t++)temp[t]=w[i-1][t];

if(i%Nk==0){

temp=Aes.subWord(Aes.rotWord(temp));

for(vart=0;t<4;t++)temp[t]^=Aes.rCon[i/Nk][t];

}elseif(Nk>6&&i%Nk==4){

temp=Aes.subWord(temp);

}

for(vart=0;t<4;t++)w[i][t]=w[i-Nk][t]^temp[t];

}

returnw;

};

4.用户使用说明

先输入明文和密钥,点击“加密”按钮进行加密,点击“解密”按钮进行解密,利用清空按钮清空当前表单。

5.测试数据与测试结果分析

AES_128加解密测试:

1)明文处输入:

算法测试;密钥处输入:

123456;点击加密按钮

2)点击解密按钮

分析:

通过加密按钮可以得到每一轮加密后的16进制结果,最终在加密对应的框里将最后一轮的加密结果通过Base64编码成字符串格式显示出来。

通过解密按钮,将加密出来的结果(字符串)通过Base64解码,通过解密算法得到最后的解密结果。

从加解密过程这一栏可以看出,第1轮加密结果与第10轮解密结果一致,第2轮加密结果与第9轮解密结果一致。

这是由于AES是对称加密,相同的明文和密钥,加解密的结果应该一致。

3)重复步骤1)

在这个例子中,由于明文分组长度和密钥长度均为128位,而输入的明文只有8个字节,不足16字节的明文将随机填充,密钥只有6个字节,不足16字节的密钥将用0填充;因此,同样的明文和密钥,再次进行加密的时候,将会得到不同的结果。

6.总结

这次课程设计我是利用JavaScript语言来实现的,但不管什么语言,密码学本身的精华不会改变。

通过这次课程设计,AES加密算法的步骤和原理已经熟悉和掌握了,虽然只实现了128bit的AES加解密,但在整个过程中仍然遇到了很多困难,比如,用的是二维数组,遇到有时输入是先行后列,但是按照数组的定义是先列后行,很多时候有点绕。

另外,矩阵乘法那里的异或函数,由于是十六进制的算法,需要用到二进制乘法的知识。

还有就是对输入文本的处理,有汉字,有字符,有数字,刚开始对它们的处理还不知从哪里下手,后来查阅资料才知道用UTF-8和Base64的规则来处理。

在界面设计时,通过HTML+CSS设计出了一个有良好交互的简单网页。

总之,在这次课程设计过程中学到了很多自己欠缺的东西,也从中加强了自己处理问题的能力。

 

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2