1、MCU的ISP和IAP功能
現(xiàn)在MCU已經(jīng)普遍采用Flash型的EEPROM作為程序存儲器,F(xiàn)lash結(jié)構(gòu)的存儲器寫入時可以按字節(jié)操作把1寫成0,擦除時都是按扇區(qū)操作,把0寫成1。它的流行與普及為ISP/IAP功能的實現(xiàn)提供了技術(shù)基礎(chǔ)。
ISP,In System Programming,它的意思是“在系統(tǒng)編程”,即MCU不需要從電路板上取下就可以編程寫人最終用戶代碼,已經(jīng)編程的器件也可以用ISP方式擦除或再編程,從而改變了單片機(jī)系統(tǒng)的固化程序升級需拔插單片機(jī)芯片、使用專用編程器進(jìn)行燒錄的麻煩方式,輕松實現(xiàn)在單片機(jī)系統(tǒng)電路板上對單片機(jī)芯片內(nèi)固化的程序進(jìn)行升級。
IAP,In Application Programming,它的意思是“在應(yīng)用編程”,即MCU在運行時程序存儲器可由程序自身進(jìn)行擦寫。也就是說程序自己可以往程序存儲器里寫數(shù)據(jù)或修改程序。這種方式的典型應(yīng)用就是程序運行中的數(shù)據(jù)存儲。ISP/IAP的區(qū)別是:ISP通常是在手工操作下整片擦除、編程,需要簡單的硬件資源;而IAP卻是在某段程序的控制下對另外一段程序Flash進(jìn)行讀寫,可以控制對特定地址的讀寫操作。實際上單片機(jī)的ISP功能就是通過IAP技術(shù)來實現(xiàn)的,即芯片在出廠前就已經(jīng)有一段芯片制造商的boot程序在芯片里面,片子上電后,開始運行這段程序,當(dāng)檢測到上位機(jī)有下載要求時,便和上位機(jī)通信,然后下載數(shù)據(jù)到存儲區(qū)。其實在系統(tǒng)編程是通過廠商的boot程序?qū)ζ瑑?nèi)Flash存儲器進(jìn)行擦除/編程的方法,而在應(yīng)用編程是用戶的應(yīng)用代碼對片內(nèi)Flash存儲器進(jìn)行擦除/編程的方法。正是因為有了IAP,從而使得MCU可以將數(shù)據(jù)寫入到程序存儲器中,數(shù)據(jù)如同燒入的程序一樣,掉電不丟失。IAP技術(shù)的普及對于高檔儀器儀表的智能化意義重大,使得儀器的程序可以根據(jù)實際情況進(jìn)行改變和調(diào)整。
2、數(shù)據(jù)加密
加密就是把明文變成別人看不懂的密文,然后發(fā)送給自己想要的人,接收方用配套的解密算法又把密文解開成明文,這樣就不怕在傳送的路上被別人截獲而泄密,以此來防止非授權(quán)用戶使用該數(shù)據(jù)。
數(shù)據(jù)加密中的明文是指原始的或未加密的數(shù)據(jù),需要通過加密算法對其進(jìn)行加密,加密算法的輸入信息為明文和密鑰;密文,即明文加密后的格式,是加密算法的輸出信息。加密算法是公開的,而密鑰則是不公開的。密文,不應(yīng)為無密鑰的用戶理解,用于數(shù)據(jù)的存儲以及傳輸。傳統(tǒng)的加密方法有兩種,替換和置換。替換是使用密鑰將明文中的每一個字符轉(zhuǎn)換為密文中的一個字符。而置換僅將明文的字符按不同的順序重新排列。單獨使用這兩種方法的任意一種都是不夠安全的,但是將這兩種方法結(jié)合起來就能提供比較高的安全程度。
加密方式分為對稱加密和不對稱加密。對稱,就是采用這種加密方法的雙方使用同樣的密鑰進(jìn)行加密和解密。在對稱加密算法中,數(shù)據(jù)發(fā)送方將明文和加密密鑰一起經(jīng)過特殊加密算法處理后,使其變成復(fù)雜的加密密文發(fā)送出去。接收方收到密文后,若想解讀原文,則需要使用與加密相同的密鑰及相同算法的逆運算對密文進(jìn)行解密,才能使其恢復(fù)成可讀明文。這就要求加密密鑰能夠從解密密鑰中推算出來,同時解密密鑰也可以從加密密鑰中推算出來。而在大多數(shù)的對稱算法中,加密密鑰和解密密鑰是相同的,使用的密鑰只有一個,發(fā)收信雙方都使用這個密鑰對數(shù)據(jù)進(jìn)行加密和解密,這就要求發(fā)送方和接收方在安全通信之前,商定一個密鑰。對稱算法的安全性依賴于密鑰,泄漏密鑰就意味著任何人都可以對他們發(fā)送或接收的消息解密,所以密鑰的保密性對通信安全至關(guān)重要。由于其計算量小、加密速度快、加密效率高,對稱性加密通常在消息發(fā)送方需要加密大量數(shù)據(jù)時使用。如果用戶每次使用對稱加密算法時,都使用其他人不知道的惟一密鑰,安全性是可以得到保證的。
不對稱加密算法的基本原理是,如果發(fā)信方想發(fā)送只有收信方才能解讀的加密信息,發(fā)送方必須首先知道接收方的公鑰,然后利用接收方的公鑰來加密原文;接收方收到加密密文后,使用自己的私鑰才能解密密文。顯然,采用不對稱加密算法,收發(fā)雙方在通信之前,接收方必須將自己早已隨機(jī)生成的公鑰送給發(fā)送方,而自己保留私鑰。由于不對稱算法擁有兩個密鑰,因而特別適用于分布式系統(tǒng)中的數(shù)據(jù)加密。非對稱加密算法的保密性比較好,它消除了最終用戶交換密鑰的需要,但加密和解密花費時間長、速度慢,它不適合于對文件加密而只適用于對少量數(shù)據(jù)進(jìn)行加密。廣泛應(yīng)用的不對稱加密算法有RSA算法和美國國家標(biāo)準(zhǔn)局提出的DSA。以不對稱加密算法為基礎(chǔ)的加密技術(shù)應(yīng)用非常廣泛。
3、常用加密算法
由于受限于MCU的運算能力,并非所有的加密算法都適用于嵌入式系統(tǒng)。TEA(Tiny Encryption Algorithm)是一種小型的對稱加密解密算法,由劍橋大學(xué)計算機(jī)實驗室的David Wheeler和Roger Needham于1994年發(fā)明。它以加密解密速度快、效率高、實現(xiàn)簡單著稱。該算法的可靠性是通過加密輪數(shù)而不是算法的復(fù)雜度來保證的,TEA算法主要運用了移位和異或運算,密鑰在加密過程中始終不變。它是一種分組密碼算法,其明文密文塊為64比特,密鑰長度為128比特。TEA算法利用不斷增加的Delta(黃金分割率)值作為變化,使得每輪的加密不相同,有很強的抗差分分析能力。
DES算法又被稱為美國數(shù)據(jù)加密標(biāo)準(zhǔn),是上世紀(jì)七十年代美國IBM公司研制的對稱密碼體制加密算法,并在1977年成為美國官方加密標(biāo)準(zhǔn)。DES的工作原理為:明文按64位進(jìn)行分組,每個塊用64位密鑰進(jìn)行加密,密鑰事實上是56位參與DES運算(第8、16、24、32、40、48、56、64位是校驗位,使得每個密鑰都有奇數(shù)個1),分組后的明文組和56位的密鑰按位替代或交換的方法形成密文組。每塊先用初始置換方法進(jìn)行加密,再連續(xù)進(jìn)行16次復(fù)雜的替換,最后再對其使用初始置換的逆。第i步的替換并不是直接利用原始的密鑰K,而是由K與i計算出的密鑰Ki。其入口參數(shù)有三個:key、data、mode。key為加密解密使用的密鑰,data為加密解密的數(shù)據(jù),mode為其工作模式。當(dāng)模式為加密模式時,明文按照64位進(jìn)行分組,形成明文組,key用于對數(shù)據(jù)加密,當(dāng)模式為解密模式時,key用于對數(shù)據(jù)解密。攻擊DES的主要形式被稱為蠻力或徹底密鑰搜索,即重復(fù)嘗試各種密鑰直到有一個符合為止。如果DES使用56位的密鑰,則可能的密鑰數(shù)量是2的56次方個。隨著計算機(jī)系統(tǒng)能力的不斷發(fā)展,DES的安全性比它剛出現(xiàn)時會弱得多,然而從非關(guān)鍵性質(zhì)的實際出發(fā),仍可以認(rèn)為它是足夠的。不過在實際使用中更多地選擇新的加密標(biāo)準(zhǔn)一高級加密標(biāo)準(zhǔn)。
密碼學(xué)中的高級加密標(biāo)準(zhǔn)(Advanced Encryption Standard,AES),是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過五年的甄選流程,高級加密標(biāo)準(zhǔn)由美國國家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)于2001年11月26日發(fā)布于FIPS PUB 197,并在2002年5月26日成為有效的標(biāo)準(zhǔn)。2006年,高級加密標(biāo)準(zhǔn)已然成為對稱密鑰加密中最流行的算法之一。AES的區(qū)塊長度固定為128比特,密鑰長度則可以是128,192或256比特,分別稱為AES—128,AES—192,AES—256,如果數(shù)據(jù)塊及密鑰長度不足時,則補齊之。AES算法是基于置換和代替的,置換是數(shù)據(jù)的重新排列,而代替是用一個單元數(shù)據(jù)替換另一個。AES算法使用了多重循環(huán)實現(xiàn)置換和替換,在規(guī)范中被稱為Bytes Sub(字節(jié)替換)——對數(shù)據(jù)的每個字節(jié)應(yīng)用非線性變換;Shift Rows(行位移變換)——對每一行字節(jié)循環(huán)重新排序;Mix Columns(列混合變換)——對矩陣的列應(yīng)用線性變換;Add Round Key——對狀態(tài)和每輪的子密鑰進(jìn)行異或操作。該算法對內(nèi)存的需求非常低,使得它很適應(yīng)于資源受限制的環(huán)境。
4、加解密在升級中的應(yīng)用
“在線升級”實際上是Flash數(shù)據(jù)存儲的一個特例。完成這樣的功能首先要求芯片提供的EEPROM的地址與程序空間是連續(xù)的,一致的,在用戶應(yīng)用程序中可以對另外一部分程序區(qū)進(jìn)行擦除寫入操作;再者芯片內(nèi)部Flash程序存儲器容量必須足夠大,使之可以分為幾個區(qū)域相互獨立。第一部分是用戶的boot程序,完成上電初始化和解密,并將接收的數(shù)據(jù)寫入指定地址。第二部分是程序標(biāo)識區(qū),標(biāo)記當(dāng)前用戶程序的運行地址。第三部分是應(yīng)用程序區(qū)1和應(yīng)用程序區(qū)2,當(dāng)程序運行在程序區(qū)1時可以對程序區(qū)2進(jìn)行升級,反之亦然。這兩個區(qū)域的大小必須不小于用戶的目標(biāo)代碼。
在用戶程序區(qū)可以存放幾組密鑰信息,與PC下傳的隨機(jī)數(shù)按照一定的規(guī)則生成解密所需的密鑰以保證每次加解密的密鑰信息有差異,只要保證每次密鑰是唯一的,數(shù)據(jù)的安全性是可以保證的。需要升級芯片中的程序時,PC機(jī)按照通信協(xié)議的格式下傳指令,用戶boot程序接收到指令后初始化各個變量和寄存器,關(guān)閉不需要的中斷,下傳的數(shù)據(jù)包交叉使用兩種加密算法,包號是奇數(shù)時用TEA算法加密并同時下傳兩組隨機(jī)數(shù)共16個字節(jié),一組是本次解密所用,另一組是下一包解密所用,下傳的數(shù)據(jù)包號是偶數(shù)時用AES算法加密。為提高運算速度,對AES算法的字節(jié)替換過程采用查表的方法。只要保證每次下傳的有效數(shù)據(jù)長度相同,足以達(dá)到欺騙性,即使所有數(shù)據(jù)被截獲,由于芯片內(nèi)部的密鑰無法讀出,截獲者也無法得到正確的明文。同時考慮到程序中數(shù)據(jù)容易處理,每次下傳的有效字節(jié)數(shù)選擇16的整數(shù)倍。boot程序?qū)?shù)據(jù)正確寫入存儲器后應(yīng)向上位機(jī)返回正確狀態(tài),否則應(yīng)返回出錯信息以便處理。程序升級完成后上位機(jī)發(fā)出結(jié)束命令并下傳校驗字符,boot程序核對正確后擦除程序標(biāo)志區(qū)并重新寫入標(biāo)識。
圖1 流程圖
用戶程序升級成功之后,可以通過函數(shù)指針的方式調(diào)用該程序。函數(shù)在編譯時都會被分配一個入口地址,該地址就是函數(shù)的指針。只要用一個指針變量指向這個函數(shù)的入口地址,就可以通過指針變量調(diào)用這個函數(shù)。函數(shù)指針的本質(zhì)是指針變量,只不過該指針變量指向函數(shù),讀出程序標(biāo)志區(qū)的運行地址就可以通過指針變量調(diào)用新寫入的程序。
5、結(jié)束語
為應(yīng)對網(wǎng)絡(luò)安全,有效保護(hù)知識產(chǎn)權(quán),本文提出了固件升級的數(shù)據(jù)加密方案,對于具有IAP功能的芯片具有普遍意義,不僅適用于網(wǎng)絡(luò)遠(yuǎn)程升級,同樣適用于本地升級。至于加密算法可以根據(jù)MCU的能力進(jìn)行靈活選擇。