信息安全实验报告[精选五篇]

时间:2020-10-30 12:23:15下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《信息安全实验报告》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《信息安全实验报告》。

第一篇:信息安全实验报告

本科实验报告

课程名称:

信息安全技术与应用

实验地点:

实验机房 110

专业班级:

计 Z1303

号:

2013002040

学生姓名:

杨朝辉

指导教师:

张辉

成绩:

2016 年6月 5 日

太原理工大学学生实验报告 学院名称 计算机科学与技术学院 专业班级 计 Z1303 学号 20130 0 2040 学生姓名 杨朝辉 实验日期 5 月31日 成绩

课程名称 信息安全技术与应用 实验题目 实验一

常用网络安全命令 一、实验目得与要求 1.熟悉并掌握使用常用网络安全命令 2.由于常用网络安全命令功能强大、参数众多,在有限时间内不可能对所有命令参数进行实验。但要求每个命令至少选择两个参数进行实验,命令参数可以任意选择.命令执行后将执行结果复制到实验报告表格中,并对命令执行结果进行解释。

二、实验内容 1、ipconfig 命令 主要功能:显示本地主机 IP 地址、子网掩码、默认网关、MAC地址等。

例 1:C:\> ipconfig/all 2、ping 命令

主要功能:目标主机得可达性、名称、IP地址、路由跳数、往返时间等。

例 2:C:\>ping 192、168、0、1 or target_name 3、tracert命令

主要功能:路由跟踪、节点IP 地址、节点时延、域名信息等.例 3:C:\〉tracert

or 192、168、0、1、4 令命 tatstenﻩ。接连络网 PI/PCT 前当与息信计统议协示显:能功要主ﻩ例 4:C:〉netstat –a;C:\〉netstat –n;5、nbtstat命令

主要功能:显示使用 NBT(NetBIOS over TCP/IP)得协议统计与当前TCP/IP网络连接信息,可获得远程或本机得组名与机器名。

例 5:C:〉nbtstat –a 192、168、0、1;C:>nbtstat –n 6、net 命令 主要功能:网络查询、在线主机、共享资源、磁盘映射、开启服务、关闭服务、发送消息、建立

用户等.net 命令功能十分强大,输入 net help mand 可获得 mand得具体功能及使用方法。

例 5:C: >net view;C:\ >net view target_name;net send /domain:

计算机名(*为域内广播)消息 三、主要仪器设备

Win7OS 得 PC

四、实验 步骤

按照实验内容进行

五、实验结果 1、ipconfig 命令

2.ping 命令

3.tracert 命令

4.netstat 命令

5.nbtstat 命令

6.net 命令

实验地点 实验机房110 指导教师 张辉

告报验实生学学大工理原太ﻬ学院名称 计算机科学与技术学院 专业班级 计Z1303 学号 2013002040 学生姓名 杨朝辉 实验日期 5 月 31日 成绩

课程名称 信息安全技术与应用 实验题目 实验二 端口扫描与安全审计 一、实验目得与要求 1、掌握使用nmap 软件来进行端口扫描与安全审计得操作 2、由于Nmap 扫描功能强大、命令参数众多,在有限时间内不可能对所有命令参数进行实验。但实验内容中列举得扫描命令必须完成,也可以任意选择其她命令参数进行实验。命令执行后将执行结果复制到实验报告表格中,并对命令执行结果进行解释.二、实验 内容与原理 1、安装 nmap-4、01-setup、exe软件 注意事项:采用nmap—4、01—setup、exe 时将自动安装 WinPcap 分组捕获库,采用解压缩nmap-4、01-win32、zip时需事先安装 WinPcap 分组捕获库。

2、局域网主机发现

址地网域局 Ls— pamn:描扫表列ﻩ3、扫描目标主机端口

连续扫描目标主机端口:nmap –r目标主机 IP地址或名称 4、服务与版本检测

目标主机服务与版本检测:nmap-sV 目标主机IP 地址或名称 5、操作系统检测

目标主机操作系统检测:nmap -O目标主机 IP地址或名称 6、端口扫描组合应用 nmap —v-A scanme、nmap、org nmap-v-sP 192、168、0、0/16 10、0、0、0/8 nmap —v —iR 10000-P0-p-80 三、主要仪器设备

Win7OS 得 PC

四、实验 步骤

按照实验内容进行

五、实验结果 1、列表扫描 nmap —sL 192、168、1、109

2.连续扫描目标主机端口 nmap –r 192、168、1、109

3.目标主机服务与版本检测 nmap-sV 192、168、1、100

4.nmap -O

192、168、1、108

5、nmap -v-A scanme、nmap、org nmap —v —sP 192、168、0、0/16 10、0、0、0/8

nmap-v-iR 10000 -P0-p -80

5-2、注:第二条命令由于扫描 IP 地址过多电脑无法承受导致软件多次崩溃,故修改此条命令为:

nmap-v-sP 192、168、0、0/24 10、0、0、0/24 中间略过遍历端口

5-3、注:第三行代码同第二行代码一样出现多次软件卡顿无法正常得出运行结果 故修改命令为:nmap-v —iR 10 -P0 —p-80

实验地点 实验机房 110 指导教师 张辉

告报验实生学学大工理原太ﻬ学院名称 计算机科学与技术学院 专业班级 计 Z1303 学号 2013002040 学生姓名 杨朝辉 实验日期 5 月 31 日 成绩

课程名称

信息安全技术与应用 实验题目 实验三

网络入侵跟踪与分析 ﻩ

一、实验目得与要求 1.由于 Ethernet分组捕获与协议分析功能强大,在一个实验单元时间内不可能熟练掌握Ethernet得使用。但至少应掌握捕获菜单与统计菜单得使用,也可以选择其她菜单命令进行实验。

二、实验内容与原理

1、ethe re al--s s e tup —0 0、10、14、ex e 软件 安装

注意事项:ethereal-setup-0、10、14、exe 将自动安装 WinPcap分组捕获库,不必事先安装 WinPcap 分组捕获库.2 2、冲击波蠕虫病毒攻击分析

