嵌入式硬件加密技術的實現(xiàn)

目前對硬件加密較深入的研究局限于少數(shù)的貴重電子產(chǎn)品上,這樣的加密所用到的元器件、電路比較復雜,價格也比較昂貴;如何能對大眾化的電子產(chǎn)品實施價格低廉而有效的加密成為一個迫切需要解決的問題。為此,我們今天給大家介紹一種適用于便攜式電子產(chǎn)品的嵌入式硬件加密技術。

一、硬件加密的概念和原理

1、硬件加密的概念

本文所說的硬件加密,是指這樣一種方法:使用待加密的電子產(chǎn)品之外的硬件電路與待加密的電子產(chǎn)品進行通訊,讓產(chǎn)品內部程序通過通訊的數(shù)據(jù)來判斷自己是否應該繼續(xù)執(zhí)行程序,從而達到加密產(chǎn)品的目的。

顯然,要實現(xiàn)硬件加密,用來通訊的數(shù)據(jù)應該是隨機數(shù),否則,即使這個數(shù)據(jù)很復雜,也很容易使用另外一片很簡單的單片機來模擬通訊數(shù)據(jù)從而破解產(chǎn)品。當然,這里所說的“隨機數(shù)”不可能是真正的隨機數(shù)而是偽隨機數(shù),眾所周知,還沒有僅靠MCU產(chǎn)生真正的隨機數(shù)的算法,而偽隨機數(shù)在很大的程度上接近真正的隨機數(shù),這對于加密已經(jīng)足夠。

基于以上的概念,待加密的電子產(chǎn)品內部的主控芯片應該具備以下幾種功能:

①能夠做到芯片外通訊,即要有輸入/輸出(I/O)口;

②能夠產(chǎn)生隨機數(shù);

③有足夠的程序和數(shù)據(jù)空間;

④如果要求實時性比較高,還要有較大的時鐘頻率。

2、硬件加密的原理

硬件加密的原理是:主控芯片產(chǎn)生一個隨機數(shù),把這個隨機數(shù)(或其加密形式)發(fā)送到加密芯片,由加密芯片進行加密后把數(shù)據(jù)回送給主控芯片,由主控芯片判別該數(shù)據(jù)是不是期望得到的數(shù)據(jù)。如果是,主控芯片的程序繼續(xù)執(zhí)行,否則報錯或停止運行。

二、嵌入式硬件加密技術的實現(xiàn)

1、加密過程概述

主控芯片和加密芯片之間使用兩根線(即兩個I/O口)進行通訊:一根時鐘線(CLK),一根數(shù)據(jù)線(DAT)。加密過程可以分為以下幾步:

(1)主控芯片產(chǎn)生隨機數(shù)x后,發(fā)送到加密芯片;

(2)主控芯片使用加密算法ym=f(x)進行運算,得到加密后的數(shù)據(jù)ym;

(3)與此同時,加密芯片使用同樣的加密算法ys=f(x)對接收到的x進行加密,得到y(tǒng)s;

(4)主控芯片要求加密芯片回傳數(shù)據(jù),得到y(tǒng)s;

(5)主控芯片比較ym和ys,如果一致可以繼續(xù)執(zhí)行程序,否則說明外部加密芯片不存在或者是“非法”的加密芯片,主控芯片報錯或停止執(zhí)行程序。

如果加密芯片只是用于加密而不處理其它事務,其相當一部分程序和數(shù)據(jù)空間會浪費。為了減少資源浪費,主控芯片可以發(fā)送數(shù)據(jù)請求加密芯片完成某些事務的處理,這樣設計,加密芯片不但承擔了加密的任務,而且相當于一個協(xié)處理器。

2、通訊協(xié)議設計

考慮到盡量減少資源占用、實現(xiàn)的難易程度和固件程序的易移植性,采用兩線制串行通訊是比較合適的辦法:主控芯片和加密芯片使用一根時鐘線(CLK)和一根數(shù)據(jù)線(DAT)進行主從式通訊。主控芯片總是每次通訊的主動方,加密芯片總是被動方。

產(chǎn)品工作過程中,沒有發(fā)送和接收請求時,主控芯片總是使CLK線和DAT線的電平為高電平;如果主控芯片有發(fā)送數(shù)據(jù)請求,要求加密芯片接收數(shù)據(jù),則把CLK線上面的電平置為低電平作為起始信號;

簡短延時后,主控芯片使CLK線上的電平每隔一段時間反相一下,這樣在CLK線上將會出現(xiàn)一個“高、低、高、低…”的波形,作為主控芯片和加密芯片通訊的時鐘;在CLK線為低電平期間改變DAT線上的電平為數(shù)據(jù)“1”或數(shù)據(jù)“0”,當CLK為高電平時允許加密芯片接收DAT線上面的數(shù)據(jù)。發(fā)送命令和數(shù)據(jù)完成以后,主控芯片把CLK線和DAT線上的電平置為高電平;

