2018-2019-1 20165211 20165230 20165208 實驗二 固件程序設計-1

2018-2019-1 20165211 20165230 20165208 實驗二 固件程序設計

實驗步驟

1-MDK

實驗要求

  1. 注意不經老師容許不許燒寫本身修改的代碼
  2. 兩人(個別三人)一組
  3. 參考雲班課資源中「信息安全系統實驗箱指導書.pdf 「第一章,1.1-1.5安裝MDK,JLink驅動,注意,要用系統管理員身分運行uVision4,破解MDK(破解程序中target必定選ARM)
  4. 提交破解程序中產生LIC的截圖
  5. 提交破解成功的截圖

實驗過程

  1. 找到exp2\軟件資料\MDK4.74路徑下的mdk474.exe文件,點擊並安裝。注意此過程當中安裝目標路徑是本身建立的一個名爲Keil 4的文件夾
  2. 安裝Ulink驅動
  3. 在桌面上建立的快捷方式「Keil uVision4」上右鍵,選擇「以管理員身份運行」
  4. 點擊File->License Management…,在彈出的窗口中複製CID

5.打開exp2\軟件資料\keil-MDK註冊機\keil mdk474註冊機路徑下的KEIL MDK4.74crack.exe,運行Keil-MDK註冊機,將剛纔複製的CID粘貼到「CID」中,TARGET選擇ARM,而後點擊Generate,生成LIC
6.將LIC複製並將其粘貼到剛纔License Management窗口中的New License ID Code(LID)一欄中便可獲得結果算法


2-LED

實驗要求

  1. 注意不經老師容許不許燒寫本身修改的代碼
  2. 參考雲班課資源中「信息安全系統實驗箱指導書.pdf 「第一章,1.4」 KEIL-MDK 中添加 Z32 SC-000 芯片庫,提交安裝截圖
  3. 參考雲班課資源中「信息安全系統實驗箱指導書.pdf 「第一章,1.9」完成LED實驗,注意「打開Z32的電源開關前,按住Reboot按鍵不放,兩次打開電源開關,Z32便可被電腦識別,進行下載調試。提交運行結果截圖
  4. 實驗報告中分析代碼

實驗過程

  1. 安裝SC000庫:在任務一完成的基礎上,打開exp2\軟件資料\MDK-ARM-SC000庫支持路徑下的MDK-ARM_AddOn_SC000_Support.exe文件,安裝路徑咱們選擇剛纔建立的Keil 4文件夾

  1. 在 keil MDKkeil 工程選擇 SC000庫:用管理員身份打開uVision4,選擇而後點擊
    Project->New uVision Project
  2. 新建一個文件夾做爲新工程的保存路徑
  3. 在芯片庫 選擇框Generic SC000 Device Database
  4. 點開 ARM 結構目錄,選擇 SC000
  5. exp2\LED閃爍目錄下的Z32.uvproj工程文件,而後編譯;

7.用USB公對公線鏈接電腦和試驗箱;
打開exp2\軟件資料\Z32下載調試工具目錄下的NZDloadTool.exe;
8.按住Reboot按鈕的同時兩次開關試驗箱左上角部分的電源開關;
9.左側顯示「1設備已鏈接」後,下載LED項目編輯後生成的Z32HUA.bin文件,目錄是exp2\LED閃爍\bin;安全

10.下載成功後關閉-打開電源開關,便可看到LED燈L2閃爍的實驗現象。
併發

代碼分析

主函數代碼的執行過程爲:函數

1) 系統初始化,中斷設置使能全部;工具

SystemInit ();

2) 判斷按鍵,返回 boot 條件,確認是否進行程序下載;性能

if(0 == GPIO_GetVal(0))
{
    BtApiBack(0x55555555, 0xAAAAAAAA);
}

3) 設置 GPIO0 狀態爲上拉輸出;測試

GPIO_PuPdSel(0,0); // 設置 GPIO0 爲上拉
GPIO_InOutSet(0,0); //  //設置 GPIO0爲輸出

4) 進入循環程序, LED 燈間隔 100ms 閃爍。加密

while(1) 
{
delay(100);
GPIO_SetVal(0,0); // 輸出低電平,點亮 LEDLED
delay(100);
GPIO_SetVal(0,1); // 輸出高電平,熄滅 LEDLED
}

3-UART