1((ﻩ 1))冲击波蠕虫病毒攻击原理 冲击波蠕虫病毒W32、Blaster、Worm 利用 Windows 2000/XP/2003 等操作系统中分布式组件对象模型 D(Distributed ponent Object Model)与远程过程调用(RPC(Remote Procedure Call)通信协议漏洞进行攻击,感染冲击波蠕虫病毒得计算机随机生成多个目标 IP 地址扫描 TCP/135(epmap)、UDP/135(epmap)、TCP/139、UDP/139、TCP/445、UDP/445、TCP/593、UDP/593端口寻找存在 D RPC 漏洞得系统.感染冲击波蠕虫病毒得计算机具有系统无故重启、网络速度变慢、Office软件异常等症状,有时还对Windows自动升级(windowsupdate、)进行拒绝服务攻击,防止感染主机获得D RPC 漏洞补丁。

根据冲击波蠕虫病毒攻击原理可知,计算机感染冲击波蠕虫病毒需要具备三个基本条件。一就是存在随机生成 IP 地址得主机;二就是 Windows 2000/XP/2003 操作系统开放了 RPC 调用得端口服务;三就是操作系统存在冲击波蠕虫病毒可以利用得 D RPC 漏洞。

(2 2)冲击波蠕虫病毒攻击过程分析 用 Ethereal打开冲击波蠕虫病毒捕获文件 Win2000—blaster、cap,通过协议分析回答下列问题(仅限于所捕获得冲击波蠕虫病毒):(a)感染主机每次随机生成多少个目标 IP地址?(b)扫描多个端口还就是一个端口?如果扫描一个端口,就是那一个 RPC 调用端口?(c)分别计算第二组与第一组扫描、第三组与第二组扫描之间得间隔时间,扫描间隔时间有规律吗?(d)共发送了多少个试探攻击分组?(提示:端点统计或规则 tcp、flags、syn==1 显示 SYN=1 得分组)(e)有试探攻击分组攻击成功吗?如攻击成功,请给出感染主机得IP地址。如没有攻击成功得实

例,说明为什么没有攻击成功?(提示:TCP报文段 SYN=1表示连接请求,SYN=1 与 ACK=1表示端口在监听,RST=1 表示拒绝连接请求。使用显示过滤规则 tcp、flags、syn==1&&tcp、flags、ack==1 确定就是否有端口监听.)三、主要仪器设备

Win7OS 得 PC、ethereal 软件 四、实验 步骤

按照实验内容进行

五、实验 结果(a)感染主机每次随机生成多少个目标 IP 地址? 感染主机每次随机生成20 个目标 IP 地址(b)扫描多个端口还就是一个端口?如果扫描一个端口,就是那一个 RPC调用端口? 扫描一个端口,端口 135。

(c)分别计算第二组与第一组扫描、第三组与第二组扫描之间得间隔时间,扫描间隔时间有规律吗? 没有时间规律(d)共发送了多少个试探攻击分组?(提示:端点统计或规则 tcp、flags、syn==1显示 SYN

=1 得分组)共发送了6008 条试探攻击分组(e)有试探攻击分组攻击成功吗?如攻击成功,请给出感染主机得 IP地址.如没有攻击成功得实例,说明为什么没有攻击成功?(提示:TCP 报文段SYN=1 表示连接请求,SYN=1 与ACK=1 表示端口在监听,RST=1 表示拒绝连接请求.使用显示过滤规则tcp、flags、syn==1&&tcp、flags、ack==1 确定就是否有端口监听。)

没有试探攻击分组攻击成功

实验地点 实验机房 110 指导教师 张辉

太原理工大学学生实验报告 学院名称 计算机科学与技术学院 专业班级 计Z1303 学号 2013002040 学生姓名 杨朝辉 实验日期 5 月 31 日 成绩

课程名称 信息安全技术与应用 实验题目 实验四

网络入侵检测系统 一、实验目得与要求 1、由于 Snort 入侵检测系统功能强大、命令参数众多,在有限时间内不可能对所有命令参数进行实验。可根据自己对 Snort得熟悉程度,从实验内容中选择部分实验,但至少应完成 Snort 报警与日志功能测试、ping 检测、TCP connect()扫描检测实验内容.二、实验内容与原理 1、sn ort t — 2_0_0、e e xe e 得安装与配置

本实验除安装 snort-2_0_0、exe之外,还要求安装 nmap-4、01-setup、exe 网络探测与端口扫描软件.Nmap 用于扫描实验合作伙伴得主机,Snort 用于检测实验合作伙伴对本机得攻击.用写字板打开Snortetcsnort、conf 文件对 Snort 进行配置.将 var HOME_NET any 中得any 配置成本机所在子网得 CIDR 地址;将规则路径变量 RULE_PATH 定义为 C:snortrules;将分类配置文件路径修改为 include C:snortetcclassification、config;将引用配置文件路径修改为 include C:snortetcreference、config.其余使用 Snort 配置文件中得默认设置,这里假设所有Snort 命令都在 C 盘根目录下执行。2、Snort 报警与日志功能测试

用写字板打开 C:>Snortrules\local、rules规则文件,添加 Snort报警与日志功能测试规则:alert tcp any any -〉 any any(msg:”TCP traffic”;)。

执行命令:C:\〉snortbinsnort —c snortetc\snort、conf —l snortlog -i 2 如果在C:\>Snortlog 目录中生成 alert、ids 报警文件与 IP地址命名得日志文件,表明Snort 配置正确,能够实施入侵报警与日志记录功能。

特别提醒:测试 Snort 报警与日志功能以后,一定要删除掉添加得测试规则或在该规则前加#号变为注释!否则,随后得实验不能获得正确结果。

3、

分组协议分析

(1)TCP/UDP/ICMP/IP 首部信息输出到屏幕上:

C:〉 snortbinsnort –v —i n;n=1/2/3/4/5

(2)TCP/UDP/ICMP/IP首部信息与应用数据输出到屏幕上:

C:〉 snortbinsnort —vd -i n 或 C:> snortbinsnort —v –d —i n;(命令选项可以任意结合,也可以分开)

(3)将捕获得首部信息记录到指定得 Snort\log 目录,在 log 目录下将自动生成以主机 IP地址命名得目录;

5/4/3/2/1=n;n i— goltrons l- v-tronsnibtrons 〉:Cﻩ)4(在,录目 gol\tronS得定指到录记据数用应与息信部首得获捕将式格制进二pmudpcT 用采ﻩlog目录下将自动生成 snort、log 日志文件,可以使用Ethereal 或 Tcpdump协议分析软件打开snort、log 文件,也可以通过—r snort、log 选项用Snort输出到屏幕上.C:〉 snort\bin\snort-b-l snortlog-i n;n=1/2/3/4/54、网络入侵检测)1(目 goltrons在,测探 gnip得机本对测检 tronS 用利,机主得方对 gnip 互相伴伙作合验实ﻩ录下将生成报警文件 alert、ids:

i— gol\trons l— fnoc、tronsctetrons c-d— tronsnibtrons〉\:Cﻩn

n=1/2/3/4/5)2(扫)(tcennoc PCT令命”称名或址地 PI机主标目 Ts— pamn“用利伴伙作合验实ﻩ描对方主机,以文本格式记录日志得同时,将报警信息发送到控制台屏幕(console):

- elosnoc A-goltrons l— fnoc、trons\ctetrons c-tronsnibtrons>:Cﻩi n

n=1/2/3/4/5)3(pcT 以,统系作操机主标目测探令命”称名或址地 PI机主标目 O-pamn“用利伴伙作合验实ﻩdump 二进制格式记录日志得同时,将报警信息发送到控制台屏幕(console): — elosnoc A-goltrons l-b— fnoc、tronsctetrons c- tronsnib\trons>:Cﻩi n

n=1/2/3/4/5

(4)实验合作伙伴远程登录 Telnet 对方主机,利用 Snort检测对本机 Telnet 服务得非法访问,文本格式记录日志得同时,将报警信息发送到控制台屏幕(console):

假设您得主机IP 地址为 192、168、6、123,用写字板打开 C:〉Snortruleslocal、rules规则文件,添加检测 Telnet 服务非法访问得规则: alert tcp any any —〉 192、168、6、123/32 23(msg: “Someone attempt

s to access my telnet server”;)C:〉snortbinsnort —c snortetcsnort、conf —l snortlog —A console-i n

n=1/2/3/4/5 三、主要仪器设备

Win7OS 得PC、ethereal 软件 四、实 验 步骤

按照实验内容进行

五、实验 结果 1、S no rt 配置

键入规则

命令行执行

2.分组协议分析 (1)TCP/UDP/ICMP/IP首部信息输出到屏幕上:

C:> snort\binsnort –v -i 2

(2)TCP/UDP/ICMP/IP 首部信息与应用数据输出到屏幕上: C:> snortbinsnort -vd —i 2 或C:\> snort\binsnort-v –d-i 2;(命令选项可以任意结合,也可以分开)

(3)将捕获得首部信息记录到指定得Snortlog目录,在log 目录下将自动生成以主机 IP 地址命名得目录;

C:> snort\binsnort —v-l snortlog —i 2)4(gol在,录目gol\tronS得定指到录记据数用应与息信部首得获捕将式格制进二pmudpcT用采ﻩ目录下将自动生成 snort、log 日志文件,可以使用 Ethereal 或Tcpdump 协议分析软件打开 snort、log 文件,也可以通过-r snort、log 选项用 Snort 输出到屏幕上。

C:> snort\binsnort —b —l snort\log —i 2 3.网络入侵检测(1)实验合作伙伴相互 ping 对方得主机,利用 Snort 检测对本机得 ping 探测,在 snort\log目录下将生成报警文件 alert、ids:

C:>snortbinsnort —d —c \snort\etcsnort、conf —l snort\log —i n

n=1/2/3/4/5

(2)实验合作伙伴利用“nmap-sT 目标主机 IP 地址或名称”命令 TCP connect()扫描对方主机,以文本格式记录日志得同时,将报警信息发送到控制台屏幕(console):

C:>snort\binsnort —c snortetcsnort、conf —l \snort\log-A console —i n;n=1/2/3/4/5

(3)实验合作伙伴利用“nmap-O 目标主机 IP地址或名称”命令探测目标主机操作系统,以 Tcpdump二进制格式记录日志得同时,将报警信息发送到控制台屏幕(console):

C:\〉snortbin\snort —c snortetc\snort、conf —b —l snortlog —A console -i n

n=1/2/3/4/5

(4)实验合作伙伴远程登录Telnet 对方主机,利用Snort 检测对本机 Telnet 服务得非法访问,文本格式记录日志得同时,将报警信息发送到控制台屏幕(console):

假设您得主机 IP 地址为 192、168、6、123,用写字板打开 C:\>Snortruleslocal、rules 规则文件,添加检测Telnet服务非法访问得规则: alert tcp any any —> 192、168、6、123/32 23(msg:

"Someone attempts to access my telnet server";)C:〉snortbin\snort —c \snort\etcsnort、conf-l snortlog —A console —i n

n=1/2/3/4/5

实验地点 实验机房110 指导教师 张辉

第二篇:信息安全实验报告

《信息安全》实验报告

班级:

姓名:

学号:

1. 实验题目:置换密码技术实现程序开发 2. 实验目的:通过置换密码算法的实现,进一步掌握置换密码算法的原理,为今后的工程应用打下坚实的基础。

3. 实验原理:置换密码亦称为换位密码。置换只不过是一个简单的换位。每个置换都可以用一个置换矩阵Ek来表示。每个置换都有一个与之对应的逆置换Dk。置换密码的特点是仅有一个发送方和接收方知道的加密置换(用于加密)和对应的逆置换(用于解密)。它是对明文L长字母组中的字母位置进行重新排列,而每个字母本身并不改变。令明文为 mm1m2mL。令置换矩阵所决定的置换为,则 加密置换 CEk(c1c2cL)m(1)m(2)m(L)解密置换 dDk(c1(1)1(2)cc1(L))

例,给定明文为tba simpodst yossibje trqnspbsition cipderk,将明文分成长为L=5的段,m1=tbasi, m2=mpods m3=tyoss m4=ibjet,m5=rqnsp, m6=bsiti m7=oncip m8=derkz

最后一段长不足5,加添一个字母z。将隔断的字母序号按下述置换矩阵进行换位:

Ek= 0 1 2 3 4 4 3 0 2

得到密文如下

STIAB DMSOP STSOY EITJB SRPNQ TBIIS IOPCN KDZRE

利用下述置换矩阵:

Dk=0 1 2 3 4 0 4 2 1

可将密文恢复为明文。

L=5时可能的置换矩阵总数为5!=120,一般为L!个。可以证明,在给定L下所有的置换矩阵构成一个L!对称群。4. 实验代码

void Permutation()/*置换密码*/ {

char c[100], *q;

int *key, len, m, i, j=0;

system(“cls”);

printf(“********Permutation Cipher(置换密码)********nPlease input primal sentence(请输入最初的明文): ”);

gets(c);

strcpy(c, strupr(c));

len = strlen(c);

for(i=0;i

{

if(c[i]<65||c[i]>90)

{

for(j=i;j

c[j] = c[j+1];

len--;

}

}

c[len] = '';

printf(“Input the length of the key: ”);

scanf(“%d”, &m);

key =(int*)malloc(m*sizeof(int));

q =(char *)malloc(len*sizeof(int));

printf(“Input the key: ”);

for(i=0;i

{

scanf(“%d”, key+i);

key[i]--;

}

getchar();

for(i=0;i

{

j =(i/m)*m;

q[i] = c[*(key+i%m)+j];

}

q[i] = '';

printf(“Result is: %sn”, q);

for(i=0, j=0;i

{

j =(i/m)*m;

c[*(key+i%m)+j] = q[i]+32;

}

c[len] = '';

printf(“After translated the sentence,we can see the primal sentence as follow:n%sn”, c);

printf(“Press any key to return(按任何键返回)...”);

free(key);

free(q);

getch();}

int main(){

char i = '0';

system(“cls”);

while(i!='5')

{

system(“cls”);

printf(“********Press 1~5 to choose(请按1~5选择):********n”);

printf(“1.Shift Cipher(移位密码)n2.Affine Cipher(仿射密码)n3.Vigenere Cipher(维吉利亚密码)n4.Permutation Cipher(置换密码)n5.Exit(退出)n”);

i = getch();

if(i=='1')

Shift();

else if(i=='2')

Affine();

else if(i=='3')

Vigenere();

else if(i=='4')

Permutation();

else if(i=='5')

break;

} system(“pause”);return 0;

5.实验总结:通过这次上机实验,我了解道常用置换矩阵的特点和作用,它具有很高的安全性和可靠性,然而由于我对置换矩阵算法了解不够深入,理解不够透彻,以至于出现了很多麻烦,幸运的是经过老师和同学的指点,我成功地解决了上机遇到的各种问题。

第三篇:网络与信息安全实验报告

计算机科学与技术学院

网络与信息安全课程设计

号:

业:计算机科学与技术

学生姓名:

任课教师:***

2017年3月

FTP服务器的设计与实现

***

计算机科学与技术学院,哈尔滨工程大学

摘要:FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:“下载”(Download)和“上传”(Upload)。“下载”文件就是从远程主机拷贝文件至自己的计算机上;“上传”文件就是将文件从自己的计算机中拷贝至 远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。本文基于FTP协议搭建了一个FTP服务器,实现简单的上传下载功能。关键字:FTP,网络协议,服务器

一、FTP协议的工作原理

1.简介

FTP是因特网网络上历史最悠久的网络协议,凭借其独特的优势一直都是因特网中最重要、最广泛的服务之一。FTP是TCP/IP提供的标准机制,实现从一台主机向另一台主机传送文件的任务。目前FTP客户端软件很多,大致我们可以把它们分为三类:第一类是传统的FTP客户机;第二类是图形化用户界面的FTP软件;第三类是Web浏览器。

从根本上说,FTP就是在网络中各种不同的计算机之间按照TCP/IP协议来传输文件。FTP采用的是现在流行的Client/Server模式,由FTP客户端和FTP服务器端程序组成。通常服务器端是远程端点,用户可以通过Internet网络连接到远程的FTP服务器站点。服务器的功能是主要的。只有当FTP服务器支持各种协议和指令时,才能够开发相应的客户端程序。

开发任何基于FTP的客户端软件都必须遵循FTP的工作原理,FTP的独特的优势同时也是与其它客户服务器程序最大的不同点就在于它在两台通信的主机之间使用了两条TCP连接,一条是数据连接,用于数据传送;另一条是控制连接,用于传送控制信息(命令和响应),这种将命令和数据分开传送的思想大大提高了FTP的效率,而其它客户服务器应用程序一般只有一条TCP连接。图1给出了FTP的基本模型。客户有三个构件:用户接口、客户控制进程和客户数据传送进程。服务器有两个构件:服务器控制进程和服务器数据传送进程。在整个交互的FTP会话中,控制连接始终是处于连接状态的,数据连接则在每一次文件传送时先打开后关闭。用户接口 控制连接控制进程控制进程命令与应答数据连接数据传送进程数据传送进程文件传输图1 FTP的基本模型

FTP是TCP/IP的一种具体应用,它工作在OSI模型的第七层,TCP模型的第四层上,即应用层,使用TCP传输而不是UDP,这样FTP客户在和服务器建立连接前就要经过一个被广为熟知的“三次握手”的过程,它带来的意义在于客户与服务器之间的连接是可靠的,而且是面向连接,为数据的传输提供了可靠的保证。采用FTP协议可使 Internet用户高效地从网上的FTP服务器下载大信息量的数据文件,将远程主机上的文件拷贝到自己的计算机上。以达到资源共享和传递信息的目的。由于FTP的使用使得Internet上出现大量为用户提供的下载服务器。Internet成为了一个巨型的软件仓库。FTP在文件传输中还支持断点续传功能,可以大幅度地减小CPU和网络带宽的开销。

FTP需要2个端口,一个端口是控制连接端口,也即21端口,用于发送指令给服务器并等待服务器响应;另一个端口是数据传输端口,端口号为20(仅PORT模式),用于建立数据传输通道。

FTP的连接模式有2种:PORT和PASV。PORT模式是一个主动模式,PASV是被动模式,二者都是相对于服务器而言的。2.FTP运行原理

FTP的工作原理与其他许多网络实用程序一样,也是基于客户/服务器模式。互联网文件传输协议(File Transfer Protocol)标准是在FTC959说明的。该协议定义了一个在远程计算机系统和本地计算机系统之间传输文件的标准。一般来说,要传输文件的用户需先经过认证以后才能登录ftp服务器,访问在远程服务器的文件。大多数的FTP服务器往往提供一个guest的公共帐户来允许没有FTP服务器帐户的用户可以访问该FTP服务器。一个FTP会话通常包括五个软件元素的交互。就模型而言,从1973年以来并没有什么变化。如图2所示。

用户接口用户SPIUSERPI文件系统SDTPUDTP图2 FTP协议模型

文件系统

在一个FTP会话中,会存在两个独立的网络连接,一个是由两端的PI使用的,另一个是由两端的DTP使用的。PI之间的连接一般被称作控制连接(control connection),DTP之间的连接被称作数据连接(data connection)。通常情况下,ftp服务器监听端口号21来等待控制连接建立请求,当客户连接请求到达,会在客户和ftp服务器之间建立一个控制连接。而数据连接端口号的选择依赖于控制连接上的命令,通常是客户发送一个控制消息来指定客户需要建立一个数据连接来传输ftp数据(如下载/上载一个文件,显示当前目录的内容等等,都需要建立数据连接来传输数据),在该消息中,指定了客户监听并等待连接的端口号,而服务器从控制连接收到该命令,向客户端发起一个连接请求到消息中指定的端口号,客户端收到该请求以后就会建立一个数据连接。连接建立以后,服务器或客户就会主动通过该连接发送数据(可能是要传输的文件,也可能是用户在命令行上发出的IS命令的输出)。

二、系统设计与实现 功能要求

本系统是一个在局域网内实现的小型FTP文件传输服务器。主要实现的是FTP服务器端功能,包括:FTP服务日志,在线用户的管理,统计客户端信息还有客户端上传、下载、选择数据传输模式、改变目录等,并给出相应的提示。2 主界面 程序界面主要包括服务器日志、在线用户、统计信息、安全管理、菜单栏、工具栏、状态栏。如图5所示。

图5 服务器用户界面 主要功能与实现

用CSocket类编制的服务器端的程序,其过程如下,其过程主要是: 创建CSocket对象。创建底层套接字Socket。

调用Listen,开始监听从客户端发来的访问请求。

如果收到请求,调用CAsyncSocket::Accept()函数进行接收外理。建立CSocketFile对象,并且使该对象与CSocket对象具备一定的联系。

建立Carchive对象,以便实现卸装(接收)数据和存储(发送)数据的目的地址。当然,该Carchive对象应该与前面的CSocketFile对象建立联系。

使用Carchive对象在客户和服务器Socket之间传递数据,从而实现服务器Socket和客户机Socket之间的通信。值得注意的是,一个给定的Carchive对象只能在单一的方向上传递数据:或者接收,或者发送。一般情况下,可能需要两个Carchive对象来实现数据的双向传递。

3.1菜单栏功能模块

菜单拦包括:服务器,查看。

服务器菜单包括:开始,停止,用户账户向导,用户账户等功能。查看菜单包括:服务器日志,在线用户,配置,统计,安全等功能。各项功能实现如下: 服务器功能:

(1)帐户向导:当你 登录服务器时你需要一个有效的账户,用户帐户向导将引导您通过必要的步骤,创造一个新的用户帐户。并将其添加到用户帐户对话框,创建用户名,如图6所示。

图6 用户帐户向导窗口

通过这个窗口你可以创建自己的用户名以及密码用以登陆FTP服务器,该部分功能实现代码如下:

(2)用户帐户功能:这一功能主要是服务器端添加,修改和删除用户帐户,设置目录权限(使用添加按钮以添加一个新目录,其中选定的用户帐户已具有访问权限,每小组目录您可以设定不同的权限,例如你可以给所有权限到C:下载,但限制的权限为C :下载申请时,没有权限指定的目录,在这个目录中它会自动阻止用户要求上传任何子目录)。目录属性,当您添加的编辑目录的用户帐户,目录属性对话框将显示物理目录(物理目录是'真正'的路径文件夹的名称)。虚拟目录(虚拟目录是一个物理文件夹的别名,当用户连接到您的FTP服务器,它将看到这个目录名而不是真正的物理名称)。设制服务端允许客户端的权限,例如允许客户端可以下载,上传,重命名哪些服务器端的文件内容。例如用户123将: E:盘设为许可目录,客户端就可以随时下载,上传E:盘里面的内容,如图7所示。

图7 用户帐户窗口

3.2 查看功能模块

(1)服务器日志模块的功能:在此屏幕,记录客户端与服务器端的连接信息以及传输信息,当客户端登陆服务器时服务器日志会显示是否与服务器连接成功,当客户端要上传文件或是下载文件成功时会记录服务器和FTP客户端的详细资料,从而有助于您追踪服务器与客户端之间所有的通讯讯息,数目之间的方括号[ ]是线程ID,如图8所示。

图8 服务器日志窗口

(2)在线用户模块的功能:通过服务器来查看在线客户端的用户名,用户IP地址,用户登陆时间等信息,如图9所示。

图9 在线用户窗口

(3)配置模块的功能:配置FTP服务器所有的设置。默认服务器端口为21,可以同时连接最多用户数,客户端与服务器端连接时间(当客户端已闲置的具体时间,它会自动断开),欢迎信息(当客户端连接到服务器时将会显示该文本),再见讯息(文本将显示当一个客户端从服务器断开时)其他设置,FTP服务器在Windows下启动,启动最小化在系统盘,并在启动时自动激活服务器。用户还可以将用户各种信息都记录在服务器日志里,如图10所示。

图10 配置界面

三、实验结论

本次实验实现了一个基于FTP协议的服务器系统,基本完成了FTP服务器所需的大多数功能。用户能够选择相应的数据传输模式,对指定的文件进行上传下载。通过该程序的开发,涵盖了一个FTP服务器所应该具有的功能,能够解释一般的FTP命令,符合相应的规范。

四、参考文献

[1]蔡勇.FTP服务器技术研究及实现[D].电子科技大学,2005.[2]王占军,王伟,赵志刚.基于FTP协议的文件传输组件设计与实现[J].沈阳师范大学学报(自然科学版),2012,03:375-377.[3]吴珂,卢秉亮,张磊.基于FTP协议客户端软件的实现[J].沈阳航空工业学院学报,2006,04:39-42.五、源代码

// stdafx.cpp : source file that includes just the standard includes // FTPServer.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information

#include “stdafx.h” CString BrowseForFolder(HWND hWnd, LPCSTR lpszTitle, UINT nFlags){ // We're going to use the shell to display a

// “Choose Directory” dialog box for the user.CString strResult = “";

LPMALLOC lpMalloc;

if(::SHGetMalloc(&lpMalloc)!= NOERROR){

// failed to get allocator

return strResult;

}

char szBuffer[_MAX_PATH];char szDisplayName[_MAX_PATH];

BROWSEINFO browseInfo;browseInfo.hwndOwner = hWnd;// set root at Desktop browseInfo.pidlRoot = NULL;

browseInfo.pszDisplayName = szDisplayName;browseInfo.lpszTitle = lpszTitle;browseInfo.ulFlags = nFlags;browseInfo.lpfn = NULL;browseInfo.lParam = 0;

LPITEMIDLIST lpItemIDList;

if((lpItemIDList = ::SHBrowseForFolder(&browseInfo))!= NULL){

// Get the path of the selected folder from the item ID list.if(::SHGetPathFromIDList(lpItemIDList, szBuffer))

{

// At this point, szBuffer contains the path the user chose.if(szBuffer[0] == '')

{

// SHGetPathFromIDList failed, or SHBrowseForFolder failed.AfxMessageBox(”Failed to get directory“, MB_ICONSTOP|MB_OK);

return strResult;

}

// We have a path in szBuffer!

strResult = szBuffer;

return strResult;

}

else

{

// The thing referred to by lpItemIDList

// might not have been a file system object.// For whatever reason, SHGetPathFromIDList didn't work!

AfxMessageBox(”Failed to get directory“, MB_ICONSTOP|MB_OK);

return strResult;// strResult is empty

}

lpMalloc->Free(lpItemIDList);

lpMalloc->Release();

} return strResult;}

void DoEvents(){ MSG msg;

// window message

while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

} void GetAppDir(CString& strAppDir){ TCHAR szFullPath[MAX_PATH];TCHAR szDir[_MAX_DIR];TCHAR szDrive[_MAX_DRIVE];

// Get application's full path.::GetModuleFileName(NULL, szFullPath, MAX_PATH);

// Break full path into seperate components._splitpath(szFullPath, szDrive, szDir, NULL, NULL);// Store application's drive and path strAppDir.Format(_T(”%s%s“), szDrive, szDir);} PFNSHGETFOLDERPATHA GetFuncPtr_SHGetFolderPathA(){ static HMODULE hMod = NULL;PFNSHGETFOLDERPATHA pSHGetFolderPath = NULL;// Load SHFolder.dll only once if(!hMod)

hMod = LoadLibrary(”SHFolder.dll“);

// Obtain a pointer to the SHGetFolderPathA function if(hMod)

pSHGetFolderPath =(PFNSHGETFOLDERPATHA)GetProcAddress(hMod, ”SHGetFolderPathA“);return pSHGetFolderPath;}

HRESULT CreateStartMenuShortcut(LPSTR lpszShortcutFile, LPSTR lpszDescription, LPTSTR lpszRelativeFolder){ HRESULT hr;PFNSHGETFOLDERPATHA pSHGetFolderPath = NULL;TCHAR lpszLink[MAX_PATH];BOOL bFound = FALSE;

pSHGetFolderPath = GetFuncPtr_SHGetFolderPathA();

// Find the current user's Start Menu Programs folder if(pSHGetFolderPath)

bFound = SUCCEEDED(pSHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, 0, lpszLink));

if(bFound){

// Proceed to create the shortcut

IShellLink *pIShellLink = NULL;

IPersistFile *ppf = NULL;

WCHAR pLinkUnicode[MAX_PATH];

CoInitialize(NULL);

// Get a pointer to the IShellLink interface.hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,IID_IShellLink,(void **)&pIShellLink);

if(SUCCEEDED(hr))

{

// Get a pointer to IPersistFile interface for saving shortcut

hr = pIShellLink->QueryInterface(IID_IPersistFile,(void **)&ppf);

if(SUCCEEDED(hr))

{

hr = pIShellLink->SetPath(lpszShortcutFile);

hr = pIShellLink->SetDescription(lpszDescription);

if(SUCCEEDED(hr))

{

// Add the target folder to the Start Menu Programs path

lstrcat(lpszLink, ”“);

lstrcat(lpszLink, lpszRelativeFolder);

lstrcat(lpszLink, ”“);

// Create the directory if it does not exist

CreateDirectory(lpszLink,NULL);

// Add the file name for the shortcut

lstrcat(lpszLink, lpszDescription);

lstrcat(lpszLink, ”.lnk“);

// Convert string to Unicode, and call IPersistFile::Save()

MultiByteToWideChar(CP_ACP, 0, lpszLink,-1, MAX_PATH);

hr = ppf->Save(pLinkUnicode, TRUE);

}

ppf->Release();

}

pIShellLink->Release();

}

CoUninitialize();

pLinkUnicode, } return hr;}

void RemoveStartMenuShortcut(LPSTR lpszDescription, LPTSTR lpszRelativeFolder){ PFNSHGETFOLDERPATHA pSHGetFolderPath = NULL;TCHAR lpszLink[MAX_PATH];BOOL bFound = FALSE;

pSHGetFolderPath = GetFuncPtr_SHGetFolderPathA();

// Find the current user's Start Menu Programs folder if(pSHGetFolderPath)

bFound = SUCCEEDED(pSHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, 0, lpszLink));if(bFound){

// Add the target folder to the Start Menu Programs path

lstrcat(lpszLink, ”“);

lstrcat(lpszLink, lpszRelativeFolder);

lstrcat(lpszLink, ”“);

// Add the file name for the shortcut

lstrcat(lpszLink, lpszDescription);

lstrcat(lpszLink, ”.lnk“);

DeleteFile(lpszLink);} }

CString GetShortcutTarget(LPCTSTR lpszFilename){ CoInitialize(0);

CString strResult;HRESULT hResult;IShellLink *psl;char szPath[MAX_PATH];WIN32_FIND_DATA findData;// Get a pointer to the IShellLink interface.hResult = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink,(void **)&psl);if(SUCCEEDED(hResult)){

IPersistFile *ppf;

// Get a pointer to the IPersistFile interface.hResult = psl->QueryInterface(IID_IPersistFile,(void **)&ppf);

if(SUCCEEDED(hResult))

{

WORD wsz [MAX_PATH];// buffer for Unicode string

// Ensure that the string consists of Unicode characters.MultiByteToWideChar(CP_ACP, 0, lpszFilename,-1, wsz, MAX_PATH);

// Load the shortcut.hResult = ppf->Load(wsz, STGM_READ);

if(SUCCEEDED(hResult))

{

// Resolve the shortcut.hResult = psl->Resolve(0, SLR_ANY_MATCH|SLR_NO_UI);

if(SUCCEEDED(hResult))

{

lstrcpy(szPath, lpszFilename);

// Get the path to the shortcut target.hResult = psl->GetPath(szPath, MAX_PATH,(WIN32_FIND_DATA *)&findData, 0);

strResult = szPath;

}

}

// Release the pointer to IPersistFile.ppf->Release();

}

// Release the pointer to IShellLink.psl->Release();} CoUninitialize();

if(SUCCEEDED(hResult))

return strResult;else

return ”“;} // Pump messages while waiting for event BOOL WaitWithMessageLoop(HANDLE hEvent, int nTimeout){

DWORD dwRet;while(1){

// wait for event or message, if it's a message, process it and return to waiting state

dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, nTimeout, QS_ALLINPUT);

if(dwRet == WAIT_OBJECT_0)

{

TRACE0(”WaitWithMessageLoop()event triggered.n");

return TRUE;

}

else

if(dwRet == WAIT_OBJECT_0 + 1)

{

// process window messages

AfxGetApp()->PumpMessage();

}

else

if(dwRet == WAIT_TIMEOUT)

{

// timed out!

return FALSE;

}

else

{

// WAIT_ABANDONED_0...return TRUE;

} } } void AutoSizeColumns(CListCtrl *pListCtrl){ // Call this after your the control is filled pListCtrl->SetRedraw(FALSE);int mincol = 0;

int maxcol = pListCtrl->GetHeaderCtrl()->GetItemCount()-1;

for(int col = mincol;col <= maxcol;col++)

{

pListCtrl->SetColumnWidth(col, LVSCW_AUTOSIZE);

int wc1 = pListCtrl->GetColumnWidth(col);

pListCtrl->SetColumnWidth(col, LVSCW_AUTOSIZE_USEHEADER);

int wc2 = pListCtrl->GetColumnWidth(col);

// 10 is minumim column width

int wc = max(10, max(wc1,wc2));

pListCtrl->SetColumnWidth(col,wc);

}

pListCtrl->SetRedraw(TRUE);}

第四篇:AES-CMAC实验报告 -信息与通信安全

课程名称:姓

名:选择课题:系:专

业:学

号:指导教师:

本科实验报告

信息与通信安全

C/C++实现加解密算法及其应用(实验一)

信电系 信息与通信工程

****年**月**日

目录

1.实验内容与要求.......................................................................................................................3 2.实验原理....................................................................................................................................3

2.1 AES原理..........................................................................................................................3

2.1.1 AES总体结构.......................................................................................................3 2.1.2 AES详细结构.......................................................................................................4 1.1 2.CMAC原理................................................................................................................7

实验环境...........................................................................................................................9

4. 代码实现...............................................................................................................................9

4.1字节代替变换.................................................................................................................9 4.2 行移位变换..................................................................................................................11 4.3列混淆变换...................................................................................................................14 4.4 轮密钥加......................................................................................................................17 4.5 AES的加密与解密的实现............................................................................................22 4.6 CMAC代码实现............................................................................................................23 5.思考题...................................................................................................................................27 6.心得体会...............................................................................................................................27 附录(完整程序).....................................................................................................................28

1.实验内容与要求

(1).复习AES原理。

(2).用C/C++编写AES算法并调试通过。(3).复习CMAC原理。

(4).在实现AES基础上,用C/C++编写CMAC算法并调试通过。(5).回答下列思考题。

 AES解密算法和AES的逆算法之间有什么不同?  CMAC与HMAC相比,有什么优点?

2.实验原理

2.1 AES原理 2.1.1 AES总体结构

下图展示了AES加密过程的总体结构。明文分组长度为128位即16字节密钥长度可以为16,24或32字节(在本次设计中选择16字节)。

加密和解密算法是输入是一个128位的分组。在FIPS PUB 197中,这个分组被描述为4*4的字节方阵。这个分组被复制到state数组,饼子啊加密或解密的各个阶段被修改。同样,密钥也被描述为字节的方阵,并被扩展为44字的密钥字序列。

密码由N轮组成,其中轮数依赖于密钥长度,16字节密钥是10轮,前N-1轮由4个不同的变换组成:字节代替,行位移,列混淆,轮密钥加。最后一轮包含三个变换,而在第一轮的前面有一个起始的单变换(轮密钥加),可视为第0轮。每一个变换输入一个活多个4*4的矩阵,并输出一个4*4的矩阵,最后一轮输出为密文。同样,密钥扩展函数为N+1轮密钥,它们是互不相同的4*4矩阵。每一个轮密钥作为每轮的轮密钥加变换的一种输入。

2.1.2 AES详细结构

1)

AES算法未使用Feisel结构,而是在每一轮都使用代替和混淆将整个数据分组作为一个单一的矩阵处理。

2)输入的密钥被扩展为44个32位字所组成的数组w[i],每轮由四个不同的字作为该轮的轮密钥。3)由四个不同的阶段组成,包括一个置换和三个代替。字节代替:

用一个S盒完成分组的字节到字节的代替。行位移:

一个简单的置换。列混淆:

利用GF(2^8)上的算术特性的一个代替。轮密钥加:

当前分组和扩展秘钥的一部分进行按位异或。

(一)字节代替变换

如上图,字节代替变换是一个简单的查表操作。AES定义了一个S盒,它由16*16个字节组成的矩阵,包含了8位所能表示的256个数的一个置换。State中 的每个字节按照如下的方式映射为一个新的字节,把改字节的搞4位作为行值,低四位作为列值,以这些行列值作为索引从S盒的对应位置取出元素作为输出。而其逆向操作则是有对应的逆S盒可进行查表。

(二)行移位变换

如上图,其正向行移位变换中,state的第一行保持不变,把state的第二行循环左移一个字节,state的第三行循环左移两个字节,state的第四行循环左移四个字节。例如:

逆向行移位变换将state中的后三行执行相反方向的一位操作即可。

(三)列混淆变换

如上图,列混淆的正向变换是对每列单独进行操作。每列中的每个字节被映射为一个新值,此值由该列中的4个字通过函数变换得到。这个变换可有下面基于state的矩阵乘法表示:

乘积矩阵中的每个元素军事一行和一列中对应元素的乘积之和。这里的乘法和假发都是定义在GF(2^n)上的。状态中单列的列混淆变换可表示为:

其中一个例子如下:

(四)轮密钥加变换

如上图,在轮密钥加变换中,128位的state按位与128位的轮秘钥XOR。该操作可以视为state的一列中的四个字节与轮秘钥的一个字进行列间的操作,例如:

(五)AES密钥扩展

AES密钥扩展算法的输入值是一个4个字,输出值是一个由44个字组成的移位线性数组。

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

个情形中,三个使用了异或。对w数组中下标为4的倍数的的元素采用了更复杂的函数来计算:

(1)字循环的功能时使一个字中的四个字节的循环左移一个字节,即将输入字[B0,B1,B2,B3]变成为[B1,B2,B3,B0].(2)字代替利用S盒对输入字中的每个字节进行字节代替。(3)步骤1和步骤2的结果再与轮常量Rcon[j]相异或。

1.1 CMAC原理

基于密码的消息认证码(CMAC)对于AES,3DES适用,它使用三个密钥:一个密钥长为K,用在密文分组链接的每一步,两个长度为n的密钥,其中k是密钥长度,n为密文分组长度。并且两个n位的密钥可以从加密密钥导出,而不是单独提供。首先,当消息长度是分组长度b的n倍时,我们考虑CMAC的运算情况。对AES,b=128,对于3DES,b=64.这个消息被划分为n组,(M1,M2…,Mn)。算法使用了k比特的加密密钥K和n比特的常数K1。对于AES,密钥长度k为128,192和256比特,对于3DES,密钥长度为112或168比特。CMAC按如下方式计算:

C1E(K,M1)C2E(K,[M2C1])C3E(K,[M3C2])...CnE(K,[MNCn1K1])TMSBTlen(Cn)其中:

T——消息认证码,也称为tag Tlen——T的比特长度

MSBs(X)——比特串X最左边的s位

如果消息不是密文分组长度的整数倍,则最后分组的右边(低有效位)填充一个1和若干个0,使得最后的分组长度为b。除了使用一个不同的n比特密钥K2代替K1外,与前面所述一样进行CMAC运算。

两个n比特的密钥由k比特的加密密钥按如下方式导出:

LE(K,0n)K1LxK2LX2(Lx)x其中乘法(·)是在域GF(2^n)内进行,X和X^2是该域的一次和二次多项式。因此X的二元表示为n-2个0,后跟10,X^2的二元表示为n-3个0,后跟100。对于AES,已获批准的分组长度为X^128 +X^7 +X^2 +X+2.。

当消息长度是分组长度的整数倍:

当消息长度不是分组长度的整数倍:

2.实验环境

装有C_Free 的笔记本

4. 代码实现

首先是实现AES的各个子模块,在验证其正确以后,再进行CMAC的认证算法的实现。

4.1字节代替变换

#include

static unsigned char Sbox[256] =

{ //AES的S盒

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 };

static unsigned char InvSbox[256] = { // AES的逆S盒

0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };

//字节代替变换

void Sub_Byte(unsigned char state[4][4]){ int i,j;

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

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

state[i][j]=Sbox[state[i][j]];

} //逆向字节代替

void Inv_Sub_Byte(unsigned char state[4][4]){ int i,j;

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

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

state[i][j]=InvSbox[state[i][j]];

}

int main(){ unsigned char state[4][4]={

{0xea,0x04,0x65,0x85},{0x83,0x45,0x5d,0x96},{0x5c,0x33,0x98,0xb0},{0xf0,0x2d,0xad,0xc5}

};int i,j;//正向替换 Sub_Byte(state);

printf(“正向代替结果:n”);for(i=0;i<4;i++)

{

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

printf(“%x ”,state[i][j]);

printf(“n”);

}

printf(“n”);//反向替换

Inv_Sub_Byte(state);

printf(“反向代替结果:n”);

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

{

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

printf(“%x ”,state[i][j]);

printf(“n”);

}

}

其测试结果如下,可见该功能可实现是正确的。

4.2 行移位变换

#include

//行移位

void Row_Shift(unsigned char state[4][4]){ int i;unsigned char temp;

} //第一行保持不变,第二行左移一位

temp=state[1][0];for(i=0;i<3;i++)state[1][i]=state[1][i+1];state[1][3]=temp;

//第三行左移2位 temp=state[2][0];state[2][0]=state[2][2];state[2][2]=temp;

temp=state[2][1];state[2][1]=state[2][3];state[2][3]=temp;

//第四行左移3位

temp=state[3][3];for(i=3;i>0;i--)state[3][i]=state[3][i-1];state[3][0]=temp;

//逆向行移位

