[AIROC™ 蓝牙] 【英飞凌CYW20829测评】-6-AES硬件加密体验

[复制链接]
 楼主| 南来之风 发表于 2024-7-20 13:10 | 显示全部楼层 |阅读模式
<
本帖最后由 南来之风 于 2024-7-20 15:51 编辑

一、什么是AES?高级加密标准AES (Advanced Encryption Standard)是全球通用的对称密钥加密标准。它包括三种分组密码:AES-128(128位密钥)、AES-192(192位密钥)和AES-256(256位密钥)。

AES算法对硬件友好,速度快,占用资源少。它的工作原理是乘积密码,并且是分组密码,这意味着它对固定长度为128位(16字节)的数据块进行操作。输入块称为明文,加密后的输出称为密文(也是128位)。使用第二个输入(密钥)来控制精确的转换。解密与加密类似,解密算法接收128位的密文块和密钥作为输入,生成原始的128位明文块。

本次实验中用到的两种加解密算法分别是AES CTR, AES CLB.

  • AES CTR加解密原理

    CTR加密原理:用密钥对输入的计数器加密,然后同明文异或得到密文。解密原理:用密钥对输入计数器加密,然后同密文异或得到明文。

    CTR不需要Padding,而且采用了流密钥方式加解密,适合于并行运算,CTR涉及参量:Nounce随机数、Counter计数器和密钥。Nounce随机数和Counter计数器整      体可看作计数器,因为只要算法约定好,就可以回避掉串行化运算。

  • CFB模式:Cipher FeedBack mode(密文反馈模式)



二、在英飞凌硬件上体验AES硬件加解密



cyw28029的security组件包含了多种不同的硬件加解密模块,方便不同的应用场合和安全需求。其中CPU子系统提供256K RAM、用于外部闪存的XIP接口,以及包括CAN在内的丰富外设组合,以支持各种应用。内置的安全功能包括安全启动、安全执行环境、真随机数生成器(TRNG)、基于eFuse的特定密钥和密码操作硬件加速技术等。本次使用参考例程:AES_CRYPTOLITE。

1.编程完成后,应用程序自动启动。确认UART终端显示如下:



图1所示。程序启动时的终端输出

2.读取用户的输入消息,如果超过MAX_MESSAGE_SIZE限制,则提示用户输入在限制范围内的新消息。


1.输入'1'使用AES CTR模式,输入'2'使用AES CFB模式。然后,使用各自的AES模式进行加密和解密,并在UART终端上显示结果。



图2。终端输出要求输入为AES CTR模式或AES CFB模式


