3272|0

282

帖子

2

TA的资源

一粒金砂(高级)

楼主
 

【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时钟,初始化数据

  • /* enable CAU clock */
  • rcu_periph_clock_enable(RCU_CAU);
  • /* reset the CAU peripheral */
  • cau_deinit();
  • cau_struct_para_init(&text);

8. DES ECB加解密测试

  • /* DES ECB encryption/decryption test */
  • static void cau_des_ecb_test(void)
  • {
  • /* encryption in DES ECB mode */
  • 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);
  • }
  • /* decryption in DES ECB mode */
  • 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)
  • {
  • /* encryption in DES CBC mode */
  • 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);
  • }
  • /* decryption in DES CBC mode */
  • 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)
  • {
  • /* encryption in TDES ECB mode */
  • 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);
  • }
  • /* decryption in TDES ECB mode */
  • 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)
  • {
  • /* encryption in TDES CBC mode */
  • 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);
  • }
  • /* decryption in TDES CBC mode */
  • 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)
  • {
  • /* configure systick */
  • systick_config();
  • /* USART configuration */
  • gd_eval_com_init(EVAL_COM);
  • /* enable CAU clock */
  • rcu_periph_clock_enable(RCU_CAU);
  • /* reset the CAU peripheral */
  • 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)
  • {
  • }
  • }

 

三、验证

如下图,原始数据,加密之前的数据与加密之后的数据显示如下,

可以看出,四种加密算法的加密之后的数据都是不一样的,但是解密之后都与原始数据是一样的,说明我们的加密解密算法是实验成功的,如果需要对数据进行传输的话最好使用上加密算法可以确保数据安全可靠,不被拦截

 

 

此帖出自GD32 MCU论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 4

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表