void Inv_Row_Shift(unsigned char state[4][4]){ int i;unsigned char temp;

//第一行保持不变,第二行右移一位

temp=state[1][3];for(i=3;i>0;i--)state[1][i]=state[1][i-1];state[1][0]=temp;

//第三行右移二位 temp=state[2][0];state[2][0]=state[2][2];state[2][2]=temp;

temp=state[2][1];state[2][1]=state[2][3];state[2][3]=temp;

//第四行右移三位 temp=state[3][0];for(i=0;i<3;i++)state[3][i]=state[3][i+1];state[3][3]=temp;}

int main(){ int i,j;unsigned char state[4][4]={

{0x87,0xf2,0x4d,0x97},{0xec,0x6e,0x4c,0x90},{0x4a,0xc3,0x46,0xe7},{0x8c,0xd8,0x95,0xa6}

};

Row_Shift(state);printf(“正向行移位变换:n”);for(i=0;i<4;i++)

{

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

printf(“%02x ”,state[i][j]);

printf(“n”);

}

printf(“n”);

Inv_Row_Shift(state);

printf(“反向向行移位变换:n”);

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

{

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

printf(“%02x ”,state[i][j]);

printf(“n”);

} } 测试结果如下

通过比较,可知结果正确,因此该子模块实现。

4.3列混淆变换

#include //乘法处理部分

unsigned char x_time2(unsigned char state)//乘2处理

{

unsigned char temp;

if(state>=0x80)

temp=(state<<1)^0x1b;//判断b7=1?

else

temp=(state<<1);

return temp;}

unsigned char x_time3(unsigned char state)//乘3处理

{

state=state^x_time2(state);

return state;}

unsigned char x_time4(unsigned char state)//乘4处理

{

state=x_time2(x_time2(state));

return state;}

unsigned char x_time8(unsigned char state)//乘8处理14

{

state=x_time2(x_time2(x_time2(state)));

return state;}

unsigned char x_time9(unsigned char state)//乘9处理

{

state=state^x_time8(state);

return state;}

unsigned char x_timeB(unsigned char state)//乘B处理

{

state=state^x_time2(state)^x_time8(state);

return state;}

unsigned char x_timeD(unsigned char state)//乘D处理

{

state=state^x_time4(state)^x_time8(state);

return state;}

unsigned char x_timeE(unsigned char state)//乘E处理

{

state=x_time2(state)^x_time4(state)^x_time8(state);

return state;}

void MixColumns(unsigned char state[4][4]){

int i,j;unsigned char state_1[4][4];

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

state_1[i][j]=state[i][j];

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

{

state[0][j]=x_time2(state_1[0][j])^x_time3(state_1[1][j])^state_1[2][j]^state_1[3][j];

state[1][j]=state_1[0][j]^x_time2(state_1[1][j])^x_time3(state_1[2][j])^state_1[3][j];

state[2][j]=state_1[0][j]^state_1[1][j]^x_time2(state_1[2][j])^x_time3(state_1[3][j]);

state[3][j]=x_time3(state_1[0][j])^state_1[1][j]^state_1[2][j]^x_time2(state_1[3][j]);} } //逆向列混淆

void Inv_MixColumns(unsigned char state[4][4]){ int i,j;unsigned char state_1[4][4];

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

state_1[i][j]=state[i][j];

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

state[0][j]=x_timeE(state_1[0][j])^x_timeB(state_1[1][j])^x_timeD(state_1[2][j])^x_time9(state_1[3][j]);

state[1][j]=x_time9(state_1[0][j])^x_timeE(state_1[1][j])^x_timeB(state_1[2][j])^x_timeD(state_1[3][j]);

state[2][j]=x_timeD(state_1[0][j])^x_time9(state_1[1][j])^x_timeE(state_1[2][j])^x_timeB(state_1[3][j]);

state[3][j]=x_timeB(state_1[0][j])^x_timeD(state_1[1][j])^x_time9(state_1[2][j])^x_timeE(state_1[3][j]);} } int main(){ int i,j;unsigned char state[4][4]={

{0x87,0xf2,0x4d,0x97},{0x6e,0x4c,0x90,0xec},{0x46,0xe7,0x4a,0xc3},{0xa6,0x8c,0xd8,0x95}

};

MixColumns(state);

printf(“正向列混淆结果: n”);

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

{

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

printf(“%x ”,state[i][j]);

printf(“n”);

}

printf(“n”);

Inv_MixColumns(state);

printf(“逆向列混淆结果: n”);

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

{

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

printf(“%x ”,state[i][j]);

printf(“n”);

}

} 其测试结果如下:

通过比较,可知结果正确,因此该子模块实现。

4.4 轮密钥加

#include static unsigned char key[16];static unsigned char ex_key[176];static unsigned char round_key[11][16];static unsigned char Sbox[256] =

{ //AES的S盒

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 };

//秘钥扩展

void key_Expansion(unsigned char key[16]){ int i,j,k;

unsigned char temp[4];//用于寄存w[i-1]

unsigned char t;

unsigned char RC[10]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36};

unsigned char Rcon[10][4]={{0x01,0x0,0x0,0x0},{0x02,0x0,0x0,0x0},{0x04,0x0,0x0,0x0},{0x08,0x0,0x0,0x0},{0x10,0x0,0x0,0x0},{0x20,0x0,0x0,0x0},{0x40,0x0,0x0,0x0},{0x80,0x0,0x0,0x0},{0x1b,0x0,0x0,0x0},{0x36,0x0,0x0,0x0},};

//轮常量

for(i=0;i<16;i++)//将输入秘钥复制到扩展秘钥数组的前四个字

{

ex_key[i]=key[i];

}

for(i=16;i<176;i+=4)//秘钥扩展

{

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

temp[j]=ex_key[i-4+j];//用于寄存w[i-1]

if(i%16==0)//对于w[i]中下标为的4的倍数要使用函数g来计算

{

//循环左移

t=temp[0];

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

temp[k]=temp[k+1];

temp[3]=t;

//字代替

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

temp[k]=Sbox[temp[k]];

//与轮常量相异或

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

temp[k]=temp[k]^Rcon[i/16-1][k];}

// 得到最后的w[i],w[i]=w[i-1]^w[i-4]

for(k=i;k

ex_key[k]=ex_key[k-16]^temp[k-i];

}

} //第k轮的轮密钥加

void RoundKey(unsigned char state[4][4],int k){ int i,j;

for(i=0;i<16;i++)round_key[k][i]=ex_key[16*k+i];//第k轮的轮密钥生成 for(i=0;i<4;i++)

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

state[i][j]=state[i][j]^round_key[k][4*j+i];

}

int main(){

unsigned char key[16]={0x0f,0x15,0x71,0xc9,0x47,0xd9,0xe8,0x59,0x0c,0xb7,0xad,0xd6,0xaf,0x7f,0x67,0x98};unsigned char state[4][4]={

{0xb9,0x94,0x57,0x75},{0xe4,0x8e,0x16,0x51},{0x47,0x20,0x9a,0x3f},{0xc5,0xd6,0xf5,0x3b}

};int i,j;

key_Expansion(key);

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

{

for(j=0;j<16;j++)round_key[i][j]=ex_key[16*i+j];//第k轮的轮密钥生成}

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

{

printf(“第%d轮密钥:n”,i);

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

{

printf(“%02x ”,round_key[i][j]);

if((j+1)%4==0)

printf(“n”);

}

printf(“n”);

}

RoundKey(state,1);

printf(“第一轮结束后的state输出:n”);

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

{

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

printf(“%02x ”,state[i][j]);

printf(“n”);

}

return 0;} 扩展密钥数组如下:

经过比对,可知,密钥扩展是正确的。我又选取了第一轮的轮密钥加:

测试结果如下:

经过比对,可知道轮密钥加的结果是正确的。

4.5 AES的加密与解密的实现

(程序请见附录)参照书上给的例子: Plaintext[16]={ 0x01,0x23,0x45,0x67, 0x89,0xab,0xcd,0xef, 0xfe.0xdc,0xba,0x98, 0x76,0x54,0x32,0x10 } key[16]={ 0x0f,0x15,0x71,0xc9, 0x47,0xd9,0xe8,0x59, 0x0c,0xb7,0xad,0xd6, 0xaf,0x7f,0x67,0x98 };其理论结果为:

测试结果如下,经过比对可知结果正确。

4.6 CMAC代码实现

//先用k=128的加密秘钥key产生两个n位的秘钥key_1,key_2 void k1_k2(unsigned char key[16],unsigned char key_1[16],unsigned char key_2[16]){ unsigned char L[16];unsigned char zero_n[16]={0x00};int i;Encryption(zero_n,key,L);//即L=E(K,0^n)

//计算k1=L*x,其中多项式为x^128+x^7+x^2+x+1

if(L[0]>=0x80)

//判断最高位是否是1,若是,则需要约化,即左移一位后,再异或1000 0111=0x87

{

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

key_1[i]=L[i]<<1;//左移一位

key_1[15]=key_1[15]^0x87;

} else {

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

key_1[i]=L[i]<<1;}

//产生key_2=L*x^2=key_1*x

if(key_1[0]>=0x80){

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

key_2[i]=key_1[i]<<1;//左移一位

key_2[15]=key_2[15]^0x87;

}

} else {

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

key_2[i]=key_1[i]<<1;}

//对消息不是密文分组的整数倍,要在分组最后右边填充1及若干个0 //*last_text是最后一个不完整分组,length是最后一组的长度,out_text是填充后的输出

