atsha204a加密ic01

ATSHA204A加密芯片是ATMEL公司研發的一款高安全性的,功能豐富的加密IC,使用SHA-256算法進行加密操作,內置16*32字節的slot(EEPROM)可以存儲用戶數據和祕鑰,唯一的9字節序列號用於區分其他芯片,還有512bits的OTP區用於保存一些固定信息。芯片對外有2中通信方式,分別是單bus和i2c方式,本文所演示的全部使用I2C方式,但所有功能使用單bus方式也可以實現。
芯片管腳圖非常簡單,如下
SOCI封裝

這個是ATSHA204A的SOIC封裝,只需要電源,地,I2C的SCL和SDA這4根線即可,SCL和SDA需要上拉電阻。

首先我先講一下SHA-256到底是個什麼東東。
安全散列算法SHA(Secure Hash Algorithm)是美國國家安全局 (NSA) 設計,美國國家標準與技術研究院(NIST) 發佈的一系列密碼散列函數,包括 SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等變體。主要適用於數字簽名標準(DigitalSignature Standard DSS)裏面定義的數字簽名算法(Digital Signature Algorithm DSA),
SHA算法最主要的特點就是,任意長度的輸入能生成固定長度的輸出,並且從輸出的結果中不能還原輸入的內容,而且要找到不同兩個輸入導致相同輸出的情況在計算上不能實現。
ATSHA204A使用的SHA256算法,能輸出32字節(256位)的固定長度輸出,基於SHA算法的特性,我們完全可以做到程序啓動的祕鑰驗證,或者服務端和客戶端的祕鑰驗證來保護我們產品。
廢話說了一些,以下看一下如何使用I2C操作這款芯片,本文是假設已經對芯片進行默認配置的情況下來進行操作的,默認配置爲如下,
祕鑰保存在slot0,SlotConfig0.Bit12 = 0(表示在運行DeriveKey Command時,使用目標slot區的祕鑰進行SHA256計算而不是使用指定的parentkey)。然後對芯片的鎖定,鎖定後不能再對配置區進行修改,而數據區可根據配置來使用其他命令更新,詳細請見下篇——配置篇。

對ATSHA204A操作時,首先要對設備進行喚醒操作,喚醒操作如下
SDA線保持低電平60us,芯片退出休眠狀態,然後再等待2.5ms後,才能開始接受命令。
在發送I2C數據的時候,發送完設備地址後,應該發送一個word_address來指示這個包有何用處。如下
這裏寫圖片描述
在芯片手冊中已經註明了其他命令的作用,對芯片的操作主要使用command,即0x03來操作。

command有很多種,在驗證祕鑰的時候往往需要使用幾種命令。

這裏寫圖片描述
一般來說,我們用到的有這幾個
DerriveKey:更新一個slot區中的祕鑰命令。
Nonce:使用隨機數來更新TempKey中的值
CheckMAC:驗證一個摘要是否計算正確,返回的是Bool值類型(0是正確,1是錯誤)
MAC:使用SHA-256計算並返回一個摘要。
Read:讀取芯片區域中的數據。
Write:寫入芯片區域中的數據。(這個命令一般用在配置時)

其他命令相對來說使用比較少,而且其他有些命令也相對簡單好理解,但並不意味它們是沒有作用的,因篇幅問題,本文介紹幾個命令。

Nonce命令:

從字面命令上來理解,這裏是隨機命令的意思,的確如此。這個命令目的在於更新芯片中的TempKey值,什麼是TempKey,可以這樣理解,TempKey就類似於我們程序中的臨時變量,來保存一些中間結果用的,但這個TempKey值不能被訪問,只能芯片內部自己使用。
首先介紹Nonce命令也因爲它是其他多數命令執行前都要執行的一個命令。
這裏寫圖片描述
Nonce命令如上
比較關注於Param1 mode,其他都是固定的值
mode介紹如下
這裏寫圖片描述

好理解,0或者1的時候,需要我們輸入一個20字節的隨機數,然後更新芯片內的seed,更新seed能使內部產生的隨機數質量更高。2值不被允許,3的話就要求輸入32字節的隨機數,直接寫在TempKey中。
我們配置如下
opcode = 0x16,
mode = 0x01,
zero = 0x0000,
numin = 20字節隨機數
當命令正確執行的時候
將返回32字節的由芯片產生的randout隨機數,如果mode = 0x03,只返回Bool值。

