20175221-20175225-20175226 信息安全系统 实验二《固件程序设计》实验报告
实验小组成员:20175221 曾祥杰 20175225 张元瑞 20175226 王鹏雲
任务一【固件程序设计-1-MDK】
-
任务详情
-
注意不经老师允许不准烧写自己修改的代码 •1. 三人一组 •2. 参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.1-1.5安装MDK,JLink驱动,注意,要用系统管理员身分运行uVision4,破解MDK(破解程序中target一定选ARM) •3. 提交破解程序中产生LIC的截图 •4. 提交破解成功的截图
-
实验步骤
- 在exp2\软件资料\MDK4.74找到mdk474.exe文件,点击并安装
- 安装Ulink驱动
- 以管理员身份运行Keil uVision4
- File->License Management…,在弹出的窗口中复制CID;
- 在exp2\软件资料\keil-MDK注册机\keil mdk474注册机找到“KEIL MDK4.74crack.exe”,运行Keil-MDK注册机。将CID粘贴,“TARGET”选择“ARM”,然后点击Generate,生成LIC;
- 将LIC复制并粘贴到License Management窗口中的“New License ID Code(LID)”一栏中,最后“ADD LIC”。
-
任务二【固件程序设计-2-LED】
-
•任务详情 •注意不经老师允许不准烧写自己修改的代码 •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文件,安装路径选择Keil 4文件夹;
- 在 keil MDKkeil 工程选择 SC000库:用管理员身份打开uVision4
- Project->New uVision Project,并新建一个文件夹作为保存路径;
- 在芯片库选择Generic SC000 Device Database ;
- 点开 ARM 结构目录,选择 SC000;
- 编译.“exp2\LED闪烁”下的Z32.uvproj
- 用USB连接电脑和试验箱,并打开“exp2\软件资料\Z32下载调试工具”目录下的NZDloadTool.exe;
- 按住Reboot的同时两次开关试验箱左上角部分的电源开关;
- 左侧显示“设备已连接”后,下载LED项目编辑后生成的Z32HUA.bin,目录是“exp2\LED闪烁\bin”;
- 下载成功后关闭-打开电源
-
代码分析
1) 系统初始化
SystemInit ();
2)通过返回 boot 条件,判断程序是否进行下载
if(0 == GPIO_GetVal(0)) { BtApiBack(0x55555555, 0xAAAAAAAA); }
3) 将GPIO0设置为上拉输出
GPIO_PuPdSel(0,0); GPIO_InOutSet(0,0);
4) 设置LED 灯闪烁间隔
while(1) { delay(100); GPIO_SetVal(0,0); // 输出低电平,点亮 LEDLED delay(100); GPIO_SetVal(0,1); // 输出高电平,熄灭 LEDLED }
-
任务三【固件程序设计-3-UART】
-
要求:
-
0. 注意不经老师允许不准烧写自己修改的代码 1. 参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.4” KEIL-MDK 中添加 Z32 SC-000 芯片库,提交安装截图 2. 参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.0”完成UART发送与中断接收实验,注意“打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,进行下载调试。提交运行结果截图 3. 实验报告中分析代码
-
任务四【固件程序设计-4-国密算法】
-
要求:
0. 网上搜集国密算法标准SM1,SM2,SM3,SM4 1. 网上找一下相应的代码和标准测试代码,在Ubuntu中分别用gcc和gcc-arm编译 2. 四个算法的用途? 3. 《密码学》课程中分别有哪些对应的算法? 4. 提交2,3两个问题的答案 5. 提交在Ubuntu中运行国密算法测试程序的截图
-
算法的用途 :
- 用于实现商用密码算法的加密、解密和认证。比如:企业门禁管理、敏感信息的传输加解密,数字签名等。
-
对应的算法
-
国密算法 对应的密码学算法 SM1 未公布 SM2 ECC SM3 MD5 SM4 DES -
任务五【固件程序设计-5-SM1】
- 编译“exp2\SM1”中的Z32HUA.uvproj,并将生成的bin文件下载到实验箱;
- 使用串口线将电脑与Z32部分连接;
- 打开“exp2\软件资料\串口调试助手”中的“sscom42.exe”完成相关设定,关闭-打开实验箱Z32部分的电源开关;
- 按照电子屏的提示插入IC卡;
-
按A校验密码,成功后按1加密,可以看到明文,密钥,密文;
-
按A读取IC卡中的密文和密钥,读取成功后,按1选择用正确密钥加密
- 按A返回,再经过相同的过程,选择用错误密钥解密,最终可看到经过错误密钥解密的错误明文。
-
代码分析
1) 初始化 IC卡,检测IC卡插入端口 ;
GPIO_Config(6); GPIO_PuPdSel(6,0); GPIO_InOutSet(6,1);
2) 串口初始化;
UART_Init();
3) LCD灯初始化;
lcd_init();
4) 矩阵键盘初始化;
KEY_Init();
5) 液晶屏第一行显示“ SLE4428 实验!”
lcd_pos(0,0); lcd_string("SLE4428 实验!");
程序A:
6) 第二行显示“请插入 IC 卡”等待片插入;
lcd_pos(1,0); lcd_string("请插入IC卡"); delay(1000); if(GPIO_GetVal(6)==0) break;
7)若SLE4428 IC卡正确插入 ,第二行显示“已插入SLE4428 ”;卡片插入错误则第二行显示“卡不正确 ”;
if(SLE4428_InitAndRST(2)!=0xFFFFFFFF) { lcd_pos(1,0); lcd_string("已插入SLE4428"); } else { lcd_pos(1,0); lcd_string("卡不正确 "); SLE4428_Deactivation(); delay(1000); goto A; }
8) IC卡正确插入,则显示“用户代码为: XXXXXXXXXX ,等待按下键盘“ A”键;
lcd_pos(2,0); lcd_string("用户代码为:"); SLE4428_ReadData(0x15,UserCode,6); lcd_pos(3,0); for(UINT8 i=0;i<6;i++) lcd_Hex(UserCode[i]) ; while(KEY_ReadValue()!='A'); lcd_wcmd(0x01);
9) 按下“A”键,第一行显示“按-A键校验密码”,第二行显示“校验0xFF,0xFF ”,等待“A”键按下。
lcd_pos(0,0); lcd_string("按-A键校验密码"); lcd_pos(1,0); lcd_string("校验0xFF,0xFF"); while(KEY_ReadValue()!='A');
10) 按下“A”键,若密码正确第三行显示“校验成功”,否则显示“校验失败”。第四行显示剩余机会:X次,等待“A”键按下:
lcd_pos(2,0); if(SLE4428_PassWord(0xFF,0xFF)==1) lcd_string("校验成功!"); else {lcd_string("校验失败!"); return 0;} lcd_pos(3,0); switch(SLE4428_ReadByte(0x03fd)) { case 0xff: lcd_string("剩余机会 8次");break; case 0x7f: lcd_string("剩余机会 7次");break; case 0x3f: lcd_string("剩余机会 6次");break; case 0x1f: lcd_string("剩余机会 5次");break; case 0x0f: lcd_string("剩余机会 4次");break; case 0x07: lcd_string("剩余机会 3次");break; case 0x03: lcd_string("剩余机会 2次");break; case 0x01: lcd_string("剩余机会 1次");break; case 0x00: lcd_string("剩余机会 0次");break; default: break; } while(KEY_ReadValue()!='A');
B段程序:
11) 按下“A”键,第一、二、三行分别显示“加密解密实验”,“ 1. 加密”,“ 2. 解密”三个选项。等待按键1或2按下:如果“1”按下,跳转至加密程序段,如果“2”按下,跳转至解密程序段;
lcd_wcmd(0x01); lcd_pos(0,0); lcd_string("加密解密实验"); lcd_pos(1,0); lcd_string("1.加密"); lcd_pos(2,0); lcd_string("2.解密"); do { C=KEY_ReadValue(); } while(C!='1'&&C!='2'); lcd_wcmd(0x01); if(C=='1') goto jiami; else if(C=='2') goto jiemi; else ;
加密程序段:
12) 第一行显示“ 查看串口调试助手”,第二行显示“A键确认加密”,串口发送字符“将加密以下数据:”,并将加密前的数据发送至PC机,换行。串口继续发送“加密密钥:”,并将加密密钥数组发送至PC机,等待“A”键按下;
lcd_pos(0,0); lcd_string("查看串口调试助手"); lcd_pos(1,0); lcd_string("A 键确认加密"); UART_SendString("将加密以下数据:\r\n"); for(UINT8 i=0;i<16;i++) { UART_SendHex(jiamiqian[i]); } UART_SendString("\r\n"); UART_SendString("加密密钥:\r\n"); for(UINT8 i=0;i<16;i++) { UART_SendHex(jiamimiyue[i]); } UART_SendString("\r\n"); while(KEY_ReadValue()!='A');
13) SM1 初始化;
SM1_Init(jiamimiyue);
14) 开始 SM1 加密;
SM1_Crypto(jiamiqian, 16, 0, 0, 0,jiamihou);
15) 关闭 SM1 加密;
SM1_Close();
16) 串口发送“加密后的数据:”,并将加密后的数据发送至PC机, 换行。第三行显示“ 加密完成”,第四行显示“A键存入IC卡”。当“A”键按下后,向 SLE4428 IC卡发送加密后的数据, 串口发送“已将数据写入IC卡”。
UART_SendString("加密后的数据:\r\n"); for(UINT8 i=0;i<16;i++) { UART_SendHex(jiamihou[i]); } UART_SendString("\r\n"); lcd_pos(2,0); lcd_string("加密完成"); lcd_pos(3,0); lcd_string("A键存入IC卡"); while(KEY_ReadValue()!='A'); for(UINT8 i=0;i<16;i++) { SLE4428_Write_Byte(0x20+i,jiamihou[i]); } UART_SendString("已将数据写入IC卡。\r\n"); UART_SendString("\r\n"); goto B;
解密:
17) 初始化 SM1 ;
SM1_Init(jiemimiyue);
18) SM1 解密;
SM1_Crypto(jiemiqian, 16, 1, 0, 0,jiemihou);
19) 关闭 SM1 ;
SM1_Close();
20) 第二行“ 解密完成”,第三行“ A键返回”,串口显示 “解密后的数据为:”,按下“A”键,跳转至B段程序。
lcd_pos(1,0); lcd_string("解密完成"); lcd_pos(2,0); lcd_string("A键返回"); UART_SendString("解密后的数据为:\r\n"); for(UINT8 i=0;i<16;i++) { UART_SendHex(jiemihou[i]); } UART_SendString("\r\n"); UART_SendString("\r\n"); while(KEY_ReadValue()!='A'); goto B;
实验中的问题及解决过程
- 问题1:gcc编译国密时报错
- 问题1解决方法:
- gcc编译时提示错误:openssl/*.h:没有那个文件或目录
用sudo gcc *.c -o sm2test -lssl -lcrypto加上库。
再次使用该命令发现依然出现相同情况,搜索发现原因是ubuntu下缺少了部分组件,输入命令sudo apt-get install libssl-dev
arm-gcc编译时报错
项目依赖:libcypto和libssl,但是这都是用基于linux编译的,不能再arm-gcc上用,所以需要重新编译