void fill(unsigned char *last_text,int length, unsigned char out_text[16]){ int i;

for(i=0;i<16;i++){

if(i

out_text[i]=last_text[i];

else if(i==length)

out_text[i]=0x80;

else

out_text[i]=0x00;

}

}

void AES_CMAC(unsigned char Mass[],unsigned char key[16],int length, unsigned char mac[]){ int i,j,n,last_l;int flag=0;//用于标记密文分组是否完整

unsigned char M_C1[16]={0x00},M_C2[16], M_C_K[16];//用于存放中间数据

unsigned char key_1[16],key_2[16];//分组密钥

unsigned char last[16],Cn[16];

n=(length+15)/16;//用于确定分几组

last_l=length%16;

k1_k2(key,key_1,key_2);

if(last_l==0)

flag=1;//表明是分组长度b=128的整数倍

if(flag==0)

fill(&Mass[16*(n-1)],last_l,last);//对前n-1轮

for(i=0;i

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

M_C2[j]=M_C1[j]^Mass[16*i+j];

Encryption(M_C2,key,M_C1);

}

if(flag==1)

{

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

M_C_K[i]=Mass[16*(n-1)+i]^M_C1[i]^key_1[i];

Encryption(M_C_K,key,Cn);

}

else {

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

M_C_K[i]=last[i]^M_C1[i]^key_2[i];

Encryption(M_C_K,key,Cn);

} for(i=0;i<16;i++)mac[i]=Cn[i];}

int main(){

unsigned char key[16],Mass[64],T[16];

int i,j,length;

printf(“请输入消息(64byte):n”);//输入消息

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

scanf(“%x”,&Mass[i]);

printf(“请输入密钥: n”);//输入密钥

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

scanf(“%x”,&key[i]);

printf(“需要使用的次数repeat=:n”);

scanf(“%d”,&repeat);

for(i=0;i

{

printf(“请输入不同的密文分组长度length:n”);

scanf(“%d”,&length);

printf(“AES-CMAC输出结果: n”);AES_CMAC(Mass,key,length,T);for(i=0;i<16;i++)

printf(“%x ”, T[i]);printf(“n”);} } 测试结果如下:

根据查阅的资料,可知测试结果是正确的。且从上述结果可知,对于不同的分组长度,输出结果相差很大。

5.思考题

1.AES解密算法和AES的逆算法之间有什么不同?

AES解密算法与其逆算法不同点在于解密算法对密文是先进行轮密钥加(对AES-128而言其扩展密钥是w[40,43])然后开始第一轮的逆向求解,而逆算法时对加密算法的求逆,即将第十轮的算法倒推回去,所以这里有区别。这是由AES特定结构所决定的。

2.CMAC与HMAC相比,有什么优点?

CMAC使用分组密码算法,而HMAC使用散列函数。因为HMAC是基于其所应用的hash函数的,若hash函数的结构存在缺陷,则HMAC的安全性就会大大降低。而CMAC的安全性采用的是分组密码算法,其安全性在于密钥的长度。CMAC的长度可以通过Tlen的变化而变化,输出位数更加灵活。

6.心得体会

首先,刚开始由于这方面知识掌握不是很好,在看完书后又查阅了大量资料,包括一些程序。在这样的一个基础上,对整个编程的思路有了一些认识,按照书本上的AES加密顺序,最先做的就是密钥扩展和轮密钥加。这个部分也是难度最大的部分,主要是输入的都是字节大小的,但密钥扩展后要求是以字为单位输出的。刚开始这个方面纠结了很久,最后为了整个程序比较清晰,还是决定全都以字节为单位,经过一定转换来得到相当于字的效果。

在完成密钥扩展且测试正确后,就开始按顺序设计,字节代替,行移位,列混淆。其中3盒和逆S盒是直接从网上下载的,其他的就是按照书上给的公式和流程图来完成,还是比较顺利的。其解密算法和加密算法也是大同小异的,只是在每个函数中修改一下相应的代码即可。在加密和解密算法都写完后,就是写main函数进行测试,刚开始发现结果总是不对,经过较长时间的查错,发现还是错在轮密钥加中数组转置引起的问题。

在AES设计万仇就是设计CMAC。关于这个程序书上涉及的也较少,但算法还是比较简单的,主要涉及产生两个子密钥和对不完整的分组填充。由于书上没有现有的例子可以参考,因此,我是参照其他同学的例子,进行比较,验证结果是正确的。

附录(完整程序)

#include #include #include #include

static unsigned char key[16];//输入秘钥

static unsigned char ex_key[176];//扩展密钥,其中每四个拼成的就是一个字的秘钥数组

//即w[i]=(ex_key[4*i],ex_key[4*i+1],ex_key[4*i+2],ex_key[4*i+3])static unsigned char round_key[11][16];//轮密钥

static unsigned char Sbox[256] =

{ //AES的S盒

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 };

static unsigned char InvSbox[256] = { // AES的逆S盒

0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };

//乘法处理部分

unsigned char x_time2(unsigned char state)//乘2处理

{

unsigned char temp;

if(state>=0x80)

temp=(state<<1)^0x1b;//判断b7=1?

else

temp=(state<<1);

return temp;}

unsigned char x_time3(unsigned char state)//乘3处理

{

state=state^x_time2(state);

return state;}

unsigned char x_time4(unsigned char state)//乘4处理

{

state=x_time2(x_time2(state));

return state;}

unsigned char x_time8(unsigned char state)//乘8处理

{

state=x_time2(x_time2(x_time2(state)));

return state;}

unsigned char x_time9(unsigned char state)//乘9处理

{

state=state^x_time8(state);

return state;}

unsigned char x_timeB(unsigned char state)//乘B处理

{

state=state^x_time2(state)^x_time8(state);

return state;}

unsigned char x_timeD(unsigned char state)//乘D处理

{

state=state^x_time4(state)^x_time8(state);

return state;}

unsigned char x_timeE(unsigned char state)//乘E处理

{

state=x_time2(state)^x_time4(state)^x_time8(state);

return state;}

//秘钥扩展

void key_Expansion(unsigned char key[16]){ int i,j,k;

unsigned char temp[4];//用于寄存w[i-1]

unsigned char t;

unsigned char RC[10]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36};

unsigned char Rcon[10][4]={{0x01,0x0,0x0,0x0},{0x02,0x0,0x0,0x0},{0x04,0x0,0x0,0x0},{0x08,0x0,0x0,0x0},{0x10,0x0,0x0,0x0},{0x20,0x0,0x0,0x0},{0x40,0x0,0x0,0x0},{0x80,0x0,0x0,0x0},{0x1b,0x0,0x0,0x0},{0x36,0x0,0x0,0x0}, };

//轮常量

for(i=0;i<16;i++)//将输入秘钥复制到扩展秘钥数组的前四个字

{

ex_key[i]=key[i];

}

for(i=16;i<176;i+=4)//秘钥扩展

{

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

temp[j]=ex_key[i-4+j];//用于寄存w[i-1]

if(i%16==0)//对于w[i]中下标为的4的倍数要使用函数g来计算

{

//循环左移

t=temp[0];

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

temp[k]=temp[k+1];

temp[3]=t;

//字代替

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

temp[k]=Sbox[temp[k]];

//与轮常量相异或

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

temp[k]=temp[k]^Rcon[i/16-1][k];}

// 得到最后的w[i],w[i]=w[i-1]^w[i-4]

for(k=i;k

ex_key[k]=ex_key[k-16]^temp[k-i];

}

}

//第k轮的轮密钥加

void RoundKey(unsigned char state[4][4],int k){ int i,j;

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

round_key[k][i]=ex_key[16*k+i];//第k轮的轮密钥生成 for(i=0;i<4;i++)

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

state[i][j]=state[i][j]^round_key[k][4*j+i];

}

//字节代替变换

void Sub_Byte(unsigned char state[4][4]){ int i,j;

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

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

state[i][j]=Sbox[state[i][j]];

}

//行移位

void Row_Shift(unsigned char state[4][4]){ int i;unsigned char temp;

//第一行保持不变,第二行左移一位

temp=state[1][0];for(i=0;i<3;i++)state[1][i]=state[1][i+1];state[1][3]=temp;

//第三行左移二位

temp=state[2][0];state[2][0]=state[2][2];state[2][2]=temp;

temp=state[2][1];state[2][1]=state[2][3];state[2][3]=temp;

//第四行左移三位,即右移一位

temp=state[3][3];for(i=3;i>0;i--)state[3][i]=state[3][i-1];

state[3][0]=temp;}

//列混淆变换

void MixColumns(unsigned char state[4][4]){

int i,j;unsigned char state_1[4][4];

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

state_1[i][j]=state[i][j];

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

state[0][j]=x_time2(state_1[0][j])^x_time3(state_1[1][j])^state_1[2][j]^state_1[3][j];

state[1][j]=state_1[0][j]^x_time2(state_1[1][j])^x_time3(state_1[2][j])^state_1[3][j];

state[2][j]=state_1[0][j]^state_1[1][j]^x_time2(state_1[2][j])^x_time3(state_1[3][j]);

state[3][j]=x_time3(state_1[0][j])^state_1[1][j]^state_1[2][j]^x_time2(state_1[3][j]);} }

//前9轮每轮有4个步骤

void Round_4(unsigned char state[4][4], int k){ Sub_Byte(state);Row_Shift(state);MixColumns(state);RoundKey(state,k);}

//第10轮有3个步骤

void Round_3(unsigned char state[4][4]){ Sub_Byte(state);Row_Shift(state);RoundKey(state,10);}

//加密算法,明文 Plaintext,密文CipherText,密钥 key

void Encryption(unsigned char Plaintext[16], unsigned char key[16], unsigned CipherText[16])

char

{

int i,j;unsigned char state[4][4];

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

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

state[j][i]=Plaintext[4*i+j];

key_Expansion(key);//密钥扩展

//初始轮秘钥加

RoundKey(state,0);//1~10轮

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

Round_4(state,i);

Round_3(state);

//产生密文

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

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

CipherText[4*i+j]=state[j][i];

}

/*////////////////////////////解密////////////////////////////////*/

//逆向行移位

void Inv_Row_Shift(unsigned char state[4][4]){ int i;unsigned char temp;

//第一行保持不变,第二行右移一位

temp=state[1][3];for(i=3;i>0;i--)state[1][i]=state[1][i-1];state[1][0]=temp;

//第三行右移2位

temp=state[2][0];state[2][0]=state[2][2];state[2][2]=temp;

temp=state[2][1];state[2][1]=state[2][3];

} state[2][3]=temp;

//第四行右移三位,即左移1位

temp=state[3][0];for(i=0;i<3;i++)state[3][i]=state[3][i+1];state[3][3]=temp;//逆向字节代替

void Inv_Sub_Byte(unsigned char state[4][4]){ int i,j;

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

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

state[i][j]=InvSbox[state[i][j]];

}

//逆向列混淆

void Inv_MixColumns(unsigned char state[4][4]){ int i,j;unsigned char state_1[4][4];

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

state_1[i][j]=state[i][j];

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

state[0][j]=x_timeE(state_1[0][j])^x_timeB(state_1[1][j])^x_timeD(state_1[2][j])^x_time9(state_1[3][j]);

state[1][j]=x_time9(state_1[0][j])^x_timeE(state_1[1][j])^x_timeB(state_1[2][j])^x_timeD(state_1[3][j]);

state[2][j]=x_timeD(state_1[0][j])^x_time9(state_1[1][j])^x_timeE(state_1[2][j])^x_timeB(state_1[3][j]);

state[3][j]=x_timeB(state_1[0][j])^x_timeD(state_1[1][j])^x_time9(state_1[2][j])^x_timeE(state_1[3][j]);

} }

//前9轮每轮有4个步骤

void Inv_Round_4(unsigned char state[4][4], int k){

Inv_Row_Shift(state);Inv_Sub_Byte(state);RoundKey(state,k);Inv_MixColumns(state);}

//第10轮有3个步骤

void Inv_Round_3(unsigned char state[4][4]){ Inv_Row_Shift(state);Inv_Sub_Byte(state);RoundKey(state,0);}

//解密算法,明文 Plaintext,密文CipherText,密钥 key