實驗要求

  1. 注意不經老師容許不許燒寫本身修改的代碼
  2. 參考雲班課資源中「信息安全系統實驗箱指導書.pdf 「第一章,1.4」 KEIL-MDK 中添加 Z32 SC-000 芯片庫,提交安裝截圖
  3. 參考雲班課資源中「信息安全系統實驗箱指導書.pdf 「第一章,1.0」完成UART發送與中斷接收實驗,注意「打開Z32的電源開關前,按住Reboot按鍵不放,兩次打開電源開關,Z32便可被電腦識別,進行下載調試。提交運行結果截圖
  4. 實驗報告中分析代碼

實驗過程

1.打開exp2\UART發送與中斷接收目錄下的Z32HUA.uvproj工程文件並編譯;將生成的.bin文件下載到實驗箱設計

2.將實驗箱接入電源,鏈接實驗箱與電腦,用 9 針串口線將 Z32 模塊的串口與電腦 USB 接口鏈接,打開Z32下載調試工具軟件資料\Z32下載調試工具\NZDownloadTool.exe打開Z32的電源開關前,按住Reboot按鍵不放,兩次打開電源開關,Z32便可被電腦識別,顯示1設備已鏈接後,點擊瀏覽,選擇\實驗 2-UART 發送與中斷接收\bin\Z32HUA.bin,點擊下載,綠色進度條加載完成後,程序下載成功。
3.打開串口助手,設置相應參數。3d

4.關閉Z32電源,再打開,下載完的程序自動運行,在串口調試助手的字符串輸入框輸入字符串abcdefgh,而後點擊發送按鈕。

分析代碼

串口相關函數包括中斷服務、波特率設置初始化發送 /接收單 字節、發送符串單個十進制整數、發送某一長度的字符串、接收多字節函數:

1) void UART_IrqService(void) 是串口中 斷服務函數,本實驗現斷執行子程序,從 PC 端串口調試助手發送數據至 Z32 ,Z32 再經串口 發送給 PC 機;

void UART_IrqService(void)
{
    //*****your code*****/
    UARTCR &= ~TRS_EN;
    {
        do
        {
            shuju[uart_rx_num] = UARTDR;
                if(shuju[uart_rx_num]=='\r'||shuju[uart_rx_num]=='\n')
                {
                    shuju_lens = uart_rx_num;
                    uart_rx_num=0;
                    uart_rx_end=1;
                }
                else uart_rx_num++;
        }
        while(FIFO_NE & UARTISR);               
    }
    UARTCR |= TRS_EN;
}

2) void UART_BrpSet(UINT16 set) 是波特率設置 函數,串口實驗波特率設置爲 115200115200 ;

void UART_BrpSet(UINT16 set)
{
    UINT16 brp=0;
    UINT8 fd=0; 
    if(0 == set)
    {
        //uartband@115200bps
        fd = SCU->UARTCLKCR & 0x80; 
        switch(fd)
        {
            case 0x80:        /*內部時鐘12M晶振*/
                brp = 0x0068;
                break;
            case 0x00:        /*內部時鐘*/
                brp = 0x00AD;  
                break;        
            default:
                brp = 0x00AD;
                break;
        }
        fd = SCU->UARTCLKCR & 0x7f ; 
        brp =   brp/(fd+1);
    }
    else
    {
        brp = set;
    }
    UARTBRPH = (UINT8)((brp >> 8) & 0xFF);
    UARTBRPL = (UINT8)((brp) & 0xFF);
}

3) void UART_Init(void) 是串口初始化函數,,實現配 置串口時鐘、使能中斷;

void UART_Init(void)
{
    IOM->CRA |= (1<<0); //使能Uart接口
    SCU->MCGR2 |= (1<<3); //使能Uart總線時鐘

    /******配置Uart時鐘(建議使用外部晶振)******/
    SCU->SCFGOR |= (1<<6);//使用外部晶振
    SCU->UARTCLKCR |= (1<<7);//使用外部時鐘
//  SCU->UARTCLKCR &= ~(1<<7);//使用默認OSC時鐘

    UART_BrpSet(0);  //設置波特率爲默認115200
    UARTISR = 0xFF;  //狀態寄存器所有清除
    UARTCR |= FLUSH; //清除接收fifo
    UARTCR = 0;      //偶校驗


    /******配置中斷使能******/
    UARTIER |= FIFO_NE;
//  UARTIER |= FIFO_HF;
//  UARTIER |= FIFO_FU;
//  UARTIER |= FIFO_OV;
//  UARTIER |= TXEND;
//  UARTIER |= TRE; 
    ModuleIrqRegister(Uart_Exception, UART_IrqService); //掛載終端號
}

