ARM芯片如何加密

針對黑客非法獲取ARM芯片程序的問題,提出了一種能同時防止ARM芯片程序被非法復(fù)制及源碼竊取的方法。該方法以分散加栽方式規(guī)劃存儲器,以ARM芯片內(nèi)全球唯一序列號為密鑰,對核心程序進行加密處理。

一、分散加載技術(shù)介紹

1、分散加載的基本原理

在嵌入式系統(tǒng)中,其存儲系統(tǒng)常常由FLASH、ROM、RAM等存儲器組成,它們被定位于不同的物理地址范圍。為了讓軟件更好地訪問和利用這些存儲器并讓系統(tǒng)高效的運行,ARM鏈接器提供了分散加載機制。在鏈接時可以根據(jù)分散加載文件中指定的存儲器分配方案,將可執(zhí)行鏡像文件分為指定的分區(qū)并定位于指定的存儲器物理地址。當嵌入式系統(tǒng)在重新上電或復(fù)位時,首先對處理器內(nèi)部寄存器執(zhí)行初始化,然后執(zhí)行ROM存儲器的自舉代碼,根據(jù)鏈接時的存儲器分配方案,將相應(yīng)代碼和數(shù)據(jù)從加載地址復(fù)制到運行地址。這樣,定位于RAM存儲器中的代碼和數(shù)據(jù)就在RAM中執(zhí)行,而不再從ROM存儲器中執(zhí)行剛。利用分散加載的特性,可以在加載域指定的ROM中存儲經(jīng)過加密的=進制程序,而在對應(yīng)的運行域RAM中將其還原,RAM的掉電易失性使源程序不被暴露。

2、存儲器規(guī)劃

ARM Cortex—M3芯片有32 KB本地靜態(tài)RAM和512 KB片內(nèi)FLASH,其地址映射如圖1所示。

ARM芯片如何加密

由于ARM芯片程序中有大量的公共庫程序和簡單的流程控制程序,所以不需要加密全部程序,只要加密核心代碼即可。本文把ARM程序抽象成三大部分:預(yù)處理部分、核心程序部分、其他程序部分。預(yù)處理部分最先執(zhí)行,負責與上位機軟件交互、解密加載域并寫入對應(yīng)運行域中。核心程序是芯片代碼中需要加密部分,其加載域上存儲其密文。其他程序為芯片代碼中的公共庫程序或簡單流程程序,其加載域上直接存儲其明文。本文對存儲器的規(guī)劃如表1所列,值得注意的是核心程序的運行域在RAM上。根據(jù)分散加載文件的編寫規(guī)則和表1,編寫相應(yīng)分散加載文件后,使用集成開發(fā)環(huán)境編譯并下載程序,預(yù)處理程序、核心程序、其他程序?qū)粺龑懙较鄳?yīng)加載域,并且得到三個與之對應(yīng)的二進制文件。

ARM芯片如何加密

二、加密方案具體實現(xiàn)

