大家思考一個(gè)問(wèn)題,在汽車MCU運(yùn)行時(shí)代碼通常都是直接在flash中運(yùn)行,很少出現(xiàn)把一個(gè)功能??截惖?a href="http://srfitnesspt.com/tags/ram/" target="_blank">ram中運(yùn)行,主要是MCU的SRAM通常十分珍貴,且比較小,雖然最近出來(lái)的片子S32G、TC3xx SRAM已經(jīng)來(lái)到MB級(jí)別,但是鑒于成本、和芯片廠通常會(huì)將PFlash和CPU直連以加快取指速度,一般都還是采用比較傳統(tǒng)的方式。
既然是直接取指,如果應(yīng)用程序是加密存儲(chǔ)在flash中,即使安全啟動(dòng)通過(guò),應(yīng)用程序解密完也沒(méi)有足夠的ram存放,所以一般來(lái)說(shuō),存放在flash中的代碼均是以明文+簽名or認(rèn)證碼的方式進(jìn)行處理。
因此,汽車網(wǎng)絡(luò)安全工程師最熟悉的AES128-CMAC來(lái)了。
02.AES-CMAC詳解
首先我們來(lái)回顧什么是AES(advanced encryption standard)加密算法。
AES屁股后面跟的工作模式通常是CBC\CFB這些,這個(gè)CMAC是個(gè)啥?
來(lái)看下全稱:Cipher-based Message Authentication Code。
我們知道MAC本身就是與密碼相關(guān)的Hash,它不僅提供了比crc這類算法更強(qiáng)的數(shù)據(jù)完整性保護(hù),還防止了數(shù)據(jù)未經(jīng)允許的修改、破壞等(驗(yàn)證數(shù)據(jù)來(lái)源)。為什么呢?因?yàn)镸AC就是將密鑰和明文使用某種算法共同計(jì)算出一個(gè)值,只有知道密鑰的接收方才能計(jì)算出與之匹配的值;即使密鑰被攻擊者破解,由于MAC的hash屬性,攻擊者是無(wú)法反推出數(shù)據(jù)的。
所以我們?cè)赟ecOC里面最常用的還是AES128-CMAC外加FvM防止重放攻擊。
本質(zhì)上,AES-CMAC和OMAC1(一種改進(jìn)的CBC-MAC算法)相同,使用一個(gè)私密的密鑰、可變長(zhǎng)度的消息數(shù)據(jù)(對(duì)齊該消息按照固定長(zhǎng)度進(jìn)行分塊計(jì)算),最終返回一個(gè)固定長(zhǎng)度的值,這個(gè)值我們叫做MAC。
**2.1 子密鑰的生成 **
對(duì)于CMAC來(lái)說(shuō),存在數(shù)據(jù)長(zhǎng)度不是128bit整數(shù)倍的情況,因此,這個(gè)算法流程有兩種,如下:
case a :消息數(shù)據(jù)是128bit的整數(shù)倍,使用私密密鑰k1生成MAC(T);
case b:消息數(shù)據(jù)不能整除,使用私密密鑰k2生成MAC(T);
而私密密鑰的生成又是按照如下方式生成:
初始向量IV(0) + 原始key,使用AES-128-CBC,生成一個(gè)中間輸出L;
判斷該L最高位是否等于0;如果等于0,k1 = L << 1;否則,k1 = (L << 1)XOR 0x87(Rb_const);
判斷k1的最高位是否等于0;如果等于0,k2 = k1 << 1;否則,k2 = (L << 1)XOR 0x87(Rb_const);
同時(shí)對(duì)于上述兩個(gè)case,使用k1或者k2生成消息數(shù)據(jù)最后一塊的數(shù)據(jù)。
需要注意的是,當(dāng)處于case b時(shí),M_last是需要進(jìn)行填充的,填充方式參考04.數(shù)據(jù)填充
2.2 MAC生成算法
使用AES-CMAC進(jìn)行計(jì)算,需要三個(gè)輸入:私密密鑰(k)、消息數(shù)據(jù)、消息數(shù)據(jù)長(zhǎng)度;具體操作流程如下:
僅在最后一步使用的明文分組生成AES-CMAC。
可以選擇直接把明文組包+CMAC發(fā)給接收方,也可以用密文+CMAC。
03.HMAC詳解
HMAC(Hash-based Message Authentication Code):Hash函數(shù)是公開(kāi)的,因此直接使用無(wú)密鑰的Hash對(duì)數(shù)據(jù)處理,只能保證數(shù)據(jù)的完整性。如果加上MAC值,那么就可以驗(yàn)證數(shù)據(jù)的來(lái)源有效。
MD-5和SHA-1就是這種hash函數(shù)的示例。
04.數(shù)據(jù)填充
我們發(fā)現(xiàn),在使用上述算法進(jìn)行計(jì)算時(shí),AES都是以一個(gè)塊進(jìn)行計(jì)算,如果此時(shí)要計(jì)算的數(shù)據(jù)分組后最后一塊不夠128bit,就要進(jìn)行填充,常見(jiàn)填充方式(假設(shè)數(shù)據(jù)塊為8個(gè)byte)如下:
全0填充
填充結(jié)構(gòu):
Data:| 11 11 11 11 11 11 11 11 | 11 11 00 00 00 00 00 00 |
PKCS#7填充
每一個(gè)字節(jié)都表示填充的長(zhǎng)度,如下:
| 11 11 11 11 11 11 11 11 | 11 11 06 06 06 06 06 06 |
ANSI X.923 填充
該方式用0進(jìn)行填充,但用最后一個(gè)字節(jié)表示填充的長(zhǎng)度,如下:
| AA AA AA AA AA AA AA AA | AA AA 00 00 00 00 00 06 |
審核編輯:劉清
-
mcu
+關(guān)注
關(guān)注
146文章
16812瀏覽量
349448 -
CMAC
+關(guān)注
關(guān)注
0文章
9瀏覽量
11037 -
sram
+關(guān)注
關(guān)注
6文章
760瀏覽量
114558 -
AES
+關(guān)注
關(guān)注
0文章
99瀏覽量
33170 -
加密算法
+關(guān)注
關(guān)注
0文章
210瀏覽量
25515
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論