MAC命令

使用MAC命令可以讓ATSHA204生成一個摘要。
如圖
這裏寫圖片描述
比較關注的是Param1 mode
這裏寫圖片描述
好像很複雜,不用擔心,複雜的問題我們把他簡化就好了。
mode.bit0控制的是使用Tempkey計算還是直接使用Data中的Challenge來計算返回的digest。
mode.bit1控制的是使用slot區中的值計算還是Tempkey中的值來計算返回的digest。
mode.bit2如果bit0或bit2設置了,那麼此位要匹配Tempkey.sourceflag位匹配。也就是說,使用了nonce命令的話,如果nonce命令中的nonce.mode == 0x00 或者0x01,這裏就等於0, 如果nonce.mode == 0x03,這裏就等於1。
mode.bit3 = 0
mode.bit4和mode.bit5 是選擇是否使用OTP中的的值來參與計算,個人覺得意義不大而且增加了配置時的複雜程度。設置爲0就好了。
mode.bit6是使用序列號來參與計算,可以設置。
mode.bit7 = 0

本人設置如下
opcode = 0x08
mode = 0x01|0x06
slotid = 0
challenge = 0

發送過去後,如果執行正常,會返回一個32字節的digest結果,這個結果的計算如下
這裏寫圖片描述
芯片內部會根據一系列的值去計算這個32字節的digest。

有什麼用?

看到這裏大家可能有這個疑問,返回這個值有什麼用?我要拿來做什麼?

別急,我爲大家講一個防程序拷貝的流程措施。
假設我們很辛苦的開發了程序,但是又不想被別人盜用勞動成果(執行文件被拷出來,抄個板繼續使用)。我們就要在啓動的時候驗證一下是否通關,不通關就不往下走。流程如下:
首先我們ATSHA204A芯片的slot0中寫入一個32字節的祕鑰,設置爲不可讀。這個祕鑰只有幾個人知道,並且不外泄,主控MCU與芯片相連,在啓動時候,首先我們要獲取芯片序列號,爲後面計算MAC。然後我們發送一個nonce命令給ATSHA204A,讓其更新內部的TempKey中的值,MCU內部也根據nonce的模式計算一下Tempkey的值,我們稱之爲host_tempkey,如果一切正常,那麼Tempkey和host_tempkey中的值是一致的,接下來MCU自己就可以根據host_tempkey、序列號、以及祕鑰計算,出一個摘要digest,我們稱之爲digest1,接下來給ATSHA204A發送MAC命令,ATSHA204A根據存儲在slot區域中的祕鑰來計算digest2並返回給MCU,MCU判斷digest1和digest2是否匹配,不匹配將程序掛起即可。
有幾個關鍵點要注意一下:
1、在I2C總線上並沒有傳送祕鑰,而是傳送根據祕鑰和一些列的值計算出來的digest,因此在總線上截獲祕鑰不可實現。
2、在自己的MCU上也存了祕鑰,別人獲取了16進制文件後是否有可能得到祕鑰,我只能說,的確存了,但是對於一個龐大的程序hex文件中尋找一個32字節的祕鑰,豈不是大海撈針?
3、在MCU上自己也要使用SHA-256算法計算摘要,怎麼實現,這個問題放心,在ATMEL官網上有已經實現好的庫,可以直接使用,但是這個庫在移植上有些問題需要改一下,本人已經移植好了基於stm32f103的版本,完全正常使用,並且帶有中文註釋,移植只需要修改幾個接口即可,有想業務合作的可以私信。
4、在使用nonce時,要發送一個隨機數給ATSHA204A,如果擔心隨機數質量不好,可以使用ATSHA204A的Random命令,就可以返回一個32字節的高質量的隨機數來使用,也可以用作其他用途。
5、是否有破解的可能?對於一些小單片機(51之類的),的確好破,反彙編後,跳過驗證步驟即可,但是stm32之類的強大功能單片機就不是那麼回事,首先如果你能反彙編,也得找出驗證步驟在哪裏,其次,我也不知道stm32有沒人做過反彙編,因此,只要祕鑰不泄露,要破解起來個人覺得也很難。畢竟這個可是軍方用過的東西。

HMAC命令

