用于ADF7023和ADF7023-J的AES加密與解密
掃描二維碼
隨時(shí)隨地手機(jī)看文章
簡(jiǎn)介
本文說(shuō)明ADF7023和ADF7023-J收發(fā)器可用的高級(jí)加密標(biāo)準(zhǔn)(AES)固件模塊(在下文中,提到ADF7023的內(nèi)容也適用于ADF7023-J)。 可下載的AES固件模塊支持密鑰大小為128位、192位和256位的128位塊加密和解密。 它支持兩種模式:電碼本(ECB)模式和密碼塊鏈接(CBC)模式1。
圖1. ECB模式
ECB模式利用一個(gè)密鑰逐塊地加密和解密128位數(shù)據(jù),如圖1所示。 CBC模式1則是先做一次加法運(yùn)算(通過(guò)模2算法,用戶提供的128位初始化向量)再加密, 所得的密文用作下一個(gè)塊的初始化向量,依此類推,如圖2所示。
解密過(guò)程正好相反。 固件利用片內(nèi)硬件加速模塊來(lái)增大吞吐量,并將AES處理的延遲時(shí)間降至最短。
該固件模塊名為rom_ram_7023_2_2_RS_AES.dat,包含里德-所羅門(RS)前向糾錯(cuò)和AES加密,可從www.analog.com/firmwaremodules-adf7023下載。
圖2. CBC模式1
命令和數(shù)據(jù)包隨機(jī)存取存儲(chǔ)器寄存器位置
表1. 需在AES加密或解密之前進(jìn)行初始化的寄存器位置
1 這些寄存器定義針對(duì)該固件模塊,不適用于ADF7023的正常操作。
AES配置變量、密鑰和數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)包隨機(jī)存取存儲(chǔ)器(RAM)中。
表2中列出了執(zhí)行AES加密、生成逆密鑰或執(zhí)行AES解密所需的命令。 有關(guān)AES加密和解密步驟的更多信息,參見“AES步驟”部分。
由于使用指針、不同密鑰大小和兩種不同模式,ADF7023上的AES實(shí)現(xiàn)是高度可配置的。 圖3顯示了一個(gè)配置示例。
表2. AES命令
圖3. AES操作的數(shù)據(jù)包RAM存儲(chǔ)器分配示例
AES步驟
向ADF7023寫入AES固件模塊
使用AES固件模塊之前,用戶必須將其寫入ADF7023的程序RAM中。 下列步驟詳細(xì)解釋了如何向程序RAM寫入AES固件模塊:
1. 確保ADF7023處于PHY_OFF狀態(tài)。
2. 發(fā)出CMD_RAM_LOAD_INIT命令(地址0xBF)。
3. 使用串行外設(shè)接口(SPI)存儲(chǔ)器塊寫入命令(0x1E00[固件模塊])向程序RAM寫入模塊;有關(guān)塊寫入的更多信息,請(qǐng)參見ADF7023數(shù)據(jù)手冊(cè)。
4. 發(fā)出CMD_RAM_LOAD_DONE命令(地址0xC7)。
固件模塊現(xiàn)已存儲(chǔ)到程序RAM中。
AES加密步驟
下列步驟詳細(xì)說(shuō)明了如何執(zhí)行AES加密:
1. 將AES工作空間的起始地址寫入VAR_W_PTR。
2. 寫入VAR_KEYSIZE以設(shè)置密鑰大小。
3. 寫入VAR_AES_MODE以選擇ECB模式或CBC模式1。
4. 若使用CBC模式1(若使用ECB模式則跳過(guò)此步),
a. 將加密初始化向量的起始地址寫入VAR_ECV_PTR。
b. 將初始化向量寫入VAR_ECV_PTR指定的位置。
5. 將密鑰的地址寫入VAR_WFOR_PTR。
6. 將密鑰寫入VAR_WFOR_PTR指定的位置。
7. 將要加密的16字節(jié)塊數(shù)寫入VAR_NUM_BLOCKS。
8. 將要加密的數(shù)據(jù)地址寫入VAR_C_PTR。
9. 將要加密的數(shù)據(jù)寫入VAR_C_PTR指定的位置。
10. 發(fā)出CMD_AES_ENCRYPT (0xD0)。 用加密后的數(shù)據(jù)覆蓋要加密的數(shù)據(jù)。
11. 等待命令完成。
AES加密示例
在下面的AES加密示例中,將SPI命令寫入ADF7023:
1. 寫入0x18112A。 VAR_W_PTR設(shè)置為0x2A。 算法的32字節(jié)工作空間從地址0x02A開始。
2. 寫入0x18140C。 通過(guò)VAR_KEYSIZE選擇128位的密鑰。
3. 寫入0x181600。 通過(guò)VAR_AES_MODE選擇ECB模式。
4. 不使用CBC模式1,因此跳過(guò)第4步。
5. 寫入0x18136A。 VAR_WFOR_PTR設(shè)置為0x6A。 密鑰從地址0x06A開始。
6. 將密鑰寫入從地址0x06A開始的數(shù)據(jù)包RAM。
7. 寫入0x180101。 VAR_NUM_BLOCKS設(shè)置為0x01。 加密一個(gè)16字節(jié)塊。
8. 寫入0x18108A。 VAR_C_PTR設(shè)置為0x8A。 要加密的數(shù)據(jù)從地址0x08A開始。
9. 將要加密的數(shù)據(jù)寫入從地址0x08A開始的數(shù)據(jù)包RAM。
10. 寫入0xD0。 發(fā)出CMD_AES_ENCRYPT。
11. 等待命令完成。
AES解密步驟
下列步驟詳細(xì)說(shuō)明了如何執(zhí)行AES解密:
1. 將AES工作空間的起始地址寫入VAR_W_PTR。
2. 寫入VAR_KEYSIZE以設(shè)置密鑰大小。
3. 寫入VAR_AES_MODE以選擇ECB模式或CBC模式1。
4. 將密鑰的地址寫入VAR_WFOR_PTR。
5. 將密鑰寫入VAR_WFOR_PTR指定的位置。
6. 將逆密鑰的地址寫入VAR_WINV_PTR。
7. 若使用CBC模式1(若使用ECB模式則跳過(guò)此步),
a. 將解密初始化向量的地址寫入VAR_DCV_PTR。
b. 將初始化向量寫入VAR_DCV_PTR指定的位置。
c. 將解密需要的保留存儲(chǔ)地址寫入VAR_CIPHERBUF_PTR。
8. 發(fā)出CMD_AES_DECRYPT_INIT (0xD1)。 此命令生成并保存逆密鑰。
9. 等待命令完成。
10. 將要解密的16字節(jié)塊數(shù)寫入VAR_NUM_BLOCKS。
11. 將要解密的數(shù)據(jù)地址寫入VAR_C_PTR。
12. 將要解密的數(shù)據(jù)寫入VAR_C_PTR指定的位置。
13. 發(fā)出CMD_AES_DECRYPT (0xD2)。 用解密后的數(shù)據(jù)覆蓋要解密的數(shù)據(jù)。
14. 等待命令完成。
AES解密示例
在下面的AES解密示例中,將SPI命令寫入ADF7023:
1. 寫入0x18112A。 VAR_W_PTR設(shè)置為0x2A。 算法的32字節(jié)工作空間從地址0x02A開始。
2. 寫入0x18140C。 通過(guò)VAR_KEYSIZE選擇128位的密鑰。
3. 寫入0x181600。 通過(guò)VAR_AES_MODE選擇ECB模式。
4. 寫入0x18136A。 VAR_WFOR_PTR設(shè)置為0x6A。 密鑰從地址0x06A開始。
5. 將密鑰寫入從地址0x06A開始的數(shù)據(jù)包RAM。
6. 寫入0x18124A。 VAR_WINV_PTR設(shè)置為0x4A。 逆密鑰從地址0x04A開始。
7. 不使用CBC模式1,因此跳過(guò)第7步。
8. 寫入0xD1。 發(fā)出CMD_AES_DECRYPT_INIT。 此命令生成并保存逆密鑰,從地址0x04A開始。
9. 等待命令完成。
10. 寫入0x180101。 VAR_NUM_BLOCKS設(shè)置為0x01。 解密一個(gè)16字節(jié)塊。
11. 寫入0x18108A。 VAR_C_PTR設(shè)置為0x8A。 要解密的數(shù)據(jù)從地址0x08A開始。
12. 將要解密的數(shù)據(jù)寫入從地址0x08A開始的數(shù)據(jù)包RAM。
13. 寫入0xD2。 發(fā)出CMD_AES_DECRYPT。
14. 等待命令完成。
確定AES命令完成的時(shí)間
使用CMD_FINISHED中斷來(lái)確定CMD_AES_ENCRYPT、CMD_AES_DECRYPT_INIT和CMD_AES_DECRYPT命令何時(shí)完成。 要使能該中斷,請(qǐng)置位INTERRUPT_MASK_1寄存器(地址0x101)的位0 (CMD_FINISHED)。 置位該屏蔽位后,ADF7023的中斷引腳(IRQ_GP3)將在完成任何命令后置位。 向INTERRUPT_SOURCE_1(地址0x337)的位0寫入邏輯1可清除中斷。 有關(guān)中斷產(chǎn)生的更多信息參見ADF7023數(shù)據(jù)手冊(cè)。
AES加密和解密時(shí)間
典型AES執(zhí)行時(shí)間如表3所示。
表3. AES初始化、加密和解密時(shí)間
©2016 Analog Devices, Inc. All rights reserved. Trademarks and registered trademarks are the property of their respective owners.
AN14152-0-2/16(0)