待到需要讓加密芯片回送數(shù)據(jù)時,主控芯片再使CLK線上面電平為低,作為起始信號。類似于發(fā)送過程,簡短延時后,每隔一段時間主控芯片使CLK線上電平跳變一下。CLK線電平為低時,加密芯片改變DAT線上的電平作為要傳輸?shù)臄?shù)據(jù)“1”或數(shù)據(jù)“0”,當為CLK線為高電平時主控芯片接收DAT線上面的數(shù)據(jù)。

全部數(shù)據(jù)接收完畢后,主控芯片再使CLK線和DAT線上面電平為高,一次完整的通訊過程結束。

3、硬件部分設計

主控芯片是隨著產(chǎn)品的不同而不同的,為了便于說明及不失一般性,這里選用51內核的芯片,仍然把它叫做主控芯片。

加密芯片選用MicroChip公司生產(chǎn)的PIC10F202。該芯片是一種新型CMOS工藝結構的8位單片機,具有非易失性可編程內部程序空間,最多可以存放512條指令;具有8個特殊功能寄存器和24字節(jié)數(shù)據(jù)空間。采用這款芯片用于加密,有四個主要原因:

(1)其內部自帶OTP(One-Time-Programable)型ROM,將內設的程序保密熔絲熔斷后,存于內部ROM中的程序不會被外界讀取,且不能重復編程。這樣,即使主控芯片內的程序被讀取,沒有加密芯片及內部程序,產(chǎn)品也不會被破解;

(2)芯片有工作和休眠(Sleep)兩種狀態(tài)。在Sleep狀態(tài)下功耗很低。例如采用3.3V電壓供電,在Sleep狀態(tài)下,電流只有2~3μA。如果芯片只是用于加密,絕大部分的時間都可以在Sleep狀態(tài),使產(chǎn)品幾乎沒有額外的功耗,尤其適用于使用電池的手持式電子產(chǎn)品;

(3)芯片內部有可編程設置的看門狗。有了看門狗定時復位,即使加密芯片程序跑飛,也會在看門狗的定時周期內自動復位,這樣就進一步增強了可靠性。

(4)芯片體積很小,占用線路板空間很少,批量化生產(chǎn)時可以節(jié)省成本。

硬件電路連接見圖1。

嵌入式硬件加密技術的實現(xiàn)

4、軟件部分設計

(1)主控芯片的軟件設計

主控芯片與加密相關的部分可以用以下幾個函數(shù)來實現(xiàn):

產(chǎn)生隨機數(shù)的函數(shù)gen_rand();

延時函數(shù)delay_us();

發(fā)送數(shù)據(jù)的函數(shù)send_data();接收數(shù)據(jù)的函數(shù)get_data();

對隨機數(shù)據(jù)進行加密的函數(shù)encrypt();

驗證數(shù)據(jù)是否是預期值的函數(shù)identify();

主控芯片首先調用gen_rand()產(chǎn)生隨機數(shù)x,而后使用send_data()函數(shù)發(fā)送命令和數(shù)據(jù),再調用encrypt()函數(shù)對產(chǎn)生的隨機數(shù)x加密,得到y(tǒng)m;調用delay_us()延時后,調用get_data()接收經(jīng)過加密芯片加密的數(shù)據(jù)ys。最后,調用identify()函數(shù)驗證接收到的數(shù)據(jù)和自身加密的數(shù)據(jù)是否一致。如果一致,程序繼續(xù)執(zhí)行;如果不一致,報錯。

(2)加密芯片的軟件設計

有三種情況會引起PIC10F202的復位并影響狀態(tài)寄存器中斷標志位,分別為:PIC10F202上電時、內部看門狗溢出時和Sleep狀態(tài)下GPIO口有電平跳變時。加密芯片內部程序可根據(jù)這些標志位判斷是哪種情況引起的復位,從而進行相應的操作:

如果是看門狗電路引起的復位,直接跳到程序的末尾,完成進入Sleep狀態(tài)前的準備工作后進入Sleep狀態(tài);

如果是GPIO引腳電平跳變引起的復位,說明此前程序已經(jīng)在Sleep狀態(tài),之所以被喚醒是因為主控芯片發(fā)送了起始信號(CLK電平為低),要求向加密芯片發(fā)送數(shù)據(jù)。這種情況下,程序跳到主程序中調用接收子程序前的地方,調用接收子程序進行接收并進行以后的操作;

如果是上電引起的復位,加密程序初始化各個狀態(tài)后,循環(huán)等待或進入Sleep狀態(tài),直到主控芯片發(fā)出起始信號以進行接收。

在電子產(chǎn)品批量生產(chǎn)的今天,考慮到產(chǎn)品被破解所帶來的損失,硬件加密所花費的代價是微不足道的,將在加密領域大展身手。

小知識之硬件加密

硬件加密是通過專用加密芯片或獨立的處理芯片等實現(xiàn)密碼運算。將加密芯片、專有電子鑰匙、硬盤一一對應到一起時,加密芯片將把加密芯片信息、專有鑰匙信息、硬盤信息進行對應并做加密運算,同時寫入硬盤的主分區(qū)表。這時加密芯片、專有電子鑰匙、硬盤就綁定在一起,缺少任何一個都將無法使用。經(jīng)過加密后硬盤如果脫離相應的加密芯片和電子鑰匙,在計算機上就無法識別分區(qū),更無法得到任何數(shù)據(jù)。