2019-2020-1 20175302 201752314 20175316 实验三 并发程序
实验三 并发程序-1
实验内容
学习使用Linux命令wc(1);
基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端;
客户端传一个文本文件给服务器;
服务器返加文本文件中的单词数。
设计实现
命令参数
-c
:统计字节数-l
:统计行数-m
:统计字符数。这个标志不能与 -c 标志一起使用。-w
:统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串-L
:打印最长行的长度-help
:显示帮助信息--version
:显示版本信息实现伪代码
int main() { fd = fopen()//打开文件; fscanf()//对文件的内容以字符串的形式进行读取 if..count++//设置条件,当满足字符串条件时计数; }
对于wc -w功能与我们统计单词个数相似,而其实现时:由' ','\n','\t','\r'作为分隔符
统计单词个数时,除上述分隔符,还加入了文本文件中常见的符号:'!','"','?','.',',','(',')',':',';','-'作为分隔符- 实现wc -w
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define BUFFERSIZE 1024 int main() { FILE *fp; char ch; char filename[100]; int flag=0,num=0; printf("input filename: "); scanf("%s",filename); if((fp = fopen(filename,"r"))==NULL) { printf("Failure to open %s\n",filename); exit(0); } while((ch=fgetc(fp))!=EOF) { if(ch==' ' || ch=='\n' || ch=='\t' || ch=='\r') { flag=0; } else { if(flag==0) { flag=1; num++; } } } printf("%c\n",num+48); fclose(fp); return 0; }
wc txt
- 实现单词个数统计
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define BUFFERSIZE 1024 /*int num=0; void wc(char buffer[],int size) { int i,flag=0; for(i=0;i<size;i++) { if(buffer[i]==' ' || buffer[i]=='\n' || buffer[i]=='\t' || buffer[i]=='\0' || buffer[i]=='!' || buffer[i]=='?' || buffer[i]=='"' || buffer[i]=='.' || buffer[i]== ',' || buffer[i]==':' || buffer[i]=='(' || buffer[i]==')' || buffer[i]==';' || buffer[i]=='■ ' || buffer[i]=='•' ) { flag=0; } else { if(flag==0) { num++; } flag=1; } } return num; }*/ int main() { FILE *fp; char ch; char filename[100]; int flag=0,num=0; printf("input filename: "); scanf("%s",filename); if((fp = fopen(filename,"r"))==NULL) { printf("Failure to open %s\n",filename); exit(0); } while((ch=fgetc(fp))!=EOF) { if(ch==' ' || ch=='\n' || ch=='\t' || ch=='\!' || ch=='\?' || ch=='\"' || ch=='\.' || ch== '\,' || ch=='\:' || ch=='\(' || ch=='\)' || ch=='\;' || ch=='\-') { flag=0; } else { if(flag==0) { flag=1; num++; } } } printf("%d\n",num); fclose(fp); return 0; }
客户端和服务器的通信过程
运行结果
0.注意不经老师允许不准烧写自己修改的代码 1.两人(个别三人)一组 2.参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.1-1.5安装MDK,JLink驱动,注意,要用系统管理员身分运行uVision4,破解MDK(破解程序中target一定选ARM) 3.提交破解程序中产生LIC的截图 4.提交破解成功的截图
实验步骤
- 运行
exp2/软件资料/MDK4.74/.exe
安装MDK-ARM - 安装JLink
- 破解MDK4.74:复制CID到keil-MDK注册机中,Target选择ARM,点击generate生成LIC
- 将LIC复制到keil4中的LIC输入框,点击Add LIC,破解完成。
实验二 固件程序设计-2-LED
实验内容
0. 注意不经老师允许不准烧写自己修改的代码 1. 参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.4” KEIL-MDK 中添加Z32 SC-000芯片库,提交安装截图 2. 参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.9”完成LED实验,注意“打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,进行下载调试。提交运行结果截图 3. 实验报告中分析代码
实验步骤
- 运行
exp2\软件资料\MDK-ARM-SC000\MDK-ARM_AddOn_SC000_Support.exe
安装SC000库 - 搭建Z32工程基础编程环境:建立new uVision Project,选择完安装路径后,弹出芯片库选择框,在下拉框中选择Generic SC000 Device Database,在弹出框中点开ARM目录,选择SC000。
- 打开
实验1-LED 闪烁\Z32HUA.uvproj
以打开LED闪烁实验项目,编译项目生成实验1-LED 闪烁\bin\Z32HUA.bin
- 将实验箱接入电源,连接实验箱与电脑,打开Z32下载调试工具
软件资料\Z32下载调试工具\NZDownloadTool.exe
打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,显示1设备已连接后,点击浏览,选择\实验 1-LED 闪烁\bin\Z32HUA.bin
,点击下载,绿色进度条加载完成后,程序下载成功 关闭Z32电源,再打开,下载完的程序自动运行,可以看到核心板上LED灯闪烁。
- 编译文件或下载文件(此处为了方便以后运用此软件,编译了文件)
芯片选择
- 搭建基础环境并连接设备
闪烁成功
实验二 固件程序设计-3-UART
实验内容
0. 注意不经老师允许不准烧写自己修改的代码 1. 参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.4” KEIL-MDK 中添加Z32 SC-000芯片库,提交安装截图 2. 参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.0”完成UART发送与中断接收实验,注意“打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,进行下载调试。提交运行结果截图 3. 实验报告中分析代码
实验步骤
- 打开实验 2-UART 发送与中断 接收
\Z32HUA.uvproj
以打开UART 发送与中断 接收实验项目,编译项目生成实验 2-UART 发送与中断接收\bin\Z32HUA.bin
- 将实验箱接入电源,连接实验箱与电脑,用 9 针串口线将
Z32
模块的串口与电脑USB
接口连接,打开Z32下载调试工具软件资料\Z32下载调试工具\NZDownloadTool.exe
打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,显示1设备已连接后,点击浏览,选择\实验 2-UART 发送与中断接收\bin\Z32HUA.bin,点击下载,绿色进度条加载完成后,程序下载成功 - 打开串口助手,设置相应参数。
- 关闭Z32电源,再打开,下载完的程序自动运行,在串口调试助手的字符串输入框输入字符串
abcdefgh
,然后点击发送按钮。 - 驱动安装
- 串口调试
实验二 固件程序设计-4-国密算法
实验内容
0. 网上搜集国密算法标准SM1,SM2,SM3,SM4 1. 网上找一下相应的代码和标准测试代码,在Ubuntu中分别用gcc和gcc-arm编译 2. 四个算法的用途? 3. 《密码学》课程中分别有哪些对应的算法? 4. 提交2,3两个问题的答案 5. 提交在Ubuntu中运行国密算法测试程序的截图
- SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
- SM2:用于实现数字签名密钥协商和数据加密等功能。
- SM3:适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。
- SM4:用于实现数据的加密/解密运算,以保证数据和信息的机密性。
- SM1:加密程度与AES相当
- SM2:椭圆曲线公钥密码算法、椭圆曲线密钥交换协议、椭圆曲线公钥加密算法
- SM3:密码杂凑算法
SM4:分组对称密码算法
SM3运行截图
- SM4运行截图
实验二 固件程序设计-5-SM1
实验内容
0.注意不经老师允许不准烧写自己修改的代码 1.参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.4” KEIL-MDK 中添加Z32 SC-000芯片库,提交安装截图 2.参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.16”完成SM1加密实验,注意“打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,进行下载调试。提交运行结果截图 3.实验报告中分析代码
实验步骤
- 打开实验 5-SM1\Z32HUA.uvproj以打开UART 发送与中断 接收实验项目,编译项目生成实验 8-SM1\bin\Z32HUA.bin
- 将实验箱接入电源,连接实验箱与电脑,用 9 针串口线将 Z32 模块的串口与电脑 USB 接口连接,打开Z32下载调试工具
软件资料\Z32下载调试工具\NZDownloadTool.exe
打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,显示1设备已连接后,点击浏览,选择\实验 8-SM1\bin\Z32HUA.bin
,点击下载,绿色进度条加载完成后,程序下载成功 - 打开串口助手,设置相应参数。
- 闭Z32电源,再打开,下载完的程序自动运行,显示屏显示“SLE4428 实验!请插入 IC 卡.”。插入IC卡后:用户代码为:”,第四行显示用户代码“D27600000400”。
- 接着按照显示屏上的提示进行。
实验二 固件程序设计-6-清理
实验结束后,把实验室原来的网线插回,否则以后做实验的同学无法开机 0.只有用实验室机器的小组做 1.提交你们小组使用的计算机的编号照片 2.提交插好网线的照片 3.提交盖好后盖的照片
实验中遇到的问题和解决方案
- 问题一:编译SM2的C文件时出现找不到库的问题。
- 解决方案:输入两条命令重装
sudo apt-get remove openssl libssl-dev sudo apt-get install openssl libssl-dev -y
- 问题二:LED与UART代码编译不通过
- 解决方案:将实验箱接入电源,连接实验箱与电脑,打开
Z32下载调试工具软件资料\Z32下载调试工具\NZDownloadTool.exe
,打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,显示1设备已连接后,点击浏览,选择\实验 1-LED 闪烁\bin\Z32HUA.bin
,点击下载,绿色进度条加载完成后,程序下载成功
实验心得与体会
本次实验利用uVision4破解MDK,通过串口助手实现试验箱Z32和电脑之间的数据传输和通信,学会了如何下载程序到试验箱和我国的密算法标准SM1,SM2,SM3,SM4,实验较为简单,但需要调试软件,需要耐心。
SM1:对应密码学分组密码算法,广泛应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政 务通、警务通等重要领域)。
SM2:对应密码学公钥密码算法RSA,用于加解密及数字签名。
SM3:对应密码学摘要算法MD5,适用于商用密码应用中的数字签名和验证。
SM4:对应密码学分组密码算法DES,用于无限局域网产品使用。