《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 一種基于CPUID和AES算法的STM32固件升級(jí)方案
一種基于CPUID和AES算法的STM32固件升級(jí)方案
2015年電子技術(shù)應(yīng)用第3期
曹欲曉1,,韓 冬2,徐金寶1
1.南京工程學(xué)院 計(jì)算機(jī)工程學(xué)院,,江蘇 南京211167,; 2.清華大學(xué) 自動(dòng)化系,北京100084
摘要: 針對(duì)STM32系統(tǒng)固件升級(jí)時(shí)使用同一個(gè)文件易被非法復(fù)制使用的缺陷,,提出并實(shí)現(xiàn)了一種一個(gè)STM32芯片使用一個(gè)唯一升級(jí)文件的固件升級(jí)方案,。升級(jí)固件時(shí),由服務(wù)器為不同的STM32芯片生成不同的bin文件,,該bin文件是以STM32的CPUID為密鑰,,應(yīng)用AES算法加密原始bin文件得到的。升級(jí)時(shí)STM32以自身的CPUID作為密鑰對(duì)文件解密,,如果作為解密密鑰的CPUID和作為加密密鑰的CPUID不同,,則解密出的bin文件不能運(yùn)行。解密后,,再應(yīng)用IAP技術(shù)把新的bin文件寫入Flash,。實(shí)際測(cè)試證明,提出的方法可以實(shí)現(xiàn)“一片一密”,,有效防止了升級(jí)程序的非法使用,。
關(guān)鍵詞: STM32 CPUID AES算法 解密
中圖分類號(hào): TP311
文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2015)03-0028-03
中文引用格式:曹欲曉,韓冬,徐金寶.一種基于CPUID和AES算法的STM32固件升級(jí)方案[J].電子技術(shù)應(yīng)用,2015,41(03):28-30+34
A scheme of firmware upgrade of STM32 based on CPUID and AES algorithm
Cao Yuxiao1,Han Dong2,,Xu Jinbao1
1.School of Computer Engineering,Nanjing Institute of Technology,,Nanjing 211167,China,; 2.Department of Automation,Tsinghua University,,Beijing 100084,China
Abstract: For the shortage that the unique upgrade file is easy to be illegal used,a kind of firmware upgrade scheme is proposed and implemented,,that one STM32 system uses one unique upgrade file. When upgrading firmware,,the server generates different bin file for different STM32 system.The server uses AES algorithm to encrypt original bin file with every STM32′s CPUID as encryption key. STM32 decrypts the bin file with its CPUID as the key. If the CPUID as decryption key is not same as the CPUID as encryption key,the program decrypted by STM32 can′t run. After decryption STM32 uses IAP technology to write new firmware to Flash. The actual test proves that the method given by this paper can achieve "one chip one key" and prevent illegal use.
Key words : STM32;CPUID,;AES algorithm,;encryption,;decryption;In Application Programing(IAP)

 

0 引言

  STM32是ST公司推出的基于ARM Cortex-M3[1]內(nèi)核的系列微控制器,。STM32系列微控制器在Coretex-M3內(nèi)核的基礎(chǔ)上集成了豐富的外設(shè)單元[2],,具有高性能、低功耗,、低成本的優(yōu)勢(shì),,被廣泛應(yīng)用在工業(yè)控制、醫(yī)療和手持設(shè)備等眾多領(lǐng)域中,。與PC上的軟件一樣,,嵌入式系統(tǒng)的固件(即軟件)也需要不斷升級(jí)。現(xiàn)在固件的升級(jí)一般是使用JTAG或SWD仿真器,,通過(guò)專用軟件完成,,所有產(chǎn)品的升級(jí)使用相同的文件,因此易被非法用戶盜版使用,。

  為了防止固件被盜版,,文獻(xiàn)[3]提出了一種使用硬件狗對(duì)單片機(jī)程序進(jìn)行加密的方法,程序在運(yùn)行過(guò)程中不斷對(duì)硬件狗進(jìn)行訪問(wèn)和讀寫,,通過(guò)硬件狗的唯一性來(lái)保證加密后的固件不被非法訪問(wèn)和復(fù)制,。文獻(xiàn)[4]利用一種專用加密芯片AT88SA102S把單片機(jī)中的固件程序和加密芯片進(jìn)行綁定,從而實(shí)現(xiàn)了對(duì)單片機(jī)程序的保護(hù),。文獻(xiàn)[5]使用一種1-Wire安全器件,,采用安全散列算法SHA-1對(duì)固件程序進(jìn)行認(rèn)證,防止對(duì)固件的非法拷貝,。文獻(xiàn)[6]提出了應(yīng)用芯片唯一身份識(shí)別碼,、RC振蕩器頻率和上電標(biāo)志進(jìn)行軟件加密的方法。

  上述方法雖然能有效地保護(hù)單片機(jī)的應(yīng)用程序,,但是采用硬件器件加密的方法需要額外的硬件單元,提高了電路的復(fù)雜性和產(chǎn)品的成本,;采用軟件加密的方法,,則需要對(duì)每一個(gè)芯片單獨(dú)編譯燒寫加密后的應(yīng)用程序,增加了產(chǎn)品批量生產(chǎn)時(shí)的工作量,。

  針對(duì)上述固件升級(jí)以及硬件和軟件加密方案的不足,,本文在分析了STM32系列微控制器結(jié)構(gòu)特點(diǎn)的基礎(chǔ)上,把STM32內(nèi)部的全球唯一CPUID作為密鑰,,應(yīng)用AES算法對(duì)STM32應(yīng)用程序所在的bin文件進(jìn)行加密,,給不同的STM32芯片生成不同的升級(jí)bin文件。加密后的bin文件由STM32以自己的CPUID作為密鑰解密,,并通過(guò)IAP技術(shù)寫入Flash,,從而實(shí)現(xiàn)應(yīng)用程序的合法升級(jí)完全由唯一的CPUID控制,,只有合法的STM32芯片才能正確地升級(jí)固件,防止了非法用戶對(duì)應(yīng)用程序的拷貝復(fù)制,。

