[STM32H5] 【STM32 Nucleo-64测评】AES加密测试

[复制链接]
 楼主| aple0807 发表于 2024-8-13 22:18 | 显示全部楼层 |阅读模式
<
H533包含一个AES加密外设,可以加速加密应用的执行速度,这两天学习一下该模块用法并进行加密速度测试。
为测试性能,另外使用mbedtls的软件加密作为对比。

该测试使用 AES-ECB模式进行加密解密,KEY长度为128位,测试数据长度512字节。测试代码如下

  1. /*****************************************************************************
  2. * [url=home.php?mod=space&uid=247401]@brief[/url]   var
  3. *****************************************************************************/
  4. extern CRYP_HandleTypeDef hcryp;

  5. // 此数组为 key_code_sim 代码二进制值
  6. // 作为固定键值,可以伪装为程序
  7. const uint16_t ase_key_src[] = {
  8.         0xf04f, 0x5000, 0x6801, 0x07ca,
  9.         0xd500, 0xbf00, 0x6841, 0x078a,
  10.         0xd500, 0xbf00, 0x6881, 0x074a,
  11.         0xd500, 0xbf00, 0x68c0, 0x0701,
  12.         0xd500, 0xbf00, 0x4770};

  13. #define dat_buff_init()              \
  14.         loop(1000) src[index] = index;   \
  15.         memset(enc, 0, 1000);            \
  16.         memset(dec, 0, 1000);


  17. /*****************************************************************************
  18. * @brief   fun
  19. *****************************************************************************/

  20. /*******************************************************************************
  21. * @brief  des_demo.
  22. * \param[in] none
  23. * \retval: none
  24. *******************************************************************************/
  25. int aes_demo(int argc, char * argv[])
  26. {
  27.         uu32 clk_start;
  28.         uu8 *src, *enc, *dec, *iv;
  29.         mbedtls_aes_context *aes_enc, *aes_dec;
  30.         size_t offset;

  31.         // 内存请求
  32.         src = calloc(1, 1024);
  33.         enc = calloc(1, 1024);
  34.         dec = calloc(1, 1024);
  35.         iv = calloc(1, 80);
  36.         aes_enc = malloc(sizeof(mbedtls_aes_context));
  37.         aes_dec = malloc(sizeof(mbedtls_aes_context));

  38.         dbg_puts("\n===========================================================\n");
  39.         dbg_print("AES 128 encode test: <128 bits> \n");

  40.         // 初始化
  41.         dat_buff_init();

  42.         // 初始化结构
  43.         mbedtls_aes_init(aes_enc);
  44.         mbedtls_aes_init(aes_dec);

  45.         // 生成 KEY
  46.         clk_start = bsp_cpu_clks_get();
  47.         mbedtls_aes_setkey_enc(aes_enc, (void *)ase_key_src, 128);
  48.         mbedtls_aes_setkey_dec(aes_dec, (void *)ase_key_src, 128);
  49.         dbg_print("key make time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));

  50.         /*------------------------------------------------------------------------*/
  51.         // 加密 + 解密         ECB                        电子密码本模式
  52.         clk_start = bsp_cpu_clks_get();
  53.         loop(32)
  54.         {
  55.                 mbedtls_aes_crypt_ecb(aes_enc, MBEDTLS_AES_ENCRYPT, &src[16*index], &enc[16*index]);
  56.                 mbedtls_aes_crypt_ecb(aes_dec, MBEDTLS_AES_DECRYPT, &enc[16*index], &dec[16*index]);
  57.         }
  58.         dbg_print("MBEDTLS: AES ecb : enc + dec time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));

  59.         // 显示
  60.         //dbg_u8_print("src: ", src, 16, 20);
  61.         dbg_u8_print("enc: ", enc, 128, 16);
  62.         dbg_u8_print("dec: ", dec, 128, 16);

  63.         // 释放,用于清除内存中的密匙,属于安全性代码
  64.         mbedtls_aes_free(aes_enc);
  65.         mbedtls_aes_free(aes_dec);

  66.         // 硬件加密解密
  67.         dat_buff_init();
  68.         clk_start = bsp_cpu_clks_get();
  69.         HAL_CRYP_Encrypt(&hcryp, (uu32*)&src[0], 512/4, (uu32*)&enc[0], 100000);
  70.         HAL_CRYP_Decrypt(&hcryp, (uu32*)&enc[0], 512/4, (uu32*)&dec[0], 100000);       
  71.         dbg_print("STM32: AES ecb : enc + dec time: %d us\n", bsp_clks_to_us(bsp_cpu_clks_get() - clk_start));
  72.         dbg_u8_print("enc: ", enc, 128, 16);
  73.         dbg_u8_print("dec: ", dec, 128, 16);       
  74.        
  75.         // 释放内存
  76.         free(src);
  77.         free(enc);
  78.         free(dec);
  79.         free(iv);
  80.         free(aes_enc);
  81.         free(aes_dec);
  82.        

  83.        
  84.         return 0;
  85. }
  86. DBG_FUN_EXPORT(aes_demo);
串口输入aes_demo执行测试程序。测试结果如下:
AES.png
mbedtls 加密并解密耗时789us,STM32硬件加密解密耗时81us,速度足足提高了10倍,相当给力。

需要注意的是,STM32的加密函数传入的数据长度是按字计算,mbedtls数据长度按字节计算,下面附上测试工程。
SOFTWARE.rar (8.82 MB, 下载次数: 7)

chenjun89 发表于 2024-8-14 08:30 来自手机 | 显示全部楼层
现在信息安全的重要性很高
trucyw 发表于 2024-8-14 18:39 | 显示全部楼层
有时间测试下
weifeng90 发表于 2024-8-14 20:11 来自手机 | 显示全部楼层
这个AES加密和信创中的加密算法是一回事吗?
 楼主| aple0807 发表于 2024-8-14 22:01 | 显示全部楼层
weifeng90 发表于 2024-8-14 20:11
这个AES加密和信创中的加密算法是一回事吗?

信创没了解过,AES是标准加密算法,不管谁家的芯片,只要是AES算法都是一样的,也没听说AES有别的名字
狄克爱老虎油 发表于 2024-8-17 23:25 来自手机 | 显示全部楼层
这个**起来难吗
巧克力娃娃 发表于 2024-10-11 17:23 | 显示全部楼层
weifeng90 发表于 2024-8-14 20:11
这个AES加密和信创中的加密算法是一回事吗?

不是一回事,不过AES和SM4都属于对称加密



---

**对比项**:  
**国密算法** vs **国际加密算法**

---

**主要算法**:  
- **国密算法**:SM1、SM2、SM3、SM4  
- **国际加密算法**:AES、RSA、ECC、SHA-256  

---

**对称加密**:  
- **国密算法**:SM4(128位分组对称加密)  
- **国际加密算法**:AES(128/192/256位分组对称加密)

---

**非对称加密**:  
- **国密算法**:SM2(基于椭圆曲线的加密)  
- **国际加密算法**:RSA、ECC(椭圆曲线加密)

---

**哈希算法**:  
- **国密算法**:SM3(256位消息摘要)  
- **国际加密算法**:SHA-256(256位消息摘要)

---

**数字签名**:  
- **国密算法**:SM2(基于椭圆曲线的签名算法)  
- **国际加密算法**:RSA、ECC(椭圆曲线数字签名)

---

**自主研发**:  
- **国密算法**:是(由中国国家密码管理局主导开发)  
- **国际加密算法**:否(国际标准,广泛应用)

---

**安全性**:  
- **国密算法**:满足国家安全需求,防止外部依赖  
- **国际加密算法**:公认的高安全性,已被国际审查认证

---

**性能**:  
- **国密算法**:高效,适用于高并发场景  
- **国际加密算法**:AES、ECC等性能也较高

---

**合规性**:  
- **国密算法**:强制应用于中国的政府和金融行业  
- **国际加密算法**:国际通用,在全球广泛使用

---

**编码方式**:  
- **国密算法**:十六进制、DER编码、Base64  
- **国际加密算法**:Base64、DER编码等

---

**应用场景**:  
- **国密算法**:电子政务、金融系统、SSL/TLS加密  
- **国际加密算法**:全球互联网、数字货币、银行支付

---

**对称加密长度**:  
- **国密算法**:128位密钥,128位分组  
- **国际加密算法**:128/192/256位密钥,128位分组

---

**非对称加密长度**:  
- **国密算法**:基于椭圆曲线,长度可调  
- **国际加密算法**:RSA可达4096位,ECC常见160-521位

---

Stahan 发表于 2024-10-13 22:39 | 显示全部楼层
最近也在研究加密算法
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

326

帖子

2

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

77

主题

326

帖子

2

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