軟件加密的目的就是要千方百計造成機器碼的錯誤反匯編或反匯編后的程序不可讀,所以可以考慮把程序加密后再燒寫到FLASH中,達到完全打亂FLASH程序順序的作用。這樣,不法分子從FLASH中提取的程序,反匯編的結(jié)果將是完全不可分析的。被加密的程序運行前,將其解密后到復(fù)制到分散加載文件指定的位于RAM的運行域,由于RAM的掉電丟失性,正確的二進制程序?qū)⒈浑[藏。到此為止,已經(jīng)能夠阻止不法分子通過反匯編得到程序的源代碼。然而,仍然沒有防止仿制者通過非法手段整片復(fù)制芯片程序到同型號的其他芯片,從而快速生產(chǎn)出同類電子產(chǎn)品。通過對ARM芯片的分析發(fā)現(xiàn),在所有ARM芯片內(nèi)部寄存器中,都有一組128位全球唯一芯片序列號。并且此序列號只能被讀取,不能被修改,可以以此序列號作為加密算法的密鑰,這樣,由于所有ARM設(shè)備的密鑰都不同,不法人員通過簡單拷貝芯片程序給其他同類型芯片,會因為密鑰不匹配,得不到正確的運行域程序,使整片復(fù)制芯片程序的竊取方法失敗。

本文的加密方案總體思想如圖2所示。首先以分散加載方式規(guī)劃存儲器,正常加載程序。然后將核心程序以ARM序列號為密鑰,加密后燒寫到分散加載文件指定的加載域上,以密文形式覆蓋原有明文。最后,在預(yù)處理程序中提取設(shè)備序列號,以此為密鑰進行解密,將得到的結(jié)果復(fù)制到分散加載文件指定的運行域中。

ARM芯片如何加密

1、加密算法選擇

在數(shù)據(jù)加密認證的過程中,選擇合適的加密算法是研發(fā)工程師首先要考慮的事情。選擇加密算法時要結(jié)合自身需求,從算法執(zhí)行速度、安全性、資源占用性等方面進行綜合考慮。對稱加密算法是常用于嵌入式設(shè)備加密的主要方法,其中廣范應(yīng)用的對稱加密算法有AES算法和DES算法。DES算法有不能對抗差分和線性密碼分析、對系統(tǒng)資源要求高等缺點:2000年,美國國家標準局正式宣布AES算法為新的高級加密標準。AES優(yōu)點如下:運算速度快,對內(nèi)存要求低,高安全性等。由于AES算法可以提供128位密鑰,所以128位ARM芯片全球唯一序列號不做任何處理便可作為AES算法密鑰,本文選用AES算法作為核心程序加密算法。

2、核心程序加密實現(xiàn)過程

根據(jù)表l的分散加載方案下載程序到存儲器芯片中后,包括核心程序在內(nèi)的所有程序在FLASH上都以明文存儲。要使核心程序不被竊取,必須對其加密處理,以密文覆蓋原有明文。在實現(xiàn)時,要設(shè)計一個簡單的上位機軟件,其與芯片中預(yù)處理程序配合完成芯片加密工作。上位機可以用MFC或C#開發(fā),筆者以MFC方式實現(xiàn)的上位機軟件界面,如圖3所示。

ARM芯片如何加密

上位機可以采用無線、串口、USB接口等任何方式與ARM微處理器進行通信。上位機首先判斷是否與ARM設(shè)備連接,筆者采用的方法是上位機向微處理器發(fā)送CONNECT宏命令,如果從ARM設(shè)備收到同樣的CON-NECT宏命令,則可以判斷ARM設(shè)備與上位機成功連接。之后,上位機自動發(fā)送GET;二SERIAL—NUMBER宏命令讓微處理器調(diào)用內(nèi)置函數(shù)讀取芯片全球唯一序列號,并將此序列號發(fā)送給上位機。選擇核心程序?qū)?yīng)的二進制文件進行加密處理,上位機會調(diào)用AES算法,以芯片全球唯一序列號為密鑰產(chǎn)生經(jīng)過加密的核心程序文件。選擇產(chǎn)生的加密核心程序文件,將分散加載文件中核心程序的加載地址和運行地址分別填入上位機軟件相應(yīng)控件,最后,上位機會把經(jīng)過加密的核心程序文件發(fā)送至ARM設(shè)備中。芯片中預(yù)處理程序接收到加密核心程序后,以在應(yīng)用編程(IAP)方式將經(jīng)過加密的核心程序覆蓋未加密核心程序的加載域。除此之外,發(fā)送加密核心程序的同時,燒寫地址(ROM CORE_ADDR)、執(zhí)行地址(RAM_RUN ADDR)以及核心程序代碼大小(CORE_SIZE)三個參數(shù)被一起發(fā)送給ARM設(shè)備,預(yù)處理程序解密時要使用以上三個參數(shù)。核心程序加密流程如圖4所示,執(zhí)行每一步的結(jié)果都會在上位機上得到顯示。

ARM芯片如何加密

3、運行時解密的實現(xiàn)過程

為使此加密方案通用性更強,將與上位機通信的程序和解密程序全部放到預(yù)處理程序部分,只要在ARM程序的起始部分添加預(yù)處理程序,所有ARM系列微處理器都可以應(yīng)用此加密方案。預(yù)處理程序執(zhí)行時,首先檢測ARM設(shè)備是否與上位機相連,如果相連,執(zhí)行與上位機交互相關(guān)程序,如上文提到的接收核心程序密文,以IAP方式覆蓋核心程序加載域明文、ARM序列號發(fā)送等。如果ARM設(shè)備沒有與上位機連接,進行運行域解密工作,首先調(diào)用ARM芯片提供的API提取內(nèi)部全球唯一序列號(SER-IAL_ NUMBER),然后以此為密鑰,對核心程序加載域(ROM_CORE_ADDR)上的程序執(zhí)行AES解密,最后將結(jié)果復(fù)制到核心程序運行域( RAM_RUN_ADDR) 。

采用迭代的方法,每次從核心代碼加載域提取128位,將其解密后復(fù)制到核心代碼運行域,迭代的次數(shù)由核心程序代碼大小決定。無論要解密的核心程序有多大,此方案只需32字節(jié)的額外存儲空間。另外,應(yīng)用ARM處理器特有的32位指令集,可以大幅加快AES解密算法的執(zhí)行速度。將解密后的核心程序復(fù)制到相應(yīng)運行域后,就可以跳轉(zhuǎn)出預(yù)處理程序,執(zhí)行正常的功能程序。運行時解密過程如圖5所示。

ARM芯片如何加密

小知識之ARM處理器

ARM處理器是Acorn計算機有限公司面向低預(yù)算市場設(shè)計的第一款RISC微處理器。更早稱作Acorn RISC Machine。ARM處理器本身是32位設(shè)計,但也配備16位指令集,一般來講比等價32位代碼節(jié)省達35%,卻能保留32位系統(tǒng)的所有優(yōu)勢。