1 CPUID和AES算法

  1.1 STM32的CPUID

  每一個(gè)STM32微控制器內(nèi)部都有一個(gè)96位的全球唯一序列號(hào),,存儲(chǔ)在地址0x1fff7a10-0x1fff7a18處,稱為CPUID,。這個(gè)CPUID是STM32芯片的身份標(biāo)識(shí)[7],,只能讀出不能寫入,任何兩片STM32微控制器的CPUID都是不相同的,,并且同一批次的STM32芯片的CPUID也毫無(wú)規(guī)律性,,所以CPUID可以用來(lái)判斷芯片的合法性以決定是否執(zhí)行固件程序。

  1.2 AES算法

  AES(Advanced Encryption Standard)是NIST(美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所)用來(lái)代替DES算法的新一代數(shù)據(jù)加密標(biāo)準(zhǔn),。NIST要求AES 候選算法需滿足以下基本要求:AES在體制上應(yīng)是對(duì)稱分組密碼,;密鑰的長(zhǎng)度可以是128 bit、 192 bit或 256 bit,;數(shù)據(jù)分組的長(zhǎng)度可以是128 bit,、192 bit或256 bit;AES算法應(yīng)容易在各種硬件平臺(tái)和軟件平臺(tái)上實(shí)現(xiàn),。經(jīng)過(guò)幾輪篩選,,最終由Joan Daemen和Vincent Rijmen設(shè)計(jì)的Rijndael算法在2000年10月成為AES標(biāo)準(zhǔn)的最終算法[8]。

  AES算法是一種對(duì)稱加密算法,,加密和解密使用相同的密鑰,。AES算法的輸入是固定長(zhǎng)度的分組,輸出分組的長(zhǎng)度和輸入分組相同,,每一個(gè)分組和密鑰的長(zhǎng)度可以是128 bit,、192 bit或256 bit,對(duì)應(yīng)的加密輪數(shù)分別是10,、12或14輪,。取分組長(zhǎng)度和密鑰同為128 bit,給出AES算法加密和解密的流程如圖1和圖2所示[9],。

2 IAP技術(shù)

  IAP(In Application Programing)[10]的意思是“在應(yīng)用編程”,,指CPU執(zhí)行程序時(shí),通過(guò)正在執(zhí)行的程序完成對(duì)片內(nèi)Flash的改寫,。利用IAP,,可以在程序正常執(zhí)行時(shí)向Flash寫入新的數(shù)據(jù)或程序,克服了以往改寫Flash需要停止程序運(yùn)行的缺點(diǎn),。

  通過(guò)IAP更新固件,,新的固件可以來(lái)自串行口、USB,、以太網(wǎng)等數(shù)據(jù)接口,,也可以來(lái)自外接的TF卡,。STM32在執(zhí)行IAP操作時(shí),首先對(duì)片內(nèi)Flash解鎖,,接著擦除需要重新編程的Flash區(qū)域,,最后把新的固件代碼寫入。使用IAP功能,,需要有兩個(gè)可執(zhí)行程序,,一個(gè)稱為Bootloader,另一個(gè)稱為App,。Bootloader和App分別存儲(chǔ)在Flash的不同區(qū)域,,存儲(chǔ)空間不能重合。Bootloader是啟動(dòng)引導(dǎo)程序,,負(fù)責(zé)應(yīng)用IAP改寫App固件并跳轉(zhuǎn)到App執(zhí)行,。App是正常工作時(shí)系統(tǒng)完成具體功能的應(yīng)用程序。