AES CTR加解密算法:
  1. /*******************************************************************************
  2. * Function Name: encrypt_message_cfb
  3. ********************************************************************************
  4. * Summary: Function used to encrypt the message through ctr mode.
  5. *
  6. * Parameters:
  7. *  char * message - pointer to the message to be encrypted
  8. *  uint8_t size   - size of message to be encrypted.
  9. *
  10. * Return:
  11. *  void
  12. *
  13. *******************************************************************************/

  14. void encrypt_message_ctr(uint8_t* message, uint8_t size)
  15. {
  16.     uint32_t srcOffset;
  17.     cy_stc_cryptolite_aes_state_t aes_state;
  18.     cy_stc_cryptolite_aes_buffers_t aesBuffers;
  19.     uint8_t aes_block_count = 0;
  20.     cy_en_cryptolite_status_t res;
  21.     void* result;

  22.     aes_block_count =  (size % AES128_ENCRYPTION_LENGTH == 0) ?
  23.                        (size / AES128_ENCRYPTION_LENGTH)
  24.                        : (1 + size / AES128_ENCRYPTION_LENGTH);
  25.     /* Initializes the AES operation by setting key and key length */
  26.      res = Cy_Cryptolite_Aes_Init(CRYPTOLITE, aes_key, &aes_state, &aesBuffers);
  27.      if(res!=CY_CRYPTOLITE_SUCCESS)
  28.      {
  29.        CY_ASSERT(0);
  30.      }

  31.      srcOffset = 0;
  32.      result = memcpy(AesCtrIV_copied, AesCtrIV, sizeof(AesCtrIV));
  33.      if(result == NULL)
  34.      {
  35.        perror("Memory failed\r\n");
  36.      }
  37.      res = Cy_Cryptolite_Aes_Ctr( CRYPTOLITE,
  38.                             aes_block_count * AES128_ENCRYPTION_LENGTH,
  39.                             &srcOffset,
  40.                             AesCtrIV_copied,
  41.                             encrypted_msg,
  42.                             message,
  43.                             &aes_state);
  44.      if(res!=CY_CRYPTOLITE_SUCCESS)
  45.      {
  46.        CY_ASSERT(0);
  47.      }
  48.      res = Cy_Cryptolite_Aes_Free(CRYPTOLITE,&aes_state);
  49.      if(res!=CY_CRYPTOLITE_SUCCESS)
  50.      {
  51.        CY_ASSERT(0);
  52.      }
  53.      printf("\r\nResult of Encryption:\r\n");
  54.      print_data((uint8_t*) encrypted_msg,
  55.                 aes_block_count * AES128_ENCRYPTION_LENGTH );

  56. }

  57. /*******************************************************************************
  58. * Function Name: decrypt_message
  59. ********************************************************************************
  60. * Summary: Function used to decrypt the message for ctr mode.
  61. *
  62. * Parameters:
  63. *  char * message - pointer to the message to be decrypted
  64. *  uint8_t size   - size of message to be decrypted.
  65. *
  66. * Return:
  67. *  void
  68. *
  69. *******************************************************************************/

  70. void decrypt_message_ctr(uint8_t* message, uint8_t size)
  71. {
  72.     uint32_t srcOffset;
  73.     cy_stc_cryptolite_aes_state_t aes_state;
  74.     cy_stc_cryptolite_aes_buffers_t aesBuffers;
  75.     uint8_t aes_block_count = 0;
  76.     cy_en_cryptolite_status_t res;
  77.     void* result;
  78.     aes_block_count =  (size % AES128_ENCRYPTION_LENGTH == 0) ?
  79.                        (size / AES128_ENCRYPTION_LENGTH)
  80.                        : (1 + size / AES128_ENCRYPTION_LENGTH);

  81.     /* Initializes the AES operation by setting key and key length */
  82.     res = Cy_Cryptolite_Aes_Init(CRYPTOLITE, aes_key, &aes_state, &aesBuffers);
  83.     if(res!=CY_CRYPTOLITE_SUCCESS)
  84.     {
  85.         CY_ASSERT(0);
  86.     }
  87.     srcOffset = 0;
  88.     /* Start decryption operation*/
  89.     result = memcpy(AesCtrIV_copied, AesCtrIV, sizeof(AesCtrIV));
  90.     if(result == NULL)
  91.     {
  92.         perror("Memory failed\r\n");
  93.     }
  94.     res = Cy_Cryptolite_Aes_Ctr(  CRYPTOLITE,
  95.                             aes_block_count * AES128_ENCRYPTION_LENGTH,
  96.                             &srcOffset,
  97.                             AesCtrIV_copied,
  98.                             decrypted_msg,
  99.                             encrypted_msg,
  100.                             &aes_state);
  101.     if(res!=CY_CRYPTOLITE_SUCCESS)
  102.     {
  103.         CY_ASSERT(0);
  104.     }
  105.     res = Cy_Cryptolite_Aes_Free(CRYPTOLITE,&aes_state);
  106.     if(res!=CY_CRYPTOLITE_SUCCESS)
  107.     {
  108.         CY_ASSERT(0);
  109.     }
  110.     decrypted_msg[size]='\0';
  111.     /* Print the decrypted message on the UART terminal */
  112.     printf("\r\nResult of Decryption:\r\n\n");
  113.     printf("%s", decrypted_msg);

  114. }




图3。终端输出显示AES CTR模式加解密


