1. 程式人生 > >SMEC98SP加密晶片方案例項

SMEC98SP加密晶片方案例項

SMEC98SP加密晶片事例程式說明

 

本事例程式提供了兩部分的程式碼:

  1. SMEC98SP加密晶片的程式碼;
  2. 外部MCU的程式碼。

事例提供了MCU藉助於加密晶片來保護方案不被外界破解的典型例子。開發者可以根據自己的需求,定義出適合自己的加密方案。

目錄

功能說明... 2

1.      獲取SMEC98SP的UID號... 2

2.      產生MCU及加密晶片的隨機數... 2

3.      驗證PIN.. 3

4.      內部認證... 3

5.      外部認證... 4

6.      SHA1雜湊演算法認證... 4

7.      關鍵演算法放在加密晶片內... 5

8.      構造演算法... 6

9.      密文讀資料... 7

10.        讀資料... 8

11.        寫資料... 8

名詞解釋:... 8

DES演算法... 8

3DES演算法... 9

過程金鑰... 10

金鑰分散... 10

附件1 – 例程金鑰值... 10

附件2 – SMEC98SP樣例指令... 11

 

 

 

功能說明

1.獲取SMEC98SP的UID號

事例程式提供了通過I2C通訊獲取SMEC98SP加密晶片的12位元組硬體ID號的方法。

利用此ID號,可以拓展一些應用,如:一卡一密等,即每個晶片可以設計成不一樣的金鑰,而只需一套主金鑰。

一卡一密的設計,可借用金融PBOC卡的金鑰分散概念來設計,即:利用主金鑰,對晶片ID做3DES運算,並將運算結果作為該卡的金鑰。

示意圖:

2.產生MCU及加密晶片的隨機數

SMEC98SP加密晶片具有硬體隨機數發生器,本例程提供了獲取SMEC98SP隨機數的方法。

一般的微控制器很少有硬體隨機數發生器,所以我們針對不同型別的MCU設計了不同的隨機數產生方式:

  • 具有A/D數模轉換的MCU隨機數的產生:

利用ADC懸空引腳(通過讀取懸空模擬針腳值)產生隨機數種子,再將該隨機數種子,與MCU的UID和加密晶片的UID作運算(異或運算), 使得即使相同情況下,使用不同的MCU或加密晶片,其隨機數種子也不相同。

3.驗證PIN

PIN碼原理:MCU和加密晶片分別存放著相同的PIN碼,MCU執行時,可以通過I2C傳送PIN碼給加密晶片進行驗證,如果PIN碼相同,且返回結果與預期一致,則認為加密晶片合法,否則認為加密晶片非法,而停止工作。

您可以利用SMEC98SP的UID,將PIN碼驗證優化一下,如:可以將每個加密晶片的PIN碼設計成跟UID相關,MCU先獲取SMEC98SP的UID,然後計算出對應的PIN碼值,再進行驗證,再判斷與預期是否一致。

優點:PIN碼驗證實現簡單,不需要新增額外的演算法程式碼。

缺點:PIN碼會在I2C線路上傳輸,容易被攻擊者監聽並破解。也可被攻擊者跳過“真值點”攻擊。

安全程度:★★

示意圖:

4.內部認證

內部認證原理:MCU向SMEC98SP傳送8位元組隨機數, SMEC98SP用內部認證金鑰將隨機數進行3DES加密後回送給MCU, 由MCU判斷回送資料的合法性。

優點:金鑰不會線上路上傳輸,不怕攻擊者監聽I2C通訊資料。

缺點:金鑰值會存放在MCU中,如果攻擊者將MCU解密,並模擬除錯,有可能找出該金鑰。也可被攻擊者跳過“真值點”攻擊。

安全程度:★★★★

示意圖:

5.外部認證

外部認證原理: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解密,並模擬除錯,有可能找出該金鑰。也可被攻擊者跳過“真值點”攻擊。

安全程度:★★★★

示意圖:

7.關鍵演算法放在加密晶片內

將 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 被破解,並被理解反彙編程式碼,也無濟於事。

缺點:暫無

安全程度:★★★★★

示意圖:

8.構造演算法

針對很多控制類需求,沒有"關鍵演算法"可以存放在加密晶片中,例程中構造了一個演算法:取PA埠資料2位元組,用過程金鑰加密後,送給SMEC98SP,再由SMEC98SP解密後取反,再由過程金鑰加密回送給MCU。這樣就“構造”出一個演算法。

如PA = 0x0000, 用過程金鑰加密送給SMEC98SP, SMEC98SP解密後得到0x0000, 取反後為0xFFFF, 再用過程金鑰加密給MCU,主控MCU解密後得到0xFFFF。這樣, 判斷IO口資料方式,只要跟之前相反就可以. 比如說PA0 高電平才做的動作, 呼叫了這個函式後,則判斷PA0為低電平去做。

由於每次上電,過程金鑰是臨時產生的, 並且是變化的,這樣即使PA口資料相同,線上路上通訊的資料也是不同的,而MCU程式又是基於"運算結果"而工作的,從而增加了破解難度,可以防止"真值點"攻擊。

優點:資料被過程金鑰加密傳出,即使相同資料,每次線上路上傳輸的內容也不一樣。

缺點:畢竟是“構造”出來的演算法,演算法複雜度不高。攻擊者拿到MCU的彙編程式碼後,模擬除錯,還是有可能將構造演算法逆推。

安全程度:★★★★☆

示意圖:

9.密文讀資料

SMEC98SP內部有24K位元組程式區及8K位元組資料區域。其中8K位元組的資料區域可以設計成自由度寫,也可以設計成需要一定許可權(如驗證PIN,內部認證等)才能讀寫,還可以設計成密文方式讀寫。

樣例中,設計了利用過程金鑰密文讀取資料方法。由於過程金鑰每次是變化的,這樣即使是相同的資料,每次讀出來,線上路上傳輸的內容也是不一樣的。

優點:資料被過程金鑰加密傳出,即使相同資料,每次線上路上傳輸的內容也不一樣。

缺點:金鑰值會存放在MCU中,如果攻擊者將MCU解密,並模擬除錯,有可能找出該金鑰。

安全程度:★★★★

示意圖:

10.讀資料

事例程式提供了明文讀取SMEC98SP中8K資料區域的方法,樣例中資料的起始地址是以位元組為單位。開發者可以根據自己的情況,決定是否允許讀取資料或者讀取資料的相關許可權。

11.寫資料

事例程式提供了明文寫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