华大 AES 模块 硬件加解密
数据寄存器由四个 32 位的寄存器组成 128 位数据。用于在模块运算前存放需要被加密的明文或者需要被解密的密文,并且运算完成后存放加密
后的密文或者解密后的明文
四个 32 位寄存器连接在一起组成一个 128 位的数据,读写操作时需要分别对四个寄存器进
行操作。数据寄存器对应的操作顺序如下 数据举例: 0x00112233445566778899AABBCCDDEEFF
硬件加密模块主要用于由硬件对数据进行加密或解密操作,支持的标准有 AES。
AES(Advanced Encryption Standard)是最新的分组对称密码算法,兼容联邦信息处理标准出版物(FIPS PUB 197, 2001 年 11 月 26 日)规定的高级加密标准(AES)。
AES-ECB模式加密
AES 是以 128bit 作为一个数据单元进行加密,下图介绍了 AES 电子密码(AES-ECB)模式加密。一个数据单元(128bit 明文 P)经过位/字节/半字交换后作为一个输入单元(I)。输入单元通过 AES 算法(AEA) 在加密状态下使用 128 位密钥进行处理。 得到的处理结果再执行位/字节/半字交换后,得到 128bit 输出密文单元(C)。
操作示例:
1. 设置 CRYPT_CON.CRYSEL = 0,选择算法类型为 AES
2. 设置 CRYPT_CON.ENCS = 1,选择加密
3. 设置 CRYPT_CON.AESKS = 0,选择密钥长度 128bit
4. 设置 CRYPT_CON.MODE = 0,选择 ECB 模式
5. 向 CRYPT_KEY0...CRYPT_KEY3 中填入 128bit 长度的密钥,填入 KEY3/2/1/0 位置
6. 向 CRYPT_DATA0/1/2/3 中写入需要加密的明文
7. 设置 CRYPT_CON.GO = 1,启动加密
8. 通过 CRYPT_IF.DONE 判断加密是否完成,如果 CRYPT_IF.DONE = 0,则加密完成
9. 从 CRYPT_DATA0/1/2/3 中读出已经加密的密文
AES-ECB模式解密
AES 是以 128bit 作为一个数据单元进行解密,下图介绍了 AES 电子密码本(AES-ECB)模式解密。一个数据单元(128bit 密文 C)经过位/字节/半字交换后作为一个输入单元(I)。输入单元通过 AES 算法(AEA) 在解密状态下使用 128 位密钥进行处理。 得到的处理结果再执行位/字节/半字交换后,得到 128bit 输出明文单元(P)。
注 1: K = 密钥; C = 密文; I = 输入块; O = 输出块; P = 明文。
注 2:如果密钥大小 = 128:密钥 = ;
操作示例:
1. 设置 CRYPT_CON.CRYSEL = 0,选择算法类型为 AES
2. 设置 CRYPT_CON.ENCS = 0,选择解密
3. 设置 CRYPT_CON.AESKS = 0,选择密钥长度 128bit
4. 设置 CRYPT_CON.MODE = 0,选择 ECB 模式
5. 向 CRYPT_KEY0...CRYPT_KEY3 中填入 128bit 长度的密钥,填入 KEY3/2/1/0 位置
6. 向 CRYPT_DATA0/1/2/3 中写入需要解密的密文
7. 设置 CRYPT_CON.GO = 1,启动解密
8. 通过 CRYPT_IF.DONE 判断解密是否完成,如果 CRYPT_IF.DONE = 0,则解密完成
9. 从 CRYPT_DATA0/1/2/3 中读出已经解密的明文 。
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 = , R = 右, L = 左。
注 3:如果密钥大小 = 128: 密钥 = ;
操作示例:
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)。依次进行解密,直到消息中所有的密文单元都解密完成为止。
注 1: K = 密钥; C = 密文; I = 输入块; Ps = 交换前(解码时)或 交换后(编码时)的明文; P = 明文; IV = 初
始化向量。
注 2: IVx = , R = 右, L = 左。
注 3: 如果密钥大小 = 128: 密钥 = ;
操作示例:
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. 所有解密完成
AES-CTR模式加解密
AES 计数模式(AES-CTR)即把一个 32bit 的计数器和一个随机数作为 AES 加解密模块的输入,输出的密文流作为密钥流,对明文或密文进行异或从而得到相应的密文或明文。在此模式下,解密操作与加密操作的操作方式完全相同。图 17-5 和图 17-6 分别给出了加密流程和解密流程。
加密和解密流程
感谢楼主讲解。
感谢楼主分享
页:
[1]
2