AES CFB加解密代码:

  1. /*******************************************************************************
  2. * Function Name: encrypt_message_cfb
  3. ********************************************************************************
  4. * Summary: Function used to encrypt the message through cfb mode.
  5. *
  6. * Parameters:
  7. *  char * message - pointer to the message to be encrypted
  8. *  uint8_t size   - size of message to be encrypted.
  9. *
  10. * Return:
  11. *  void
  12. *
  13. *******************************************************************************/


  14. void encrypt_message_cfb(uint8_t* message, uint8_t size)
  15. {
  16.     cy_stc_cryptolite_aes_state_t aes_state;
  17.     cy_stc_cryptolite_aes_buffers_t aesBuffers;
  18.     uint8_t aes_block_count = 0;
  19.     cy_en_cryptolite_status_t res;
  20.     void* result;

  21.     aes_block_count =  (size % AES128_ENCRYPTION_LENGTH == 0) ?
  22.                        (size / AES128_ENCRYPTION_LENGTH)
  23.                        : (1 + size / AES128_ENCRYPTION_LENGTH);

  24.     /* Initializes the AES operation by setting key and key length */
  25.     res = Cy_Cryptolite_Aes_Init(CRYPTOLITE, aes_key, &aes_state, &aesBuffers);
  26.     if(res!=CY_CRYPTOLITE_SUCCESS)
  27.     {
  28.         CY_ASSERT(0);
  29.     }

  30.     result = memcpy(AesCfbIV_copied, AesCfbIV, sizeof(AesCfbIV));
  31.     if(result == NULL)
  32.     {
  33.         perror("Memory failed\r\n");
  34.     }

  35.     res = Cy_Cryptolite_Aes_Cfb(  CRYPTOLITE,
  36.                             CY_CRYPTOLITE_ENCRYPT,
  37.                             aes_block_count * AES128_ENCRYPTION_LENGTH,
  38.                             AesCfbIV_copied,
  39.                             encrypted_msg,
  40.                             message,
  41.                             &aes_state);

  42.     if(res!=CY_CRYPTOLITE_SUCCESS)
  43.     {
  44.         CY_ASSERT(0);
  45.     }
  46.     res = Cy_Cryptolite_Aes_Free(CRYPTOLITE,&aes_state);
  47.     if(res!=CY_CRYPTOLITE_SUCCESS)
  48.     {
  49.         CY_ASSERT(0);
  50.     }
  51.     printf("\r\nResult of Encryption:\r\n");
  52.     print_data((uint8_t*) encrypted_msg,
  53.                 aes_block_count * AES128_ENCRYPTION_LENGTH );

  54. }

  55. /*******************************************************************************
  56. * Function Name: decrypt_message
  57. ********************************************************************************
  58. * Summary: Function used to decrypt the message for cfb mode.
  59. *
  60. * Parameters:
  61. *  char * message - pointer to the message to be decrypted
  62. *  uint8_t size   - size of message to be decrypted.
  63. *
  64. * Return:
  65. *  void
  66. *
  67. *******************************************************************************/

  68. void decrypt_message_cfb(uint8_t* message, uint8_t size)
  69. {
  70.     cy_stc_cryptolite_aes_state_t aes_state;
  71.     cy_stc_cryptolite_aes_buffers_t aesBuffers;
  72.     uint8_t aes_block_count = 0;
  73.     cy_en_cryptolite_status_t res;
  74.     void* result;

  75.     aes_block_count =  (size % AES128_ENCRYPTION_LENGTH == 0) ?
  76.                        (size / AES128_ENCRYPTION_LENGTH)
  77.                        : (1 + size / AES128_ENCRYPTION_LENGTH);

  78.     /* Initializes the AES operation by setting key and key length */
  79.     res = Cy_Cryptolite_Aes_Init(CRYPTOLITE, aes_key, &aes_state, &aesBuffers);
  80.     if(res!=CY_CRYPTOLITE_SUCCESS)
  81.     {
  82.         CY_ASSERT(0);
  83.     }
  84.     /* Start decryption operation*/
  85.     result = memcpy(AesCfbIV_copied, AesCfbIV, sizeof(AesCfbIV));
  86.     if(result == NULL)
  87.     {
  88.        perror("Memory failed\r\n");
  89.     }
  90.     res = Cy_Cryptolite_Aes_Cfb(CRYPTOLITE,
  91.                             CY_CRYPTOLITE_DECRYPT,
  92.                             aes_block_count * AES128_ENCRYPTION_LENGTH,
  93.                             AesCfbIV_copied,
  94.                             decrypted_msg,
  95.                             encrypted_msg,
  96.                             &aes_state);
  97.     if(res!=CY_CRYPTOLITE_SUCCESS)
  98.         {
  99.             CY_ASSERT(0);
  100.         }
  101.     res = Cy_Cryptolite_Aes_Free(CRYPTOLITE,&aes_state);
  102.     if(res!=CY_CRYPTOLITE_SUCCESS)
  103.         {
  104.             CY_ASSERT(0);
  105.         }
  106.     decrypted_msg[size]='\0';
  107.     /* Print the decrypted message on the UART terminal */
  108.     printf("\r\nResult of Decryption:\r\n\n");
  109.     printf("%s", decrypted_msg);

  110. }


图4。终端输出显示AES CFB模式加解密


总结:
英飞凌CYW20829芯片不仅提供了卓越的硬件加解密模块,还提供了ModusToolbox软件生态,功能完善的BSP等软件资源,可以大大简化硬件加解密的设计的同时满足高标准的安全需求。







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
suncat0504 发表于 2024-7-29 20:55 | 显示全部楼层
很高深的样子,要学的东西太多了。
shenxiaolin 发表于 2024-7-29 21:54 | 显示全部楼层
感谢分享
shenxiaolin 发表于 2024-7-29 21:55 | 显示全部楼层
感谢分享
yangjiaxu 发表于 2024-7-30 10:58 | 显示全部楼层
硬件AES确实很不错,虽然我用的都是软件的CRC就完事儿了 哈哈哈
盗铃何须掩耳 发表于 2024-7-31 14:21 | 显示全部楼层
现在都很注意固件安全了
原来是wjc 发表于 2025-2-28 23:24 | 显示全部楼层
AES对固定长度的数据块(128位)进行加密和解密处理。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

290

帖子

2

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