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