簡述CMAC算法
MAC是一種消息認(rèn)證碼算法,也是一種帶有秘密密鑰的Hash函數(shù),在互聯(lián)網(wǎng)中應(yīng)用的十分廣泛。MAC算法還有很多分類,除了我們了解過的HMAC之外,CMAC也比較常見的一種。下面我們就一起來了解一下CMAC算法。
CMAC的簡介
CMAC簡單來說就是基于分組密碼的MAC。它是人們在CBC-MAC基礎(chǔ)上所設(shè)計的,CMAC為了解決非固定長度消息的安全性問題,CMAC會通過密鑰擴(kuò)展出兩個子密鑰,子密鑰會在最后一個消息分組加密前參與運(yùn)算。CMAC的計算過程主要分為三部分,分別是子密鑰生成、消息認(rèn)證碼的生成和驗(yàn)證消息認(rèn)證碼。

CMAC的計算過程
初始化:選擇一個合適的密鑰K,然后對密鑰進(jìn)行預(yù)處理。預(yù)處理過程中會使用兩個子密鑰K1和K2,用于后續(xù)計算。
填充:將消息按照加密塊的長度進(jìn)行填充,使其長度為加密塊長度的整數(shù)倍。填充方式可以選擇ISO/IEC 9797-1 Padding Method 2或者PKCS#5/PKCS#7 等標(biāo)準(zhǔn)的填充方式。
分塊:將填充后的消息按照加密塊的長度進(jìn)行分塊。
計算中間值:對于最后一個消息塊,如果長度等于加密塊的長度,則需要額外進(jìn)行一次XOR運(yùn)算。然后,將這個塊和 K1 進(jìn)行異或運(yùn)算,得到中間值M。
計算CMAC:對于每個消息塊,都需要進(jìn)行以下步驟:
- 將消息塊和中間值 M 進(jìn)行異或操作,得到結(jié)果R。
- 使用密鑰 K 對 R 進(jìn)行加密,得到結(jié)果C。
- 將C作為下一個消息塊的中間值M。
輸出結(jié)果:當(dāng)所有消息塊都計算完成后,將最后一個結(jié)果C輸出作為CMAC。
在CMAC的計算過程中,預(yù)處理密鑰是必須的,它會生成兩個子密鑰K1和K2。這兩個子密鑰的作用是用于計算最后一個消息塊的中間值M和將每個消息塊與中間值進(jìn)行異或操作。對于不同的加密算法,預(yù)處理密鑰的生成方式也不同,例如對于AES算法,需要進(jìn)行密鑰擴(kuò)展和選擇子密鑰的過程。

HMAC與CMAC
HMAC是基于Hash的MAC,而CMAC是基于分組密碼的MAC,可以簡單理解為他們都是MAC,都是做消息認(rèn)證用的,只是他們的實(shí)現(xiàn)方式不一樣。因?yàn)镠MAC是基于Hash的,計算起來會快一點(diǎn)。
免責(zé)聲明:素材源于網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系刪稿。



