硬件加密模块主要用于由硬件对数据进行加密或解密操作,支持的标准有AES。AES(AdvancedEncryption Standard)是最新的分组对称密码算法,兼容联邦信息处理标准出版物(FIPS PUB 197, 2001 年 11 月 26 日)规定的高级加密标准(AES)。AES支持多种模式的加密方式:AES-ECB模式加密和解密AES-CBC模式加密和解密AES-CTR模式加解密和解密AES-GCM模式解密和解密本次在ES32F0654单片机平台上对AES-CBC模式加密和解密进行测试,关于AES-CBC模式加密和解密的具体详情如下:AES-CBC模式加密
AES是以 128位作为一个数据单元进行加密,下图介绍了AES加密分组链(AES-CBC)
模式加密。该模式首先将明文消息分成多个 128 位数据明文单元。在CBC 加密过程中,一个数据单元经过执行位/字节/半字交换后作为明文单元(P1),通过与一个128 位初始化向量(IV)进行异或运算(IV^P1),作为第一个输入单元(I1)。该输入单元通过 AES算法(AEA)在加密状态下使用 128位密钥进行加密处理。生成的 128 位输出单元(O1)将直接用作密文(C1),即C1 = O1。然后,第一个密文单元与第二个明文数据单元进行异或运算(C1^P2),从而生成第二个输入单元(I2)。第二个输入单元通过以上AES 处理而生成第二个密文单元。 加密处理会不断将后续密文单元和明文单元链接到一起,直到消息中所有的明文单元都加密完成为止。如果消息中最后的数据单元不是一个 128 位数据单元,则由应用程序按照一定规则对不完整数据单元进行加密。
注 1: K = 密钥; C = 密文; I = 输入块; Ps= 交换前(解码时)或 交换后(编码时)的明文;P = 明文;IV = 初
始化向量。
注 2: IVx = [IVxRIVxL], R = 右, L= 左。
注 3:如果密钥大小 =128: 密钥 =[K3 K2];
操作示例:
1. 设置CRYPT_CON.CRYSEL = 0,选择算法类型为 AES
2. 设置 CRYPT_CON.ENCS= 1,选择加密3.设置 CRYPT_CON.AESKS= 0,选择密钥长度 128bit
4. 设置 CRYPT_CON.MODE= 1,选择 CBC模式
5. 向CRYPT_KEY0...CRYPT_KEY3 中填入 128bit 长度的密钥,填入 KEY3/2/1/0位置
6. 向CRYPT_IV0/1/2/3 填入初始向量
7. 向CRYPT_DATA0/1/2/3 中写入需要加密的明文
8. 设置CRYPT_CON.GO = 1,启动加密
9. 通过CRYPT_IF.DONE 判断加密是否完成,如果 CRYPT_IF.DONE = 0,则加密完成
10. 从 CRYPT_DATA0/1/2/3 中读出已经加密的密文
11. 回到步骤 7 继续进行加密
12. 所有加密完成
AES-CBC模式解密
AES是以 128位作为一个数据单元进行解密,下图介绍了AES密码分组链接(AES-CBC)模式解密。该模式首先将密文消息分成多个128 位数据密文单元,第一个密文单元(C1)经过位/字节/半字交换后作为一个输入单元(I1),该输入单元(I1)通过AES 算法(AEA)在解密状态下使用 128位密钥进行解密处理, 生成的 128 位输出单元(O1),再与IV 进行异或运算(O1^IV),从而生成第一个明文单元。然后,第二个密文单元作为下一个输入单元,经过以上AES 解密处理,生成的输出单元再与第一个密文单元进行异或运算(O2^C1),从而生成第二个明文数据单元(P2)。依次进行解密,直到消息中所有的密文单元都解密完成为止。
图 17-4 AES-CBC模式解密 注 1: K = 密钥; C = 密文; I = 输入块; Ps= 交换前(解码时)或 交换后(编码时)的明文;P = 明文;IV = 初
始化向量。
注 2: IVx = [IVxRIVxL], R = 右, L= 左。
注 3: 如果密钥大小 =128: 密钥 =[K3 K2]; 操作示例:
1. 设置CRYPT_CON.CRYSEL = 0,选择算法类型为 AES
2. 设置 CRYPT_CON.ENCS= 0,选择解密
3. 设置CRYPT_CON.AESKS = 0,选择密钥长度 128bit
4. 设置 CRYPTCON.MODE= 1,选择 CBC模式
5. 向CRYPT_KEY0...CRYPT_KEY3 中填入 128bit 长度的密钥,填入 KEY3/2/1/0位置
6. 向CRYPT_IV0/1/2/3 填入初始向量
7. 向CRYPT_DATA0/1/2/3 中写入需要解密的密文
8. 设置CRYPT_CON.GO = 1,启动解密
9. 通过CRYPT_IF.DONE 判断解密是否完成,如果 CRYPT_IF.DONE = 0,则解密完成
10. 从 CRYPT_DATA0/1/2/3 中读出已经解密的明文
11. 回到步骤 7 继续进行解密
12. 所有解密完成
一周热门 更多>