void Dencryption(unsigned char CipherText[16], unsigned char key[16], unsigned char Plaintext[16]){ int i,j;unsigned char state[4][4];

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

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

state[i][j]=CipherText[4*j+i];

key_Expansion(key);//密钥扩展

//初始轮密钥加

RoundKey(state,10);

//1~10轮

for(i=9;i>0;i--)

Inv_Round_4(state,i);Inv_Round_3(state);

//产生明文 for(i=0;i<4;i++)

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

Plaintext[4*i+j]=state[j][i];

}

/*/////////////////////////CMAC////////////////////////////*/ //先用k=128的加密秘钥key产生两个n位的秘钥key_1,key_2 void k1_k2(unsigned char key[16],unsigned char key_1[16],unsigned char key_2[16]){ unsigned char L[16];unsigned char zero_n[16]={0x00};int i;Encryption(zero_n,key,L);//即L=E(K,0^n)

//计算k1=L*x,其中多项式为x^128+x^7+x^2+x+1

if(L[0]>=0x80)

//判断最高位是否是1,若是,则需要约化,即左移一位后,再异或1000 0111=0x87

{

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

key_1[i]=L[i]<<1;//左移一位

key_1[15]=key_1[15]^0x87;

} else {

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

key_1[i]=L[i]<<1;}

//产生key_2=L*x^2=key_1*x

if(key_1[0]>=0x80){

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

key_2[i]=key_1[i]<<1;//左移一位

key_2[15]=key_2[15]^0x87;

} else {

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

key_2[i]=key_1[i]<<1;}

}

//对消息不是密文分组的整数倍,要在分组最后右边填充1及若干个0 //*last_text是最后一个不完整分组,length是最后一组的长度,out_text是填充后的输出

void fill(unsigned char *last_text,int length, unsigned char out_text[16]){ int i;

for(i=0;i<16;i++){

if(i

out_text[i]=last_text[i];

else if(i==length)

out_text[i]=0x80;

else

out_text[i]=0x00;

}

}

void AES_CMAC(unsigned char Mass[],unsigned char key[16],int length, unsigned char mac[]){ int i,j,n,last_l;

int flag=0;//用于标记密文分组是否完整

unsigned char M_C1[16]={0x00},M_C2[16], M_C_K[16];//用于存放中间数据 unsigned char key_1[16],key_2[16];//分组密钥 unsigned char last[16],Cn[16];

n=(length+15)/16;//用于确定分几组

last_l=length%16;

k1_k2(key,key_1,key_2);

if(last_l==0)

flag=1;//表明是分组长度b=128的整数倍

if(flag==0)

fill(&Mass[16*(n-1)],last_l,last);//对前n-1轮

for(i=0;i

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

M_C2[j]=M_C1[j]^Mass[16*i+j];

Encryption(M_C2,key,M_C1);

}

if(flag==1)

{

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

M_C_K[i]=Mass[16*(n-1)+i]^M_C1[i]^key_1[i];

Encryption(M_C_K,key,Cn);

}

else {

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

M_C_K[i]=last[i]^M_C1[i]^key_2[i];

Encryption(M_C_K,key,Cn);

} for(i=0;i<16;i++)mac[i]=Cn[i];}

/*///////////////////////////主函数//////////////////////*/ int main(){

unsigned char Plaintext_1[16]={0x00};unsigned char Ciphertext[16]={0x00};unsigned char Plaintext_2[16]={0x00};unsigned char Mass[64],T[16];

int i,j,length,repeat;//输入明文

printf(“请输入需要加密的明文 :n”);

for(i=0;i<16;i++)scanf(“%x”,&Plaintext_1[i]);

//输入密钥

printf(“请输入密钥:n”);for(i=0;i<16;i++)scanf(“%x”,&key[i]);

//加密

Encryption(Plaintext_1,key,Ciphertext);

printf(“加密后的输出密文:n”);

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

printf(“%02x ”,Ciphertext[i]);

printf(“n”);

//解密

Dencryption(Ciphertext,key,Plaintext_2);

printf(“解密后的输出明文:n”);

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

printf(“%02x ”,Plaintext_2[i]);

printf(“n”);

//CMAC

printf(“请输入消息(64byte):n”);//输入消息

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

{

printf(“%02x ”,Mass[i]);

if((i+1)%8==0)

printf(“n”);

}

printf(“需要使用的次数repeat=:n”);

scanf(“%d”,&repeat);

for(j=0;j

{

printf(“请输入不同的密文分组长度length:n”);

scanf(“%d”,&length);

printf(“AES-CMAC输出结果: n”);

AES_CMAC(Mass,key,length,T);

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

printf(“%02x ”, T[i]);

printf(“n”);

}

return 0;}

第五篇:信息检索实验报告

信息检索与利用实验报告

实验一

图书检索

1.自命题,利用不同检索途径查出本馆不同学科的图书四种,写出检索过程,记录书名、责任者、索取号和借阅状态。

1)

数据库名称:华中师范大学馆藏书刊检索

检索途径:出版社 检索词:中国邮电出版社

书名:Visual C++开发基于SNMP的网络管理软件 责任者:武孟军, 徐垅屸龑, 任相臣 索取号:TP393.07/1313 借阅状态:在馆

2)

数据库名称:华中师范大学馆藏书刊检索

检索途径:任意词

检索词:自然遗产

书名:世界自然与文化遗产 责任者:郭万平

索取号:K917/0711 借阅状态:在馆

3)

数据库名称:华中师范大学馆藏书刊检索

检索途径:主题词

检索词:数字图像处理

书名:数字图像处理实训教程

责任者:何金国

索取号:TN911.73/2186 借阅状态:在馆

4)

数据库名称:华中师范大学馆藏书刊检索

检索途径:任意词

检索词:青春 书名:说走就走的青春: 每一场旅行都是直抵内心的探险

责任者:汪晓敏

索取号:I267.4/3168 借阅状态:借出

2.查出校外图书馆不同学科图书两种,写出检索过程,记录书名、责任者、出

版者、出版时间。

1)

数据库名称:华中科技大学图书馆

检索途径:关键词

检索词:cocos2d

书名:Cocos2D应用开发实践指南

责任者:斯特劳戈(Strougo, Rod)著

温德里奇(Wenderlich, Ray)著

出版者:北京 : 机械工业出版社 出版时间:2013

2)

数据库名称:馆藏书刊检索

检索途径:关键词

检索词:会计

书名:财经法规与会计职业道德

责任者:会计从业资格考试研究中心 编

出版者:北京 : 地震出版社 出版时间:2014

3.利用图书联合目录查出图书两种,写出检索过程,记录书名、责任者、出版者、2-3个不同地区的馆藏情况。

1)

数据库名称:CALIS联合目录

检索途径: 书名 检索词:马克思

书名:马克思主义哲学

责任者:刘进田 主编;张鸿骊 主编;刘进田...[等] 撰稿;出版者:西安 : 陕西人民出版社

馆藏情况:纸本馆藏:西安建筑科技大学 西京学院

电子馆藏 :无该书电子馆藏信息

2)

数据库名称:CALIS联合目录

检索途径:主题词 检索词:linux 书名:Linux系统管理

责任者:吴绍炜 编著

出版者:北京 : 人民邮电出版社 馆藏情况:纸本馆藏

华中农业大学 武汉大学 湖北工程学院 武汉纺织大学 武汉生物工程学院 武汉东湖学院 中南财经政法大学 电子馆藏 :无该书电子馆藏信息

长江大学

4.自命题,查出两种电子图书,写出检索过程,记录书名、责任者、出版者。命题:会计

1)数据库名称:武汉大学图书馆电子数据库

检索途径: 主题词 检索词: 会计 书名: 会计学原理 责任者:夏益红

出版者:北京工业大学出版社

命题:c++ 2)

数据库名称:华中科技大学图书馆电子数据库

检索途径:主题词 检索词: c++ 书名:C++ primer plus 责任者: Stephen Prata.出版者:人民邮电出版社,

下载信息安全实验报告[精选五篇]word格式文档
下载信息安全实验报告[精选五篇].doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    计算机信息检索实验报告

    1、国内主要计算机检索系统 1、1 《中国学术期刊全文数据库》 (2004年10月1日前系统检索) 1、1、1课题:查找有关2001-2004年高层建筑结构抗震分析和设计方面的文章 从安大图书......

    网络信息检索实验报告

    网络信息检索的应用和发展趋势09软件1 W班09144136张越摘要:随着信息时代的到来,网上信息资源的数量、种类不断增加,电子信息资源日益丰富,互联网技术也日新月异、层出不穷,人们......

    《信息检索》实验报告[精选]

    《信息检索》实验报告 一、 OPAC检索 1. 利用“中图分类法”查找自己所在专业的分类号,并记录。再使用书目查询系统查找该分类下的一本图书,写出该书的书名、作者、出版社、出......

    信息资源管理实验报告三[定稿]

    实验报告三 “大数据”作为时下最火热的IT行业的词汇,随之而来的数据仓库、数据安全、数据分析、数据挖掘等等围绕大数据的商业价值的利用逐渐成为行业人士争相追捧的利润焦......

    电子商务安全实验报告

    实验名称:电子商务安全技术 2010081126吕吕一、实验目的: 通过本实验加深对电子商务安全威胁、重要性的理解,了解电子商务安全的措施及相关技术。二、实验内容: (1)上网搜集电子商......

    南京信息工程大学实验报告管理信息系统

    南京信息工程大学实验报告 实验课程:管理信息系统 专业班级:2011级财务管理指导教师:朱晓东 实验一:本实验素材(Excel 1)中提供了一个有关商店和区域销售的数据库,记录了每周在不......

    政府信息门户实验报告[本站推荐]

    实验信息报告 学号 姓名 专业实验一政府信息门户 实验目的: 1)初步掌握政府信息门户的相关知识点; 2)了解完成政府信息门户所涉及的角色,以及各角色所涉及的功能; 3)了解政府信息门......

    电子商务安全实验报告 总

    一.电子邮件签名的实验报告: 1.www.xiexiebang.com中安装根证书: (1)在中国数字认证网www.xiexiebang.com中选择“测试证书”—下载并安装根证书; (2)导入成功后,选择“测试证书”—用......