4) void UART_SendByte(UINT8 dat) 是發送單字節函數,使用此函數一次發 送一個字節數據 ;

void UART_SendByte(UINT8 dat)
{  
    UARTCR |= TRS_EN;
    UARTDR = dat;
    do
    {
       if(UARTISR & TXEND)
        {                                         
            UARTISR |= TXEND;//清楚發送完成標誌,寫1清除
            break;
        }
    }
    while (1);
    UARTCR &= (~TRS_EN);    
}

5) void UART_SendString(UINT8 * str) 是發送字符串函數 ,使用此函數發送 字符串數據 ;

void UART_SendString(UINT8 * str)
{
    UINT8 *p ;
    p=str;
    while(*p!=0)
    {
        UART_SendByte(*p++);
    }
}

6) void uart_SendString(UINT8 buf[],length) 是發送某一長度的字符 串函數,實現發送必定長度的字符據。

void uart_SendString(UINT8 buf[],UINT8 length)
{
    UINT8 i=0;
    while(length>i)
    {
        
        UART_SendByte(buf[i]);
        i=i+1;
    }
}

7) void UART_SendNum(INT32 num) 是發送單個十進制整數 函數,使用此 函數 發送一個十進制整數;

void UART_SendNum(INT32 num)
{
    INT32 cnt = num,k;
    UINT8 i,j;
    if(num<0) {UART_SendByte('-');num=-num;}
    //計算出i爲所發數據的位數
    for(i=1;;i++)
    {
        cnt = cnt/10;
        if(cnt == 0) break;
    }
    //算出最大被除數從高位分離
    k = 1;
    for(j=0;j<i-1;j++)
    {
        k = k*10;
    }
    //分離併發送各位
    cnt = num;
    for(j=0;j<i;j++)
    {
        cnt = num/k;
        num = num%k;
        UART_SendByte(0x30+cnt);
        k /= 10;
    }
}

8) void UART_SendHex(UINT8 dat) 是發送單個十六進制整數 函數,使用此 函數 發送一個十六進制整數;

void UART_SendHex(UINT8 dat)
{
    UINT8 ge,shi;
    UART_SendByte('0');
    UART_SendByte('x');
    ge = dat%16;
    shi = dat/16;
    if(ge>9) ge+=7;    //換成大寫字母
    if(shi>9) shi+=7;
    UART_SendByte(0x30+shi);
    UART_SendByte(0x30+ge);
    UART_SendByte(' ');
}

9) UINT8 UART_GetByte(*data) 是接收單字節函數 是接收單字節函數 數,使用此函數接 收單字節數據 ;

UINT8 UART_GetByte(UINT8 *data)
{

    UINT8 ret= 0; 
    if(0 != (UARTISR & FIFO_NE))
    {
        *data = UARTDR;
        ret = 1;
    } 
    return ret;
}

10) void UART_Receive(UINT8 *receive, len) 是接收多字節函數 ,使 用此函數接收多個字節據 ;

void UART_Receive(UINT8 *receive, UINT8 len)
{  
    while(len != 0)
    {
        if(len >= 4)
        {
            while (!(UARTISR & FIFO_FU));
            *receive++ = UARTDR;
            *receive++ = UARTDR;
            *receive++ = UARTDR;
            *receive++ = UARTDR;             
            len -= 4;
      
        }   
        else if(len >= 2)
        {
            while (!(UARTISR & FIFO_HF));               
            *receive++ = UARTDR;
            *receive++ = UARTDR;             
            len -= 2;
        }       
        else
        {
             while (!(UARTISR & FIFO_NE));
             *receive++ = UARTDR;
             len--;
        }
    }
}

主函數代碼的執行過程爲:

1) 系統初始化,中斷設置使能全部;(同任務二)

2) 判斷按鍵,返回 boot 條件,確認是否進行程序下載;(同任務二)

3) 初始化 Uart ,使能 Uart 接口,配置 Uart 中斷並使能;

UART_Init();    //初始化Uart

4) 先發送單個字符「 A」,換行,再發送字符串「 Welcome to Z32HUA! 」,換行,發送數字串「 換行,發送數字串「 1234567890 」,換行,再發送 16 位數「 位數「 0xAA」,換行。

