[其他] 【HC32L196PCTA测评】5.CRC校验+AES加密解密+TRNG测试

[复制链接]
 楼主| yuyy1989 发表于 2023-8-7 20:01 | 显示全部楼层 |阅读模式
<
#申请原创# @21小跑堂  
5.CRC校验+AES加密解密+TRNG测试
5.1CRC校验
CRC(Cyclic Redundancy Check)即循环冗余校验码,是数据通信领域中最常用的一种查错校验码,常用于验证接收到的数据是否完整,例如之前用到的DHTC12在接收到数据后就要用CRC来校验。
HC32L196拥有硬件CRC校验模块,支持计算CRC值(编码模式)和检验CRC值(校验模式),CRC16和CRC32的多项式
QQ截图20230807111722.png
接下来写个程序,用CRC编码模式计算串口发送的数据的CRC,并将结果用串口返回,代码示例

  1. void crc_cal()
  2. {
  3.     uint16_t crc16;
  4.     uint32_t crc32;
  5.     Sysctrl_SetPeripheralGate(SysctrlPeripheralCrc, TRUE);
  6.     crc16 = CRC16_Get8(uart_buffer, uart_rxlen);
  7.     crc32 = CRC32_Get8(uart_buffer, uart_rxlen);
  8.     uart_rxlen = 0;
  9.     uart_rxindex = 0;
  10.     printf("crc16:%04X   crc32:%08X\r\n",crc16,crc32);
  11. }
在timer0中判断接收完成后调用这个函数
  1. void Tim0_IRQHandler(void)
  2. {
  3.     //Timer0 模式0 溢出中断
  4.     if(TRUE == Bt_GetIntFlag(TIM0, BtUevIrq))
  5.     {
  6.         if(uartrx_timeout > 0)
  7.         {
  8.             uartrx_timeout -= 1;
  9.             if(uartrx_timeout == 0)
  10.                 crc_cal();
  11.         }
  12.         Bt_ClearIntFlag(TIM0,BtUevIrq); //中断标志清零
  13.     }
  14. }
运行效果
QQ截图20230807111643.png QQ截图20230807111704.png
接下来再测试一下校验模式,用串口发送数据和CRC校验值,返回校验值是否匹配,收到的第一位为0进行CRC16检查否则进行CRC32检查,检验函数CRC16_Check和CRC32_Check在crc匹配时返回0

  1. void crc_cal()
  2. {
  3.     uint8_t crcchekresult;
  4.     uint16_t crc16,crc16in;
  5.     uint32_t crc32,crc32in;
  6.     Sysctrl_SetPeripheralGate(SysctrlPeripheralCrc, TRUE);
  7.     if(uart_buffer[0] == 0)
  8.     {
  9.         crc16 = CRC16_Get8(uart_buffer+1, uart_rxlen-3);
  10.         crc16in = (uart_buffer[uart_rxlen-2]<<8)|uart_buffer[uart_rxlen-1];
  11.         crcchekresult = CRC16_Check8(uart_buffer+1, uart_rxlen-3,crc16in);
  12.         printf("输入crc16:%04X 计算crc16:%04X 校验结果:%d\r\n",crc16in,crc16,crcchekresult);
  13.     }
  14.     else
  15.     {
  16.         crc32 = CRC32_Get8(uart_buffer+1, uart_rxlen-5);
  17.         crc32in = (uart_buffer[uart_rxlen-4]<<24)|(uart_buffer[uart_rxlen-3]<<16)|(uart_buffer[uart_rxlen-2]<<8)|uart_buffer[uart_rxlen-1];
  18.         crcchekresult = CRC32_Check8(uart_buffer+1, uart_rxlen-5,crc32in);
  19.         printf("输入crc32:%04X 计算crc32:%04X 校验结果:%d\r\n",crc32in,crc32,crcchekresult);
  20.     }
  21.     uart_rxlen = 0;
  22.     uart_rxindex = 0;
  23. }
