东软载波ESF0654 PDS开发板测试RT-Thread+硬件加密解密

2020-03-11 19:34发布

硬件加密模块主要用于由硬件对数据进行加密或解密操作,支持的标准有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 位数据单元,则由应用程序按照一定规则对不完整数据单元进行加密。


555.jpg


1K = 密钥; C = 密文; I = 输入块; Ps= 交换前(解码时)或 交换后(编码时)的明文;P = 明文;IV =
始化向量。
2IVx = [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)。依次进行解密,直到消息中所有的密文单元都解密完成为止。


666.jpg


  图 17-4 AES-CBC模式解密   1K = 密钥; C = 密文; I = 输入块; Ps= 交换前(解码时)或 交换后(编码时)的明文;P = 明文;IV =
始化向量。
2IVx = [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. 所有解密完成
 

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
一路向北lm
2020-03-11 22:19
测试结果如下:
  1. 输入原始数据:128*4 位
  2. *            32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34
  3. *                32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34
  4. *                32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34
  5. *                32 43 f6 a8 88 5a 30 8d 31 31 98 a2 e0 37 07 34
  6. 初始化向量 * iv                   f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff
  7. 密钥:      * cipher key        2b 7e 15 16 28 ae d2 a6 ab f7 15 88 09 cf 4f 3c

  8. 加密后的结果:
  9. * refer result        92 5a fa 80 48 a0 7d 7a d8 68 c5 f2 c3 94 68 a6
  10.                     1d b9 bf 55 f0 be 88 67 5f 04 cb c2 fa c9 57 8c
  11.                     f4 a4 7f ad 59 61 e3 22 d6 a0 44 06 01 75 42 89
  12.                     1c 22 ee 2f a0 46 08 aa c2 2f 64 29 92 40 06 6d
复制代码对照串口打印的数据刚好一致: 869785dfefa7e379c4.png

一周热门 更多>