UART_SendByte('A');                     //Uart發送一個字符 A
    UART_SendByte('\r');UART_SendByte('\n');//換行

    UART_SendString("Welcome to Z32HUA!");  //Uart發送字符串
    UART_SendByte('\r');UART_SendByte('\n');//換行

    UART_SendNum(1234567890);               //Uart發送一個十進制數
    UART_SendByte('\r');UART_SendByte('\n');//換行

    UART_SendHex(0xAA);                     //Uart發送一個十六進制數
    UART_SendByte('\r');UART_SendByte('\n');//換行

5) 進入 while 循環程序,等待串口中斷到來並判數據是否接收完畢若 中斷到來, 轉入執行串口服務程序待接收數據完畢,Z32將數據 發回串口助手

while(1)
    {
        if(uart_rx_end)
        {
            uart_rx_end=0;
            uart_SendString(shuju,shuju_lens);
        }
        
    } //等待接收中斷

4-國密算法

實驗要求

  1. 網上搜集國密算法標準SM1,SM2,SM3,SM4
  2. 網上找一下相應的代碼和標準測試代碼,在Ubuntu中分別用gcc和gcc-arm編譯
  3. 四個算法的用途?
  4. 《密碼學》課程中分別有哪些對應的算法?
  5. 提交2,3兩個問題的答案
  6. 提交在Ubuntu中運行國密算法測試程序的截圖

實驗過程

  • SM1:對應密碼學中分組密碼算法,是由國家密碼管理局編制的一種商用密碼分組標準對稱算法。算法安全保密強度及相關軟硬件實現性能與 AES 至關,該算法不公開,僅以 IP 核的形式存在於芯片中,調用該算法時,須要經過加密芯片的接口進行調用。普遍應用於電子政務、電子商務及國民經濟的各個應用領域(包括國家政 務通、警務通等重要領域)。
  • SM2:對應密碼學中公鑰密碼算法RSA,是由國家密碼管理局於2010年12月17日發佈,全稱爲橢圓曲線算法,用於加解密及數字簽名。
  • SM3:對應密碼學中摘要算法MD5,是中國國家密碼管理局於2010年公佈的中國商用密碼雜湊算法標準,適用於商用密碼應用中的數字簽名和驗證,是在SHA-256基礎上改進實現的一種算法。
  • SM4:對應密碼學中分組密碼算法DES,於2006年公佈,用於無限局域網產品使用,這是我國第一次公佈本身的商用密碼算法。

實驗截圖


5-SM1

實驗要求

  1. 注意不經老師容許不許燒寫本身修改的代碼
  2. 參考雲班課資源中「信息安全系統實驗箱指導書.pdf 「第一章,1.4」 KEIL-MDK 中添加 Z32 SC-000 芯片庫,提交安裝截圖
  3. 參考雲班課資源中「信息安全系統實驗箱指導書.pdf 「第一章,1.16」完成SM1加密實驗,注意「打開Z32的電源開關前,按住Reboot按鍵不放,兩次打開電源開關,Z32便可被電腦識別,進行下載調試。提交運行結果截圖
  4. 實驗報告中分析代碼

實驗過程

1.打開exp2\SM1目錄下的Z32HUA.uvproj工程文件並編譯;將生成的.bin文件下載到實驗箱
2.用9針串口線將電腦與Z32部分鏈接
3.打開exp2\軟件資料\串口調試助手目錄下的sscom42.exe串口助手,完成相關設定後關閉再打開實驗箱Z32部分的電源開關
4.按照電子屏的提示插入IC卡。
5.插入正確的卡後顯示相應信息,而後按A校驗密碼

6.按照步驟進行進一步的加解密。

分析代碼


實驗中的問題及解決過程

虛擬機USB沒法識別連接

在實驗過程當中咱們選擇使用了虛擬機做爲實驗環境,出現了虛擬機沒法識別實驗箱的USB公對公線。

解決方法:虛擬機工具欄設置斷開主機鏈接。
image

新學到的知識點

  1. 利用uVision4破解MDK
  2. 經過串口助手實現試驗箱Z32和電腦之間的數據傳輸和通訊
  3. 如何下載程序到試驗箱
  4. 國密算法標準SM1,SM2,SM3,SM4 SM1:對應密碼學分組密碼算法,普遍應用於電子政務、電子商務及國民經濟的各個應用領域(包括國家政 務通、警務通等重要領域)。 SM2:對應密碼學公鑰密碼算法RSA,用於加解密及數字簽名。 SM3:對應密碼學摘要算法MD5,適用於商用密碼應用中的數字簽名和驗證。 SM4:對應密碼學分組密碼算法DES,用於無限局域網產品使用。
相關文章
相關標籤/搜索