001.jpg

3 基于CPUID和AES算法的STM32固件加密升級(jí)

  3.1 系統(tǒng)架構(gòu)和總體原理

  本文提出的加密升級(jí)方案,,一共需要三個(gè)組成部分:STM32系統(tǒng),、PC、服務(wù)器,,系統(tǒng)架構(gòu)如圖3所示,。STM32系統(tǒng)是需要升級(jí)的嵌入式系統(tǒng)。PC上運(yùn)行一個(gè)升級(jí)控制程序,,控制STM32的升級(jí)操作,,并在STM32系統(tǒng)和服務(wù)器之間進(jìn)行通信。服務(wù)器上存儲(chǔ)有IAP升級(jí)用的原始bin文件和所有合法的STM32微控制器的CPUID,,負(fù)責(zé)為每一個(gè)STM32生成不同的bin文件,。STM32系統(tǒng)須具有一個(gè)USB從機(jī)接口,用來(lái)與PC連接,;還要有一個(gè)接在SDIO接口上的TF卡,,這個(gè)TF卡通過(guò)FatFS文件系統(tǒng)被模擬成一個(gè)U盤,使PC可以象操作普通U盤一樣操作這個(gè)TF卡,,STM32和PC的數(shù)據(jù)交換通過(guò)TF卡進(jìn)行,。TF卡初始化后在其中建立一個(gè)標(biāo)記是否升級(jí)App的標(biāo)志文件。

003.jpg

  STM32升級(jí)固件時(shí),,把自己的CPUID加密后傳給PC上的控制程序,由PC通過(guò)網(wǎng)絡(luò)發(fā)給服務(wù)器,。服務(wù)器事先保存了所有合法的CPUID,,當(dāng)收到PC送來(lái)的CPUID時(shí),首先檢查其合法性,,如合法則用接收的CPUID作為密鑰對(duì)原始bin文件進(jìn)行AES加密,,所以對(duì)不同的STM32能生成不同的升級(jí)用bin文件,。如果其他STM32試圖用自己的CPUID作密鑰解密這個(gè)bin文件,則解密出的程序是錯(cuò)誤的,,不能執(zhí)行,。

  STM32系統(tǒng)的Bootlaoder可以在硬件能正常工作后用仿真器統(tǒng)一燒寫,第一個(gè)App可以直接應(yīng)用本文提出的方法升級(jí)寫入,。

  3.2 Bootloader的設(shè)計(jì)

  Bootloader在完成自身的初始化后,,檢查TF卡上的寫入標(biāo)志文件的變化,如果同時(shí)具有寫入標(biāo)志和新的bin文件,,則把bin文件讀入內(nèi)存,,以自己的CPUID作密鑰,應(yīng)用AES算法解密bin文件,,接著使用IAP把新的App寫入Flash,。新的App寫入完成或者無(wú)需升級(jí)時(shí),直接跳轉(zhuǎn)到App執(zhí)行,。Bootloader的工作流程可用圖4表示,。

004.jpg

  3.3 App的設(shè)計(jì)

  App程序執(zhí)行時(shí),除完成正常工作外,,每隔一定時(shí)間檢查一次TF卡上的寫入標(biāo)志文件,,如果發(fā)現(xiàn)PC上的控制程序改寫了升級(jí)標(biāo)志,則讀出CPUID,,用一個(gè)固定密鑰經(jīng)AES加密后寫到TF卡上,,通過(guò)這種方式把加密后的CPUID由PC傳給了服務(wù)器。PC控制程序獲得服務(wù)器返回的加密bin文件后,,寫到TF卡上,。STM32重啟后在Bootloader中完成App的固件升級(jí)。

