【GD32L233C-START评测】13. CAU加密算法之DES/TDES
[复制链接]
之前的帖子可以参考:
【GD32L233C-START评测】1.开箱
【GD32L233C-START评测】2.手把手创建新工程
【GD32L233C-START评测】3.移植FreeRTOS到GD32L233
【GD32L233C-START评测】4. 移植RT-Thread到GD32L233
【GD32L233C-START评测】5. IIC驱动OLED
【GD32L233C-START评测】6. 获取RTC时间并通过OLED显示
【GD32L233C-START评测】7. PWM驱动LED
【GD32L233C-START评测】8. TRNG真随机数生成
【GD32L233C-START评测】9. CRC检验
【GD32L233C-START评测】10. ADC读取芯片内部温度
【GD32L233C-START评测】11.DAC输出电压值_ADC读取外部电压值
【GD32L233C-START评测】12. 硬件IIC驱动OLED
GD32L233C提供了CAU加解密模块,用于对数据的加密与解密,提供了DES/TDES与AES这三种加解密处理,可以用来对传输的数据进行加密,保证信息安全传输。
本帖将讲解如何使用CAU模块的DES/TDES。
一、DES/TDES的加解密原理
参考《用户手册》23.加密处理器(CAU)。
DES/TDES提供了两种加解密算法:ECB与CBC,组合起来是四种,其中CBC算法还会提供一个初始化向量。
ECB的加密流程是:提供原始数据,加密KEY,然后输出密文,具体可以参考用户手册。
CBC的加密流程是:提供原始数据,以及三个加密KEY,分别用三个KEY加密在解密在加密,最后输出密文,具体参考用户手册。
二、代码实现
1. ECB算法加密KEY:
- uint8_t des_key[8] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
2. CBC算法加密KEY,三个KEY写在一个数组中:
- uint8_t tdes_key[24] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
- 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
- 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67};
3. 原始数据
- uint8_t plaintext[DATA_SIZE] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38};
4. CBC算法需要的64位Vector数据
- uint8_t vectors[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
5. 加密结果与解密结果存放数组
- uint8_t encrypt_result[DATA_SIZE];
- uint8_t decrypt_result[DATA_SIZE];
6. 参数设置变量
用于设置加密/解密参数,待加密数据,加密KEY,数据长度,对于CBC算法,输入vector数据
- cau_parameter_struct text;
7. 初始化
设置CAU时钟,初始化数据
-
- rcu_periph_clock_enable(RCU_CAU);
-
-
- cau_deinit();
-
- cau_struct_para_init(&text);
8. DES ECB加解密测试
-
- static void cau_des_ecb_test(void)
- {
-
- text.alg_dir = CAU_ENCRYPT;
- text.key = des_key;
- text.input = plaintext;
- text.in_length = DATA_SIZE;
-
- if(SUCCESS == cau_des_ecb(&text, encrypt_result))
- {
- printf(">>encrypted data with DES Mode ECB :\r\n ");
- data_display(DATA_SIZE, encrypt_result);
- }
-
-
- text.alg_dir = CAU_DECRYPT;
- text.key = des_key;
- text.input = encrypt_result;
- text.in_length = DATA_SIZE;
- if(SUCCESS == cau_des_ecb(&text, decrypt_result))
- {
- printf("<<decrypted data with DES Mode ECB :\r\n ");
- data_display(DATA_SIZE, decrypt_result);
- }
- }
9. DES CBC加解密测试
- static void cau_des_cbc_test(void)
- {
-
- text.alg_dir = CAU_ENCRYPT;
- text.key = des_key;
- text.iv = vectors;
- text.input = plaintext;
- text.in_length = DATA_SIZE;
- if(SUCCESS == cau_des_cbc(&text, encrypt_result))
- {
- printf(">>encrypted data with DES Mode CBC :\r\n ");
- data_display(DATA_SIZE, encrypt_result);
- }
-
-
- text.alg_dir = CAU_DECRYPT;
- text.key = des_key;
- text.iv = vectors;
- text.input = encrypt_result;
- text.in_length = DATA_SIZE;
- if(SUCCESS == cau_des_cbc(&text, decrypt_result))
- {
- printf("<<decrypted data with DES Mode CBC :\r\n ");
- data_display(DATA_SIZE, decrypt_result);
- }
- }
10. TDES ECB加解密测试
- static void cau_tdes_ecb_test(void)
- {
-
- text.alg_dir = CAU_ENCRYPT;
- text.key = tdes_key;
- text.input = plaintext;
- text.in_length = DATA_SIZE;
- if(SUCCESS == cau_tdes_ecb(&text, encrypt_result))
- {
- printf(">>encrypted data with TDES Mode ECB :\r\n ");
- data_display(DATA_SIZE, encrypt_result);
- }
-
-
- text.alg_dir = CAU_DECRYPT;
- text.key = tdes_key;
- text.input = encrypt_result;
- text.in_length = DATA_SIZE;
- if(SUCCESS == cau_tdes_ecb(&text, decrypt_result))
- {
- printf("<<decrypted data with TDES Mode ECB :\r\n ");
- data_display(DATA_SIZE, decrypt_result);
- }
- }
11. TDES CBC接加密测试
- static void cau_tdes_cbc_test(void)
- {
-
- text.alg_dir = CAU_ENCRYPT;
- text.key = tdes_key;
- text.iv = vectors;
- text.input = plaintext;
- text.in_length = DATA_SIZE;
- if(SUCCESS == cau_tdes_cbc(&text, encrypt_result))
- {
- printf(">>encrypted data with TDES Mode CBC :\r\n ");
- data_display(DATA_SIZE, encrypt_result);
- }
-
-
- text.alg_dir = CAU_DECRYPT;
- text.key = tdes_key;
- text.iv = vectors;
- text.input = encrypt_result;
- text.in_length = DATA_SIZE;
- if(SUCCESS == cau_tdes_cbc(&text, decrypt_result))
- {
- printf("<<decrypted data with TDES Mode CBC :\r\n ");
- data_display(DATA_SIZE, decrypt_result);
- }
- }
12. 显示数据
原始数据,密文数据,解密数据
- static void data_display(uint32_t datalength, uint8_t *data)
- {
- uint32_t i = 0, count = 0;
-
- for(i = 0; i < datalength; i++) {
- printf("0x%02X ", data[i]);
- count++;
-
- if(8 == count) {
- count = 0;
- printf(" [Block %d] \r\n", i / 8);
- }
- }
- printf("----------------------------------------\r\n");
- }
13. main函数
- int main(void)
- {
-
- systick_config();
-
- gd_eval_com_init(EVAL_COM);
-
- rcu_periph_clock_enable(RCU_CAU);
-
-
- cau_deinit();
-
- cau_struct_para_init(&text);
-
- printf("Initialize Data:");
- data_display(DATA_SIZE, plaintext);
-
- cau_des_ecb_test();
- cau_des_cbc_test();
- cau_tdes_ecb_test();
- cau_tdes_cbc_test();
-
- while(1)
- {
-
- }
- }
三、验证
如下图,原始数据,加密之前的数据与加密之后的数据显示如下,
可以看出,四种加密算法的加密之后的数据都是不一样的,但是解密之后都与原始数据是一样的,说明我们的加密解密算法是实验成功的,如果需要对数据进行传输的话最好使用上加密算法可以确保数据安全可靠,不被拦截
|