這個命令與MAC命令幾乎一樣。只不過使用的算法不一致,而且根據芯片手冊上介紹,效率也低。因此這裏不在論述。

CheckMAC命令

這個命令也是帶有驗證功能的,簡單來講,就是讓你計算好digest,發給ATSHA204A,然後ATSHA204A告訴你這個digest算的對不對,返回bool值

如下
這裏寫圖片描述
看了之前命令介紹,這裏大家都應該很明白了,
爲了方便起見,例子如下
mode = 0
SlotID = 0
ClientChal = 32字節,這裏MCU可以發送一個32字節的隨機數
ClientResp = 32字節,這裏就是MCU自己計算好的digest,發給ATSHA204
OtherData = 13字節如下
這裏寫圖片描述
不使用OTP,有關OTP的參數全部給0就好了
ClientResp 的計算要依據下面
這裏寫圖片描述
在官方庫裏面也封裝好了相關操作,直接拿來用即可。
如果一切正常,ATSHA204A返回的0,計算digest不對就返回1。

這個CheckMAC命令的作用,我個人覺得其中一個作業就是是去驗證密碼。比如有一個主設備,它把祕鑰存在slot0裏面,有一些從設備,要輸入正確的密碼才能使用主設備提供的服務,就可以用這種方式,這種方式在總線上也不會傳輸密碼,而且把密碼存在ATSHA204A裏面更安全(其他諸如flash,eeprom容易被盜取)。

DeriveKey命令

這個命令從字面上理解,就是變化Key的命令意思,的確,可以通過這個命令去更新slotid中的key。
這個命令內容簡單,但是理解起來比較費勁,根據手冊,介紹如下
這裏寫圖片描述

簡單講,就是slot.slotconfig[TargetKey].bit13要設置成1,否則DeriveKey將返回錯誤,然後如果slot.slotconfig[TargetKey].bit12爲0
要更新的祕鑰值將是TempKey和原先的祕鑰值計算出來的,slot.slotconfig[TargetKey].bit12爲1,則是TempKey和slot.slotconfig[TargetKey].WriteKey中指定的SlotID的值計算出來的。
另外,如果SlotConfig[TargetKey].bit15設置了的話,還需要輸入
一個MAC摘要,即如下
這裏寫圖片描述

以上都是配置階段配置好的,不能修改,而發送這個命令時帶如下參數即可,這裏寫圖片描述
因爲要用到TempKey,所以Nonce在DeriveKey命令執行前,需要被正確的執行,才能更新到TempKey中的值。
新的祕鑰由以下計算出來。
這裏寫圖片描述

而MCU自己也可以計算出這個新的祕鑰作爲使用。

當我們原有的祕鑰泄露的時候,可以使用這個命令來產生新的祕鑰繼續使用。

另外如果slot.slotconfig[TargetKey].bit12爲1和SlotConfig[TargetKey].Bit15爲1還有SlotConfig[ParentKey].SingleUse爲1的時候(ParentKey爲slot.slotconfig[TargetKey].WriteKey),則UseFlag[ParentKey]爲0的時候,DeriveKey將返回失敗,也就是說,我個人理解UseFlag[ParentKey]就是指示剩餘使用的次數,一旦這個次數爲0,那麼將不能使用這個ParentKey去生成其他TargetKey。

Read和Write命令

這兩個命令在配置階段用的較多,這兩個命令在我的下一篇,配置篇將會講到。
配置篇地址爲:http://blog.csdn.net/a5882230/article/details/52214845
至此,ATSHA204A芯片的基本使用也介紹完畢,基於這麼多種命令,我們可以把這個芯片用在很多地方,如防抄板,密碼驗證,消耗產品的匹對等等,當然還有其他一些功能這篇文章沒有介紹到,感興趣的朋友可以去完整的讀一遍datesheet,不過現在只有英文版的。

增加的接口

這裏寫圖片描述

測試樣例

這裏寫圖片描述

鑑於官方的燒錄器價格非常感人,而某寶上也沒有便宜的燒錄器,本人親自做了一塊小型燒錄板,可以進行小批量的燒錄,下面是燒錄器的樣式
燒錄器
上位機
有需要的朋友可以到以下鏈接看看
https://item.taobao.com/item.htm?spm=a230r.1.14.39.VXOPWN&id=550477591352&ns=1&abbucket=10#detail

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章