本事例程序提供了兩部分的代碼:
???? 1.?SMEC98SP加密芯片的代碼;
???? 2.?外部MCU的代碼。
? 事例提供了MCU借助于加密芯片來保護(hù)方案不被外界破解的典型例子。開發(fā)者可以根據(jù)自己的需求,定義出適合自己的加密方案。
1.?獲取SMEC98SP的UID號(hào)
事例程序提供了通過I2C通訊獲取SMEC98SP加密芯片的12字節(jié)硬件ID號(hào)的方法。
利用此ID號(hào),可以拓展一些應(yīng)用,如:一卡一密等,即每個(gè)芯片可以設(shè)計(jì)成不一樣的密鑰,而只需一套主密鑰。
一卡一密的設(shè)計(jì),可借用金融PBOC卡的密鑰分散概念來設(shè)計(jì),即:利用主密鑰,對芯片ID做3DES運(yùn)算,并將運(yùn)算結(jié)果作為該卡的密鑰。
示意圖:
?
2.?產(chǎn)生MCU及加密芯片的隨機(jī)數(shù)
SMEC98SP加密芯片具有硬件隨機(jī)數(shù)發(fā)生器,本例程提供了獲取SMEC98SP隨機(jī)數(shù)的方法。
一般的單片機(jī)很少有硬件隨機(jī)數(shù)發(fā)生器,所以我們針對不同類型的MCU設(shè)計(jì)了不同的隨機(jī)數(shù)產(chǎn)生方式:
?具有A/D數(shù)模轉(zhuǎn)換的MCU隨機(jī)數(shù)的產(chǎn)生:
利用ADC懸空引腳(通過讀取懸空模擬針腳值)產(chǎn)生隨機(jī)數(shù)種子,再將該隨機(jī)數(shù)種子,與MCU的UID和加密芯片的UID作運(yùn)算(異或運(yùn)算), 使得即使相同情況下,使用不同的MCU或加密芯片,其隨機(jī)數(shù)種子也不相同。
??3.?驗(yàn)證PIN
PIN碼原理:MCU和加密芯片分別存放著相同的PIN碼,MCU運(yùn)行時(shí),可以通過I2C發(fā)送PIN碼給加密芯片進(jìn)行驗(yàn)證,如果PIN碼相同,且返回結(jié)果與預(yù)期一致,則認(rèn)為加密芯片合法,否則認(rèn)為加密芯片非法,而停止工作。
您可以利用SMEC98SP的UID,將PIN碼驗(yàn)證優(yōu)化一下,如:可以將每個(gè)加密芯片的PIN碼設(shè)計(jì)成跟UID相關(guān),MCU先獲取SMEC98SP的UID,然后計(jì)算出對應(yīng)的PIN碼值,再進(jìn)行驗(yàn)證,再判斷與預(yù)期是否一致。
優(yōu)點(diǎn):PIN碼驗(yàn)證實(shí)現(xiàn)簡單,不需要添加額外的算法代碼。
缺點(diǎn):PIN碼會(huì)在I2C線路上傳輸,容易被攻擊者監(jiān)聽并破解。也可被攻擊者跳過“真值點(diǎn)”攻擊。
安全程度:★★
示意圖:

?? 4.?內(nèi)部認(rèn)證
內(nèi)部認(rèn)證原理:MCU向SMEC98SP發(fā)送8字節(jié)隨機(jī)數(shù), SMEC98SP用內(nèi)部認(rèn)證密鑰將隨機(jī)數(shù)進(jìn)行3DES加密后回送給MCU, 由MCU判斷回送數(shù)據(jù)的合法性。
優(yōu)點(diǎn):密鑰不會(huì)在線路上傳輸,不怕攻擊者監(jiān)聽I2C通訊數(shù)據(jù)。
缺點(diǎn):密鑰值會(huì)存放在MCU中,如果攻擊者將MCU解密,并仿真調(diào)試,有可能找出該密鑰。也可被攻擊者跳過“真值點(diǎn)”攻擊。
安全程度:★★★★
示意圖:
?
?
5.?外部認(rèn)證
外部認(rèn)證原理:MCU先獲取SMEC98SP的8字節(jié)隨機(jī)數(shù), 然后MCU用外部認(rèn)證密鑰對隨機(jī)數(shù)做3DES加密,再將密文送給SMEC98SP,然后由SMEC98SP判斷該密文的合法性。
優(yōu)點(diǎn):密鑰不會(huì)在線路上傳輸,不怕攻擊者監(jiān)聽I2C通訊數(shù)據(jù)。
缺點(diǎn):密鑰值會(huì)存放在MCU中,如果攻擊者將MCU解密,并仿真調(diào)試,有可能找出該密鑰。也可被攻擊者跳過“真值點(diǎn)”攻擊。
安全程度:★★★★
示意圖:

?
6.?SHA1哈希算法認(rèn)證
SHA1哈希算法認(rèn)證原理:SHA1為一種摘要算法,就是把任意長度的輸入,通過散列算法,變換成固定長度(32字節(jié))的輸出,該輸出就是摘要值。
哈希算法具有單向性,即通過一組輸入數(shù)據(jù),可以得到一組固定長度的輸出(摘要),但通過輸出,是不可以還原輸入值。
SHA1利用這種特性,可以將輸入數(shù)據(jù)前面的一部分作為密鑰值,分別存放于MCU及加密芯片中。MCU在做SHA1算法認(rèn)證時(shí),只需將部分?jǐn)?shù)據(jù)傳給加密芯片,由SMEC98SP內(nèi)部再將“密鑰值”+ “輸入數(shù)據(jù)”一起做SHA1運(yùn)算,并回送“摘要值”,MCU再判斷跟預(yù)期的值是否一致,實(shí)現(xiàn)SHA1算法認(rèn)證。
優(yōu)點(diǎn):密鑰不會(huì)在線路上傳輸,不怕攻擊者監(jiān)聽I2C通訊數(shù)據(jù)。密鑰長度及每次輸入數(shù)據(jù)長度可以變化
缺點(diǎn):密鑰值會(huì)存放在MCU中,如果攻擊者將MCU解密,并仿真調(diào)試,有可能找出該密鑰。也可被攻擊者跳過“真值點(diǎn)”攻擊。
安全程度:★★★★
示意圖:

???
7.?關(guān)鍵算法放在加密芯片內(nèi)
將 MCU 中的一部分關(guān)鍵代碼,放入加密芯片中運(yùn)行,當(dāng)需要用到SMEC98SP中的算法時(shí),由MCU 向SMEC98SP 發(fā)送指令,SMEC98SP 根據(jù)指令,在內(nèi)部運(yùn)行,返回結(jié)果給MCU。數(shù)據(jù)在I2C線路上傳輸,可以使用過程密鑰加密的方式傳輸。
我們例程中寫了一個(gè)算圓周長的簡單示例,具體實(shí)現(xiàn)如下:
1. 加密芯片中存儲(chǔ)算圓周長關(guān)鍵算法(周長C = 2 *π* R)
2. 由 MCU 發(fā)送算圓周長指令:72 00 00 01 03 (R = 03)
3. 加密芯片根據(jù) R 值,利用周長公式,算出周長0x12,返回給MCU。
優(yōu)點(diǎn):關(guān)鍵算法在加密芯片中,即使MCU 被破解,并被理解反匯編代碼,也無濟(jì)于事。
缺點(diǎn):暫無
安全程度:★★★★★
示意圖:

?
8.?構(gòu)造算法
針對很多控制類需求,沒有"關(guān)鍵算法"可以存放在加密芯片中,例程中構(gòu)造了一個(gè)算法:取PA端口數(shù)據(jù)2字節(jié),用過程密鑰加密后,送給SMEC98SP,再由SMEC98SP解密后取反,再由過程密鑰加密回送給MCU。這樣就“構(gòu)造”出一個(gè)算法。
如PA = 0x0000, 用過程密鑰加密送給SMEC98SP, SMEC98SP解密后得到0x0000, 取反后為0xFFFF, 再用過程密鑰加密給MCU,主控MCU解密后得到0xFFFF。這樣, 判斷IO口數(shù)據(jù)方式,只要跟之前相反就可以. 比如說PA0 高電平才做的動(dòng)作, 調(diào)用了這個(gè)函數(shù)后,則判斷PA0為低電平去做。
由于每次上電,過程密鑰是臨時(shí)產(chǎn)生的, 并且是變化的,這樣即使PA口數(shù)據(jù)相同,在線路上通訊的數(shù)據(jù)也是不同的,而MCU程序又是基于"運(yùn)算結(jié)果"而工作的,從而增加了破解難度,可以防止"真值點(diǎn)"攻擊。
優(yōu)點(diǎn):數(shù)據(jù)被過程密鑰加密傳出,即使相同數(shù)據(jù),每次在線路上傳輸?shù)膬?nèi)容也不一樣。
缺點(diǎn):畢竟是“構(gòu)造”出來的算法,算法復(fù)雜度不高。攻擊者拿到MCU的匯編代碼后,仿真調(diào)試,還是有可能將構(gòu)造算法逆推。
安全程度:★★★★☆
示意圖:
?
9.?密文讀數(shù)據(jù)
SMEC98SP內(nèi)部有24K字節(jié)程序區(qū)及8K字節(jié)數(shù)據(jù)區(qū)域。其中8K字節(jié)的數(shù)據(jù)區(qū)域可以設(shè)計(jì)成自由度寫,也可以設(shè)計(jì)成需要一定權(quán)限(如驗(yàn)證PIN,內(nèi)部認(rèn)證等)才能讀寫,還可以設(shè)計(jì)成密文方式讀寫。
樣例中,設(shè)計(jì)了利用過程密鑰密文讀取數(shù)據(jù)方法。由于過程密鑰每次是變化的,這樣即使是相同的數(shù)據(jù),每次讀出來,在線路上傳輸?shù)膬?nèi)容也是不一樣的。
優(yōu)點(diǎn):數(shù)據(jù)被過程密鑰加密傳出,即使相同數(shù)據(jù),每次在線路上傳輸?shù)膬?nèi)容也不一樣。
缺點(diǎn):密鑰值會(huì)存放在MCU中,如果攻擊者將MCU解密,并仿真調(diào)試,有可能找出該密鑰。
安全程度:★★★★
示意圖:
?
10.?讀數(shù)據(jù)
事例程序提供了明文讀取SMEC98SP中8K數(shù)據(jù)區(qū)域的方法,樣例中數(shù)據(jù)的起始地址是以字節(jié)為單位。開發(fā)者可以根據(jù)自己的情況,決定是否允許讀取數(shù)據(jù)或者讀取數(shù)據(jù)的相關(guān)權(quán)限。
?11.?寫數(shù)據(jù)
事例程序提供了明文寫SMEC98SP數(shù)據(jù)區(qū)域的方法,樣例中數(shù)據(jù)的起始地址是以字節(jié)為單位。開發(fā)者可以根據(jù)自己的情況,決定是否允許寫入數(shù)據(jù)或者寫入數(shù)據(jù)的相關(guān)權(quán)限。
?名詞解釋:
DES算法
DES算法是一種比較傳統(tǒng)的加密方式,其加密運(yùn)算、解密運(yùn)算使用的是同樣的密鑰,信息的發(fā)送者和信息的接收者在進(jìn)行信息的傳輸與處理時(shí),必須共同持有該密碼(稱為對稱密碼),是一種對稱加密算法。DES是安全性比較高的一種算法,除了窮舉外,沒有其他方法可破解。DES—密鑰長度為8字節(jié),數(shù)據(jù)為8字節(jié)。

???
??3DES算法
3DES是針對DES算法密鑰過短、而改進(jìn)的一個(gè)措施,被稱為“3DES”。其實(shí)是通過執(zhí)行3次DES來達(dá)到增加密鑰長度和安全。3DES—密鑰長度為16字節(jié),數(shù)據(jù)為8字節(jié)。
?
過程密鑰
過程密鑰是一種會(huì)話密鑰(session key),是在使用過程中,基于主密鑰而臨時(shí)生成的加解密密鑰,會(huì)話結(jié)束后,過程密鑰失效。
?密鑰分散
密鑰分散算法簡稱Diversify,是指將一個(gè)雙長度的密鑰MK,對分散數(shù)據(jù)(也叫分散因子,如:卡號(hào)等)進(jìn)行處理,推導(dǎo)出一個(gè)雙長度的密鑰DK。
推到DK左半部分的方法是:
1、將分散因子的最右8個(gè)字節(jié)作為輸入數(shù)據(jù);
2、將MK作為加密密鑰;
3、用MK對輸入數(shù)據(jù)進(jìn)行3DES運(yùn)算;
推到DK右半部分的方法是:
1、將分散因子的最右8個(gè)字節(jié)求反,作為輸入數(shù)據(jù);
2、將MK作為加密密鑰;
3、用MK對輸入數(shù)據(jù)進(jìn)行3DES運(yùn)算;
這樣MK根據(jù)分散因子,可以得到分散密鑰DK。但根據(jù)DK,卻無法得到MK。
相關(guān)案例