2019-2020-1 20175221 20175225 20175226 实验二 固件程序设计

白昼怎懂夜的黑 提交于 2019-12-04 18:21:14

 

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上用,所以需要重新编译
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!