本發(fā)明涉及芯片安全領(lǐng)域,特別是涉及一種安全芯片中抵御模板攻擊的密鑰裝載方法。
背景技術(shù):
任何實(shí)際的密碼設(shè)備在運(yùn)行時(shí)都會(huì)散發(fā)出各種形式的信息,如功耗,電磁輻射,聲音,運(yùn)行時(shí)間等。這些信息可以被收集與分析并以此恢復(fù)出密碼設(shè)備的秘密信息,這樣的攻擊就叫做旁路攻擊。旁路攻擊是針對(duì)密碼算法的硬件實(shí)現(xiàn)的,而不是針對(duì)某個(gè)算法本身的。因此即使某個(gè)密碼算法在數(shù)學(xué)上,在理論上被證明是安全的,它在實(shí)際應(yīng)用中仍然有可能會(huì)以旁路攻擊的方式被攻破。事實(shí)證明,密碼算法的常規(guī)的實(shí)現(xiàn)方法通常無(wú)法抵抗旁路攻擊。其中,Paul Kocher等人于1998年提出了功耗分析,而Suresh Charl等人在2002年的密碼硬件與嵌入式系統(tǒng)國(guó)際會(huì)議上最早提出了模板攻擊,隨后,Dakshi Agrawal等人也在CHES 2005上發(fā)表文章提出將模板攻擊方式與功耗分析相結(jié)合的攻擊方法,即基于模板的DPA(差分功耗分析)。模板攻擊的可怕之處在于,它可以完全避開(kāi)密碼運(yùn)算本身而對(duì)密鑰數(shù)據(jù)的載入展開(kāi)分析,使得該攻擊與密碼本身的安全性完全無(wú)關(guān)。
在模板攻擊中,攻擊者先對(duì)一個(gè)可以自由配置的密碼設(shè)備,進(jìn)行建模。通常以字節(jié)為單位,對(duì)于所有的可能密鑰值進(jìn)行配置,并獲取其傳輸時(shí)的功耗信息,將其功耗信息中的均值,協(xié)方差等統(tǒng)計(jì)相關(guān)信息進(jìn)行記錄完成 模板建立。而在攻擊時(shí),將其密鑰傳輸?shù)倪^(guò)程中的功耗信息與先前建立的模板進(jìn)行匹配,就可以確定具體的密鑰值。由于密鑰數(shù)據(jù)的傳輸過(guò)程中,不同的字節(jié)數(shù)據(jù)的功耗特征確實(shí)有一定區(qū)別并可以在統(tǒng)計(jì)規(guī)律中被區(qū)分,因此模板攻擊對(duì)于密鑰載入過(guò)程的攻擊十分有效,也成為了現(xiàn)今旁路攻擊方向的研究熱點(diǎn)。
而對(duì)于秘密數(shù)據(jù)的傳輸,傳統(tǒng)的直接拷貝方式可以很輕易地被模板攻擊所突破,因此,也有一些針對(duì)模板攻擊的防御方式,比如在拷貝過(guò)程中增加隨機(jī)因素,使得數(shù)據(jù)以隨機(jī)的順序被拷貝。
在該數(shù)據(jù)傳輸方法中,增加了一個(gè)隨機(jī)序列的輸入,給定了一個(gè)長(zhǎng)度大小一定的隨機(jī)序列rndSeq之后,源地址的數(shù)據(jù)以隨機(jī)的順序拷貝到目的地址。這樣在其每次傳輸過(guò)程都不相同且無(wú)法預(yù)測(cè),就無(wú)法在攻擊時(shí)獲得大量功耗的統(tǒng)計(jì)信息。
然而,在模板攻擊的效率和精度不斷提升的現(xiàn)在,這樣的方法的安全性仍然不夠,因?yàn)楣粽咴诮r(shí)只要將所有的密鑰數(shù)據(jù)設(shè)成相同的數(shù)值就能進(jìn)行準(zhǔn)確的建模了。而在攻擊時(shí),由于理想狀況下,一次數(shù)據(jù)傳輸拷貝過(guò)程獲得的功耗信息就有可能泄露所有的傳輸數(shù)據(jù)信息,因此攻擊者雖然無(wú)法得到正確的順序,但是可以得到全部的數(shù)據(jù),只要進(jìn)行一定次數(shù)的 窮舉就能完成攻擊與破解。
因此,這類純粹加入隨機(jī)因素的防御方法雖然有一定安全性,但仍有風(fēng)險(xiǎn)。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明要解決的技術(shù)問(wèn)題是提供一種安全芯片中抵御模板攻擊的密鑰裝載方法,具有更高的安全性,即使模板攻擊能對(duì)芯片傳輸?shù)臄?shù)據(jù)進(jìn)行完美的解析,仍然很難得到任何的密鑰信息。
為解決上述技術(shù)問(wèn)題,本發(fā)明的安全芯片中抵御模板攻擊的密鑰裝載方法,包括以下步驟:
步驟1,定義一種密鑰數(shù)據(jù)的變換規(guī)則,密鑰數(shù)據(jù)通過(guò)該規(guī)則進(jìn)行變換,變換后的密鑰數(shù)據(jù)具有所有字節(jié)互不相同的特點(diǎn),密鑰數(shù)據(jù)后續(xù)的存儲(chǔ)與傳輸都在變換后的數(shù)據(jù)上進(jìn)行;
步驟2,在密鑰存儲(chǔ)時(shí),將長(zhǎng)度為n個(gè)字節(jié)的變換后的密鑰按字節(jié)存儲(chǔ)至真實(shí)密鑰地址,并將另外256-n個(gè)字節(jié)的非密鑰數(shù)據(jù)存儲(chǔ)至混淆密鑰地址;真實(shí)密鑰地址和混淆密鑰地址的并集稱為密鑰區(qū);
步驟3:當(dāng)密鑰從密鑰區(qū)讀取傳輸時(shí),以隨機(jī)的方式按字節(jié)讀取所有密鑰區(qū)的數(shù)據(jù),將真實(shí)密鑰地址的密鑰字節(jié)傳輸至正確的目的地址,將混淆密鑰地址的非密鑰數(shù)據(jù)傳輸至無(wú)關(guān)的目的地址;
其中,k<n≤256,0<k≤210,k為變換前的密鑰長(zhǎng)度,n為變換后的密鑰長(zhǎng)度。
步驟1中所述的密鑰數(shù)據(jù)的變換規(guī)則,是一種任意的規(guī)則,并滿足以下條件:
a、對(duì)于任意兩個(gè)變換前不完全相同的密鑰,其變換后的數(shù)據(jù)也不完全相同;
b、根據(jù)變換后的密鑰能計(jì)算出原密鑰。
步驟2中所述的另外256-n個(gè)字節(jié)指得是,與變換后的密鑰的任意一個(gè)字節(jié)都不相等的所有可能字節(jié)值。由于變換后的密鑰是互不相同的n個(gè)字節(jié),因此滿足條件的可能字節(jié)值有(256-n)個(gè)。
步驟2中的真實(shí)密鑰地址和混淆密鑰地址,總共是256個(gè)字節(jié)地址;當(dāng)變換后的密鑰為n個(gè)字節(jié)時(shí),真實(shí)密鑰地址為n個(gè),混淆密鑰地址為256-n個(gè);真實(shí)密鑰地址和混淆密鑰地址可以是連續(xù)的,也可以是分散的。
步驟2中所述將另外256-n個(gè)字節(jié)的非秘鑰數(shù)據(jù)存儲(chǔ)至混淆密鑰地址,其存儲(chǔ)關(guān)系是任意的,也即可以將任意一個(gè)非密鑰字節(jié)存儲(chǔ)到混淆密鑰地址中的任意一個(gè)。
步驟3中所述的無(wú)關(guān)的目的地址,其地址與真實(shí)的目的地址無(wú)重疊,并且與真實(shí)的目的地址是相同的存儲(chǔ)介質(zhì),并有相同的結(jié)構(gòu),即數(shù)據(jù)存儲(chǔ)時(shí)的功耗特征一致。
采用本發(fā)明的方法,在傳輸不同的密鑰時(shí),始終將256個(gè)字節(jié)數(shù)據(jù)(0x00-0xFF)都傳輸一遍,并且順序是隨機(jī)的。因此,即使模板攻擊能破解傳輸數(shù)據(jù)的具體值,也對(duì)破解密鑰信息沒(méi)有任何幫助,仍然很難得到任何的密鑰信息。
本發(fā)明可以規(guī)避純粹加入隨機(jī)因素的防御方法所存在的風(fēng)險(xiǎn),具有更高的安全性。
具體實(shí)施方式
所述安全芯片中抵御模板攻擊的密鑰裝載方法,涉及芯片中要將一組秘密數(shù)據(jù)(如密碼算法中的密鑰)從一種存儲(chǔ)介質(zhì)傳輸?shù)搅硪环N存儲(chǔ)介質(zhì)的過(guò)程中,抵御模板攻擊的安全傳輸方案,并且涉及到了該秘密數(shù)據(jù)在存儲(chǔ)介質(zhì)中的存儲(chǔ)方式。旨在消除不同密鑰在傳輸時(shí)的可區(qū)分性,做到對(duì)于不同的兩個(gè)密鑰,其傳輸過(guò)程沒(méi)有任何區(qū)別。因此,在傳輸真實(shí)密鑰的同時(shí),還必須添加虛假的密鑰傳輸,使得總的傳輸過(guò)程達(dá)到一致。其具體步驟如下:
步驟1、定義一個(gè)密鑰變換規(guī)則,將密鑰數(shù)據(jù)按特定設(shè)計(jì)的規(guī)則進(jìn)行變換,以增加總長(zhǎng)度(字節(jié)數(shù))為代價(jià),使得變換后的密鑰沒(méi)有重復(fù)的字節(jié)數(shù)據(jù),也即任意兩個(gè)字節(jié)都不相同,并用變換后的數(shù)據(jù)進(jìn)行存儲(chǔ)和傳輸。
假設(shè)原密鑰長(zhǎng)度為k個(gè)字節(jié),因此其共有256k種可能。如果變換后的密鑰長(zhǎng)度不變,其密鑰空間僅為256!/(256-k)!。必然小于256k。故變換后的密鑰長(zhǎng)度增加是必然的。顯然,原始的密鑰長(zhǎng)度和變換后的密鑰長(zhǎng)度都不能超過(guò)256。并且有256!/(256-k)!≥256k,可得k≤210。
當(dāng)原密鑰長(zhǎng)度小于210個(gè)字節(jié)時(shí),一定不存在這樣的變換,因此,若需要傳輸?shù)拿荑€超過(guò)210字節(jié),則必需分段后再按本發(fā)明的規(guī)則存儲(chǔ)、傳輸。
步驟2、密鑰存儲(chǔ)時(shí),將變換后的n個(gè)字節(jié)的真實(shí)密鑰存儲(chǔ)于真實(shí)密鑰 地址,而將(256-n)個(gè)混淆數(shù)據(jù)存儲(chǔ)于混淆密鑰區(qū)(由于這些數(shù)據(jù)是無(wú)用的,因此存儲(chǔ)的排列順序可以隨意)。
經(jīng)過(guò)步驟1的變換后,n個(gè)字節(jié)的密鑰的數(shù)據(jù)已經(jīng)互不相等,這樣只要將沒(méi)有出現(xiàn)在變換后的密鑰中的(256-n)種可能字節(jié)值定為混淆密鑰,就可以使得真實(shí)密鑰與混淆密鑰的并集成為256個(gè)字節(jié)全體了。真實(shí)密鑰地址和混淆密鑰地址可以由系統(tǒng)固定下來(lái),這些地址可以連續(xù)也可以分散,真實(shí)密鑰地址和混淆密鑰地址可以順序安排也可以相互穿插。
步驟3、密鑰傳輸時(shí),先獲得一個(gè)0~255的隨機(jī)序列,然后根據(jù)隨機(jī)序列的順序?qū)⑺械拿荑€(包括真實(shí)和混淆的)讀取傳輸,其中,如果源地址是真實(shí)密鑰地址,則數(shù)據(jù)傳輸至正確的目的地址,而如果源地址是混淆密鑰地址,則數(shù)據(jù)傳輸至無(wú)關(guān)的目的地址(數(shù)據(jù)僅僅被傳輸,但不會(huì)被后續(xù)使用)。
按這樣的傳輸規(guī)則,從0x00-0xFF這256個(gè)字節(jié),都會(huì)在過(guò)程中被傳輸1次,順序隨機(jī),并且與密鑰信息完全無(wú)關(guān)。攻擊者完全無(wú)法從傳輸?shù)臄?shù)據(jù)內(nèi)容推斷出密鑰的任何部份。其中混淆密鑰被拷貝去了無(wú)關(guān)的地址,但是該地址的存儲(chǔ)介質(zhì)必須與真實(shí)密鑰傳輸去的介質(zhì)相同,這樣攻擊者就無(wú)法通過(guò)功耗特征來(lái)判斷過(guò)程中傳輸?shù)臄?shù)據(jù)是真實(shí)密鑰還是混淆密鑰。系統(tǒng)在得到變換后的密鑰后可以重新計(jì)算出正確密鑰并進(jìn)行計(jì)算,這一部份的防御可另外處理,不在本發(fā)明涉及的范圍之內(nèi)。
本發(fā)明的存儲(chǔ)與傳輸邏輯如下:
其中密鑰的存儲(chǔ)過(guò)程是在安全環(huán)境下的,不用考慮攻擊,在secure_key_store函數(shù)中,輸入?yún)?shù)key是變換前的密鑰,keyAddrList是存放真實(shí)密鑰的地址列表,而fakeAddrList是存放混淆密鑰的地址列表。函數(shù)體中keyTransform函數(shù)可以通過(guò)輸入的密鑰,得出變換后的密鑰,并得到所有的混淆密鑰。整個(gè)secure_key_store函數(shù)的過(guò)程就是將變換前的 密鑰轉(zhuǎn)換出變換后的密鑰和混淆密鑰,并將它們存放至對(duì)應(yīng)的地址。
而密鑰的傳輸過(guò)程是需要抵御攻擊的,在secure_key_load函數(shù)中,輸入?yún)?shù)中,srcList是一個(gè)源地址的列表(包括真實(shí)密鑰地址和混淆密鑰地址),dstList是一個(gè)目的地址列表(包括正確目的地址和無(wú)關(guān)目的地址),兩者的對(duì)應(yīng)關(guān)系是系統(tǒng)可以事先確定的,而rndSeq是一個(gè)給定的0到255的隨機(jī)序列。整個(gè)secure_key_load的函數(shù)過(guò)程就是將所有256個(gè)字節(jié)的數(shù)據(jù)拷貝至對(duì)應(yīng)的地址。
本發(fā)明對(duì)于任意密鑰,其傳輸過(guò)程都是按一個(gè)隨機(jī)順序傳輸0x00-0xFF這256個(gè)字節(jié),因此可以有效抵御模板攻擊。
下面給出一個(gè)具體的實(shí)施例。
1.傳輸數(shù)據(jù):DES算法密鑰(8字節(jié))。
變換規(guī)則:將8字節(jié)密鑰變換為10字節(jié)密鑰。
設(shè)原密鑰為A1A2A3A4A5A6A7A8
變換后為B1B2B3B4B5B6B7B8B9B10
具體規(guī)則如下:
B1-B10是按下標(biāo)順序依次確定的。
令B1=A1
令B2=A2,若B2與已經(jīng)確定的字節(jié)重復(fù),則不斷加1(模256),直至不重復(fù)為止。
令B3=A3,若B3與已經(jīng)確定的字節(jié)重復(fù),則不斷加1(模256),直至不重復(fù)為止。
...
令B8=A8,若B8與已經(jīng)確定的字節(jié)重復(fù),則不斷加1(模256),直至不重復(fù)為止。
B9的第1比特表示B1是否等于A1,若相等,則為0,否則為1。
B9的第2比特表示B2是否等于A2,若相等,則為0,否則為1。
...
B9的第8比特表示B8是否等于A8,若相等,則為0,否則為1。
此時(shí)若B9與已經(jīng)確定的字節(jié)相等,則不斷加1(模256),直至不重復(fù)為止。
而B9執(zhí)行不斷加1(模256)的次數(shù)最多為7次,最少為0次,假設(shè)執(zhí)行了x次。
則B10的值就是最小的與B1-B9都不重復(fù)的數(shù)K且K≡x(mod8),易證K一定能找到。
從變換后的密鑰計(jì)算出原密鑰是容易的,計(jì)算(B9-(B10mod8))(mod256)的結(jié)果就可以知道B1-B8是否有模加1操作,然后可以依次確定A1-A8。
2.密鑰存儲(chǔ):
定義:
EEPROM地址0x10000-0x10009為真實(shí)密鑰區(qū)。
EEPROM地址0x1000A-0x100FF為混淆密鑰區(qū)。
密鑰存儲(chǔ)時(shí),將10字節(jié)變換后密鑰存入0x10000-0x10009,將剩余246字節(jié)數(shù)據(jù)存入0x1000A-0x100FF。
3.密鑰傳輸
定義:
密鑰寄存器地址0x20000-0x20009
其他寄存器地址0x20010-0x2001F
傳輸映射表
密鑰傳輸時(shí),真實(shí)密鑰的地址0x10000-0x10009會(huì)被對(duì)應(yīng)傳輸?shù)?x20000-0x20009,而其他的混淆密鑰地址都會(huì)被傳輸?shù)?x20010-0x2001F(無(wú)用數(shù)據(jù)可以產(chǎn)生大量覆蓋)。每個(gè)字節(jié)的傳輸順序是隨機(jī)的,由一個(gè)從0~255的隨機(jī)序列決定。
以上通過(guò)具體實(shí)施方式對(duì)本發(fā)明進(jìn)行了詳細(xì)的說(shuō)明,但這些并非構(gòu)成對(duì)本發(fā)明的限制。在不脫離本發(fā)明原理的情況下,本領(lǐng)域的技術(shù)人員還可做出許多變形和改進(jìn),這些也應(yīng)視為本發(fā)明的保護(hù)范圍。