运行效果
QQ截图20230807195427.png
5.2AES加密解密
AES(Advanced Encryption Standard)意思是高级加密标准,它的出现主要是为了取代DES加密算法
HC32L196拥有硬件AES模块,支持128、192和256位密钥
QQ截图20230807195543.png
接下来使用这个模块测试一下AES加密解密,从串口接收数据第一位是0则加密否则解密,后续最长16位数据

  1. uint32_t aes128key[4] = {0x33221100, 0x77665544, 0xBBAA9988, 0xFFEEDDCC};
  2. uint32_t plaindata[4] = {0};
  3. uint32_t chiperdata[4] = {0};
  4. void aes_test()
  5. {
  6.     uint8_t i=0;
  7.     stc_aes_cfg_t stcAesCfg;   
  8.     Sysctrl_SetPeripheralGate(SysctrlPeripheralAes, TRUE);
  9.     memset(plaindata,0,sizeof(plaindata));
  10.     memset(chiperdata,0,sizeof(chiperdata));
  11.     stcAesCfg.pu32Plaintext = (uint32_t *)plaindata;       ///< AES 明文指针
  12.     stcAesCfg.pu32Cipher    = (uint32_t *)chiperdata;       ///< AES 密文指针
  13.     stcAesCfg.pu32Key       = aes128key;        ///< AES 密钥指针
  14.     stcAesCfg.enKeyLen      = AesKey128;            ///< AES 密钥长度类型
  15.     if(uart_buffer[0] == 0)
  16.     {
  17.         uart_rxlen -= 1;
  18.         while(i<uart_rxlen && i<16)
  19.         {
  20.             ((uint8_t *)plaindata)[i] = uart_buffer[i+1];
  21.             i+=1;
  22.         }
  23.         AES_Encrypt(&stcAesCfg);
  24.         i = 0;
  25.         while(i<16)
  26.         {
  27.             Uart_SendDataPoll(M0P_UART0,((uint8_t *)chiperdata)[i]);
  28.             i++;
  29.         }
  30.     }
  31.     else
  32.     {
  33.         uart_rxlen -= 1;
  34.         while(i<uart_rxlen && i<16)
  35.         {
  36.             ((uint8_t *)chiperdata)[i] = uart_buffer[i+1];
  37.             i+=1;
  38.         }
  39.         AES_Decrypt(&stcAesCfg);
  40.         i = 0;
  41.         while(i<16)
  42.         {
  43.             Uart_SendDataPoll(M0P_UART0,((uint8_t *)plaindata)[i]);
  44.             i++;
  45.         }
  46.     }
  47.    
  48.     uart_rxlen = 0;
  49.     uart_rxindex = 0;
  50. }
加密
QQ截图20230807173340.png
解密

QQ截图20230807173429.png
5.3TRNG测试
TRNG(True Random Number Generator)真随机数发生器,通常使用的随机函数是通过一定算法生成的伪随机数,是有规律可循的,只不过重复的周期很大
HC32L196拥有真随机数发生器模块可以产生64bits真随机数,接下来使用HC32L196的TRNG模块生成随机数,TRNG在上电时会自动生成一个随机数,之后可以调用Trng_Generate重新生成随机数

  1. int32_t main(void)
  2. {
  3.     xth_init();
  4.     //时钟分频设置
  5.     Sysctrl_SetHCLKDiv(SysctrlHclkDiv1);
  6.     Sysctrl_SetPCLKDiv(SysctrlPclkDiv1);
  7.     uart0_io_init();
  8.     uart0_init();
  9.     Sysctrl_SetPeripheralGate(SysctrlPeripheralRng, TRUE);
  10.     Trng_Init();
  11.     printf("上电生成随机数%08X%08X",Trng_GetData1(),Trng_GetData0());
  12.     while(1)
  13.     {
  14.         yuyy_delay_ms(1000);
  15.         Trng_Generate();
  16.         printf("生成随机数%08X%08X",Trng_GetData1(),Trng_GetData0());
  17.     }
  18. }
运行效果
QQ截图20230807193636.png
不过不知道怎么去验证生成的是不是真随机数

tpgf 发表于 2024-3-4 09:23 | 显示全部楼层
这三种方式并不冲突 是可以结合起来一起使用的是吗
wakayi 发表于 2024-3-4 10:08 | 显示全部楼层
想要实现AES加密解密,必须要安装特定的工具吗
wowu 发表于 2024-3-4 10:40 | 显示全部楼层
是不是真随机数 我感觉这个需要进行穷尽了
xiaoqizi 发表于 2024-3-4 22:54 | 显示全部楼层
想要通过计算机的计算能力进行暴 力 破 解 确实不容易
renzheshengui 发表于 2024-3-4 23:26 | 显示全部楼层
crc校验应该都不叫做加密解密了  算是基本的操作了
paotangsan 发表于 2024-3-4 23:58 | 显示全部楼层
真随机数发生器产生的是真随机数还是伪随机数呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

161

主题

815

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部