4 STM32的IAP功能的實(shí)現(xiàn)

  4.1 STM32的IAP

  STM32有三種啟動(dòng)方式,,具體采用哪種由STM32的BOOT0和BOOT1兩個(gè)引腳的組合決定[11],,只要BOOT0置低,無(wú)論BOOT1置高或置低,,STM32都從內(nèi)部Flash啟動(dòng),。STM32內(nèi)部的Flash地址從0x8000000開始,Cortex-M3內(nèi)核的Flash起始地址的第一個(gè)字(4 B)必須是棧頂指針的值,,第二個(gè)字存放復(fù)位中斷向量的地址,,隨后才是STM32要執(zhí)行的代碼。為了實(shí)現(xiàn)應(yīng)用程序的IAP功能,,STM32片內(nèi)的Flash要分成兩個(gè)區(qū)域,,開始的一部分存儲(chǔ)Bootloader,后面的一部分存儲(chǔ)App,。STM32啟動(dòng)時(shí)首先從0x8000000地址開始執(zhí)行,,即先執(zhí)行Bootloader,,在Bootloader中再跳轉(zhuǎn)到App。

  Bootloader中的IAP流程是:首先解鎖Flash,,擦除App占用的Flash塊區(qū),;然后從TF卡中讀出升級(jí)bin文件,應(yīng)用AES算法解密,;解密后的代碼按順序?qū)懭肷弦徊讲脸腇lash,,全部App寫入完成再對(duì)Flash加鎖以防止被調(diào)試工具讀出。

  Bootloader通過(guò)IAP完成固件的寫入后,,執(zhí)行以下代碼完成到App的跳轉(zhuǎn)[12]:

  JumpAddress=*(__IO uint32_t*) (APPLICATION_

  ADDRESS + 4),;//取出App的中斷向量地址

  Jump_To_Application=(pFunction) JumpAddress;

  //給函數(shù)指針賦值

  __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS),;

  //初始化用戶堆棧指針

  Jump_To_Application(),;//跳轉(zhuǎn)到App執(zhí)行

  4.2 App代碼的修改和開發(fā)環(huán)境的設(shè)置

  因?yàn)锳pp程序沒(méi)有存儲(chǔ)在Flash的起始地址,所以在App的main函數(shù)中要重新設(shè)置中斷向量表的起始地址,,否則會(huì)因?yàn)橹袛嘞蛄康刂烦鲥e(cuò)導(dǎo)致App不能正常運(yùn)行,。這可以通過(guò)調(diào)用STM32固件庫(kù)中的函數(shù)NVIC_Set-

  VectorTable來(lái)實(shí)現(xiàn),該函數(shù)的第一個(gè)參數(shù)是Flash的起始地址,,第二個(gè)參數(shù)是App在Flash中的偏移量,。

  通過(guò)IAP升級(jí)App使用的文件必須是bin格式,但編譯器直接編譯生成的是hex文件,,因此還需要使用開發(fā)工具鏈中的工具把hex文件轉(zhuǎn)換成bin文件,,PC控制程序拷貝到TF卡中的就是服務(wù)器加密后的bin文件。

5 結(jié)語(yǔ)

  STM32芯片內(nèi)置的全球唯一96位ID可以作為芯片的身份認(rèn)證標(biāo)志,,同時(shí)具有大容量的Flash,,可以同時(shí)存儲(chǔ)Bootloader和App,并支持IAP,。STM32的這兩個(gè)特點(diǎn)為使用AES算法加密生成不同的升級(jí)文件提供了物質(zhì)基礎(chǔ),。經(jīng)過(guò)實(shí)際測(cè)試,把服務(wù)器為某一個(gè)STM32生成的加密bin文件拷貝到其他STM32系統(tǒng)后并正確改寫升級(jí)標(biāo)志,,STM32系統(tǒng)重啟后應(yīng)用程序無(wú)法執(zhí)行,。應(yīng)用二進(jìn)制分析軟件對(duì)不同STM32請(qǐng)求升級(jí)得到的bin文件進(jìn)行對(duì)比,發(fā)現(xiàn)所有bin文件均不相同,,因此本文提出的方法可以為不同的STM32生成唯一的升級(jí)文件,,有效防止了非法用戶的盜版行為。

  參考文獻(xiàn)

  [1] ST Microelectronic Corporation.STM32F10x refrence manual[Z].2008.

  [2] 黃智偉,,王兵,,朱衛(wèi)華.STM32F 32位ARM微控制器應(yīng)用設(shè)計(jì)與實(shí)踐[M].北京:北京航空航天大學(xué)出版社,2014.

  [3] 藤?gòu)V超,郎建軍,,杜其才,等.基于STM32的硬件狗設(shè)計(jì)與實(shí)現(xiàn)[J].微處理機(jī),,2013(6):70-72.

  [4] 張煒軒,,王菲,王玉平.基于專用加密芯片的單片機(jī)加密系統(tǒng)設(shè)計(jì)[J].單片機(jī)與嵌入式系統(tǒng),,2013(9):56-59.

  [5] 易威,,彭億強(qiáng),羅森僑.基于1-Wire安全器件的單片機(jī)加密認(rèn)證系統(tǒng)[J].電子科技,,2013,,26(7):180-182.

  [6] 潘永雄,胡敏強(qiáng),,羅小偉.單片機(jī)控制程序加密策略探索與應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),,2010,31(11):2466-2469.

  [7] ST Microelectronic Corporation.STM32F10xxx Cortex-M3 programming manual[Z].2008.

  [8] NIST.Advanced encryption standard(AES)[S].Federal Infor-mation Processing Standards Publication,,2001.

  [9] 何明星,,林昊.AES算法原理及其實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用研究,2002(12):61-63.

  [10] ST Microelectronic Corporation.STM32F10x in-application programming[Z].2008.

  [11] ST Microelectronics Corporation.STM32F10x Flash prog-ramming[Z].2008.


此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。