SMEC98SP加密晶片方案例項
SMEC98SP加密晶片事例程式說明
本事例程式提供了兩部分的程式碼:
- SMEC98SP加密晶片的程式碼;
- 外部MCU的程式碼。
事例提供了MCU藉助於加密晶片來保護方案不被外界破解的典型例子。開發者可以根據自己的需求,定義出適合自己的加密方案。
目錄
功能說明
1.獲取SMEC98SP的UID號
事例程式提供了通過I2C通訊獲取SMEC98SP加密晶片的12位元組硬體ID號的方法。
利用此ID號,可以拓展一些應用,如:一卡一密等,即每個晶片可以設計成不一樣的金鑰,而只需一套主金鑰。
一卡一密的設計,可借用金融PBOC卡的金鑰分散概念來設計,即:利用主金鑰,對晶片ID做3DES運算,並將運算結果作為該卡的金鑰。
示意圖:
2.產生MCU及加密晶片的隨機數
SMEC98SP加密晶片具有硬體隨機數發生器,本例程提供了獲取SMEC98SP隨機數的方法。
一般的微控制器很少有硬體隨機數發生器,所以我們針對不同型別的MCU設計了不同的隨機數產生方式:
- 具有A/D數模轉換的MCU隨機數的產生:
利用ADC懸空引腳(通過讀取懸空模擬針腳值)產生隨機數種子,再將該隨機數種子,與MCU的UID和加密晶片的UID作運算(異或運算), 使得即使相同情況下,使用不同的MCU或加密晶片,其隨機數種子也不相同。
PIN碼原理:MCU和加密晶片分別存放著相同的PIN碼,MCU執行時,可以通過I2C傳送PIN碼給加密晶片進行驗證,如果PIN碼相同,且返回結果與預期一致,則認為加密晶片合法,否則認為加密晶片非法,而停止工作。
您可以利用SMEC98SP的UID,將PIN碼驗證優化一下,如:可以將每個加密晶片的PIN碼設計成跟UID相關,MCU先獲取SMEC98SP的UID,然後計算出對應的PIN碼值,再進行驗證,再判斷與預期是否一致。
優點:PIN碼驗證實現簡單,不需要新增額外的演算法程式碼。
缺點:PIN碼會在I2C線路上傳輸,容易被攻擊者監聽並破解。也可被攻擊者跳過“真值點”攻擊。
安全程度:★★
示意圖:
內部認證原理:MCU向SMEC98SP傳送8位元組隨機數, SMEC98SP用內部認證金鑰將隨機數進行3DES加密後回送給MCU, 由MCU判斷回送資料的合法性。
優點:金鑰不會線上路上傳輸,不怕攻擊者監聽I2C通訊資料。
缺點:金鑰值會存放在MCU中,如果攻擊者將MCU解密,並模擬除錯,有可能找出該金鑰。也可被攻擊者跳過“真值點”攻擊。
安全程度:★★★★
示意圖:
外部認證原理:MCU先獲取SMEC98SP的8位元組隨機數, 然後MCU用外部認證金鑰對隨機數做3DES加密,再將密文送給SMEC98SP,然後由SMEC98SP判斷該密文的合法性。
優點:金鑰不會線上路上傳輸,不怕攻擊者監聽I2C通訊資料。
缺點:金鑰值會存放在MCU中,如果攻擊者將MCU解密,並模擬除錯,有可能找出該金鑰。也可被攻擊者跳過“真值點”攻擊。
安全程度:★★★★
示意圖:
6.SHA1雜湊演算法認證
SHA1雜湊演算法認證原理:SHA1為一種摘要演算法,就是把任意長度的輸入,通過雜湊演算法,變換成固定長度(32位元組)的輸出,該輸出就是摘要值。
雜湊演算法具有單向性,即通過一組輸入資料,可以得到一組固定長度的輸出(摘要),但通過輸出,是不可以還原輸入值。
SHA1利用這種特性,可以將輸入資料前面的一部分作為金鑰值,分別存放於MCU及加密晶片中。MCU在做SHA1演算法認證時,只需將部分資料傳給加密晶片,由SMEC98SP內部再將“金鑰值”+ “輸入資料”一起做SHA1運算,並回送“摘要值”,MCU再判斷跟預期的值是否一致,實現SHA1演算法認證。
優點:金鑰不會線上路上傳輸,不怕攻擊者監聽I2C通訊資料。金鑰長度及每次輸入資料長度可以變化
缺點:金鑰值會存放在MCU中,如果攻擊者將MCU解密,並模擬除錯,有可能找出該金鑰。也可被攻擊者跳過“真值點”攻擊。
安全程度:★★★★
示意圖:
將 MCU 中的一部分關鍵程式碼,放入加密晶片中執行,當需要用到SMEC98SP中的演算法時,由MCU 向SMEC98SP 傳送指令,SMEC98SP 根據指令,在內部執行,返回結果給MCU。資料在I2C線路上傳輸,可以使用過程金鑰加密的方式傳輸。
我們例程中寫了一個算圓周長的簡單示例,具體實現如下:
1. 加密晶片中儲存算圓周長關鍵演算法(周長C = 2 *π* R)
2. 由 MCU 傳送算圓周長指令:72 00 00 01 03 (R = 03)
3. 加密晶片根據 R 值,利用周長公式,算出周長0x12,返回給MCU。
優點:關鍵演算法在加密晶片中,即使MCU 被破解,並被理解反彙編程式碼,也無濟於事。
缺點:暫無
安全程度:★★★★★
示意圖:
針對很多控制類需求,沒有"關鍵演算法"可以存放在加密晶片中,例程中構造了一個演算法:取PA埠資料2位元組,用過程金鑰加密後,送給SMEC98SP,再由SMEC98SP解密後取反,再由過程金鑰加密回送給MCU。這樣就“構造”出一個演算法。
如PA = 0x0000, 用過程金鑰加密送給SMEC98SP, SMEC98SP解密後得到0x0000, 取反後為0xFFFF, 再用過程金鑰加密給MCU,主控MCU解密後得到0xFFFF。這樣, 判斷IO口資料方式,只要跟之前相反就可以. 比如說PA0 高電平才做的動作, 呼叫了這個函式後,則判斷PA0為低電平去做。
由於每次上電,過程金鑰是臨時產生的, 並且是變化的,這樣即使PA口資料相同,線上路上通訊的資料也是不同的,而MCU程式又是基於"運算結果"而工作的,從而增加了破解難度,可以防止"真值點"攻擊。
優點:資料被過程金鑰加密傳出,即使相同資料,每次線上路上傳輸的內容也不一樣。
缺點:畢竟是“構造”出來的演算法,演算法複雜度不高。攻擊者拿到MCU的彙編程式碼後,模擬除錯,還是有可能將構造演算法逆推。
安全程度:★★★★☆
示意圖:
SMEC98SP內部有24K位元組程式區及8K位元組資料區域。其中8K位元組的資料區域可以設計成自由度寫,也可以設計成需要一定許可權(如驗證PIN,內部認證等)才能讀寫,還可以設計成密文方式讀寫。
樣例中,設計了利用過程金鑰密文讀取資料方法。由於過程金鑰每次是變化的,這樣即使是相同的資料,每次讀出來,線上路上傳輸的內容也是不一樣的。
優點:資料被過程金鑰加密傳出,即使相同資料,每次線上路上傳輸的內容也不一樣。
缺點:金鑰值會存放在MCU中,如果攻擊者將MCU解密,並模擬除錯,有可能找出該金鑰。
安全程度:★★★★
示意圖:
事例程式提供了明文讀取SMEC98SP中8K資料區域的方法,樣例中資料的起始地址是以位元組為單位。開發者可以根據自己的情況,決定是否允許讀取資料或者讀取資料的相關許可權。
事例程式提供了明文寫SMEC98SP資料區域的方法,樣例中資料的起始地址是以位元組為單位。開發者可以根據自己的情況,決定是否允許寫入資料或者寫入資料的相關許可權。
名詞解釋:
DES演算法
DES演算法是一種比較傳統的加密方式,其加密運算、解密運算使用的是同樣的金鑰,資訊的傳送者和資訊的接收者在進行資訊的傳輸與處理時,必須共同持有該密碼(稱為對稱密碼),是一種對稱加密演算法。DES是安全性比較高的一種演算法,除了窮舉外,沒有其他方法可破解。DES—金鑰長度為8位元組,資料為8位元組。
3DES演算法
3DES是針對DES演算法金鑰過短、而改進的一個措施,被稱為“3DES”。其實是通過執行3次DES來達到增加金鑰長度和安全。3DES—金鑰長度為16位元組,資料為8位元組。
過程金鑰
過程金鑰是一種會話金鑰(session key),是在使用過程中,基於主金鑰而臨時生成的加解密金鑰,會話結束後,過程金鑰失效。
金鑰分散
金鑰分散演算法簡稱Diversify,是指將一個雙長度的金鑰MK,對分散資料(也叫分散因子,如:卡號等)進行處理,推匯出一個雙長度的金鑰DK。
推到DK左半部分的方法是:
1、將分散因子的最右8個位元組作為輸入資料;
2、將MK作為加密金鑰;
3、用MK對輸入資料進行3DES運算;
推到DK右半部分的方法是:
1、將分散因子的最右8個位元組求反,作為輸入資料;
2、將MK作為加密金鑰;
3、用MK對輸入資料進行3DES運算;
這樣MK根據分散因子,可以得到分散金鑰DK。但根據DK,卻無法得到MK。
附件1 – 例程金鑰值
事例程式中,MCU及SMEC98SP加密晶片的各金鑰值如下:
內部認證金鑰:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
外部認證金鑰:10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
SHA1雜湊演算法認證金鑰:20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
產生過程金鑰的主控金鑰:30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
PIN碼:55 66 77 88 99 AA BB CC
宣告:本事例程式,只是提供瞭如何利用SMEC98SP保護方案不被破解的樣例,開發者可以根據自己的需求,參照本例程,設計自己的加密保護方案。千萬不要使用我們例程同樣的金鑰值!另外在MCU中,我們建議每組金鑰值請打散後分開存放於不同地方,這樣即使在攻擊者把MCU解密後,也很難拼湊出完整的金鑰值。
附件2 – SMEC98SP樣例指令
;Pin認證
--> 70 00 00 08 55 66 77 88 99 aa bb cc
<-- 9000
;雜湊演算法認證
--> 71 00 00 10 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
<-- 9000 3BD683BFC40F33254DE1BD6D0C2650BA1D07A56A
;實現一個簡單演算法,計算圓周長,外部輸入的是半徑,計算出周長。C = 2*3.14*R
--> 72 00 00 01 02
<-- 9000 0C
;外部認證,先取隨機數,再做認證
--> 84 00 00 08
<-- 9000 D309685B156B398B ;隨機數每次不同
--> 82 00 00 08 7fa49dbf221a8751 ;根據隨機數,外部認證金鑰計算
<-- 9000
;取晶片唯一序列號
--> 83 00 00 0C
<-- 9000 33D60D08844C905016707726 ;每個加密晶片不同ID號
;取隨機數
--> 84 00 00 08
<-- 9000 27F5EEDC149FE9FB
;內部認證
--> 88 00 00 08 11 22 33 44 55 66 77 88 ;假設主控晶片隨機數1122334455667788
<-- 9000 56BE32F01E736D0D
;產生過程金鑰 先取SMEC98SP的隨機數, 再送入隨機數, 計算出過程金鑰
--> A0 00 00 08 11 22 33 44 55 66 77 88 ;假設主控晶片隨機數1122334455667788
<-- 9000 2E2AB595F5186905 ;SMEC98SP隨機數每次不同
;過程金鑰為:fede17ed454baa2e (303132333435363738393A3B3C3D3E3F =>(1122334455667788 ^ 2E2AB595F5186905)3DES加密結果)
;埠資料運算
--> A2 00 00 08 df51daa6c1fdb929 ;假設埠資料為:0000, 過程金鑰:fede17ed454baa2e,(傳入資料:df51daa6c1fdb929 為過程金鑰fede17ed454baa2e 對 0000000000000000(埠資料0000+6位元組00填充)做DES加密 )
<-- 9000 C0E7FECFABB13417 ;輸出資料C0E7FECFABB13417,用過程金鑰解密後為ffffffffffffffff, 即為0000000000000000的取反"演算法", 該"演算法"可以根據需要修改
;讀取FLASH
--> B0 00 00 10
<-- 9000 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
;密文讀取FLASH
--> B1 00 00 10
<-- 9000 C0E7FECFABB13417C0E7FECFABB13417 ;用過程金鑰fede17ed454baa2e解密後為FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
;寫FLASH
--> D6 00 00 10 0102030405060708090A0B0C0D0E0F10
<-- 9000