打印
[STM32L5]

【STM32L562 DK试用】AES加密

[复制链接]
123|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 lishuihua 于 2025-3-8 11:31 编辑

AES有五种工作模式:


1. 电码本模式(Electronic Codebook Book (ECB))



2.密码分组链接模式(Cipher Block Chaining (CBC)



3.计算器模式(Counter (CTR))



4.密码反馈模式(Cipher FeedBack (CFB))



5.输出反馈模式(Output FeedBack (OFB))

STM32L5是一颗主打低功耗和安全应用的MCU,它的安全特性,从各个方面都比以往的STM32系列有了进一步提高。

- 它支持安全启动,这是信任链的可靠锚点:bootlock可以保证启动的唯一入口,HDP可以将用户闪存的一部分隐藏起来,通常是复位后运行的安全启动代码,使得其对后面的用户应用程序不可见。

本次在STM32L5上面体验其中的前三种。主要涉及明文加密,加密数据比对,解密等。

plaintext即待加密文本:
/* Plaintext */
uint32_t aPlaintextECB[AES_TEXT_SIZE] =
                        {0x6BC1BEE2 ,0x2E409F96 ,0xE93D7E11 ,0x7393172A ,
                         0xAE2D8A57 ,0x1E03AC9C ,0x9EB76FAC ,0x45AF8E51 ,
                         0x30C81C46 ,0xA35CE411 ,0xE5FBC119 ,0x1A0A52EF ,
                         0xF69F2445 ,0xDF4F9B17 ,0xAD2B417B ,0xE66C3710};

uint32_t aPlaintextCBC[AES_TEXT_SIZE] =
                         {0xE2BEC16B ,0x969F402E ,0x117E3DE9 ,0x2A179373 ,
                          0x578A2DAE ,0x9CAC031E ,0xAC6FB79E ,0x518EAF45 ,
                          0x461CC830 ,0x11E45CA3 ,0x19C1FBE5 ,0xEF520A1A ,
                          0x45249FF6 ,0x179B4FDF ,0x7B412BAD ,0x10376CE6};

uint32_t aPlaintextCTR[AES_TEXT_SIZE] =
                         {0x477D83D6 ,0x69F90274 ,0x887EBC97 ,0x54E8C9CE ,
                          0xEA51B475 ,0x3935C078 ,0x35F6ED79 ,0x8A71F5A2 ,
                          0x6238130C ,0x88273AC5 ,0x9883DFA7 ,0xF74A5058,
                          0xA224F96F ,0xE8D9F2FB ,0xDE82D4B5 ,0x08EC3667};


串口初始化:
  /* Configure COM port */
  COM_Init.BaudRate   = 115200;
  COM_Init.WordLength = COM_WORDLENGTH_8B;
  COM_Init.StopBits   = COM_STOPBITS_1;
  COM_Init.Parity     = COM_PARITY_NONE;
  COM_Init.HwFlowCtl  = COM_HWCONTROL_NONE;
  if (BSP_COM_Init(COM1, &COM_Init) != BSP_ERROR_NONE)
  {
    Error_Handler();
  }


初始化AES模块:
static void MX_AES_Init(void)
{

  /* USER CODE BEGIN AES_Init 0 */

  /* USER CODE END AES_Init 0 */

  /* USER CODE BEGIN AES_Init 1 */

  /* USER CODE END AES_Init 1 */
  hcryp.Instance = AES;
  hcryp.Init.DataType = CRYP_DATATYPE_32B;
  hcryp.Init.KeySize = CRYP_KEYSIZE_128B;
  hcryp.Init.pKey = (uint32_t *)pKeyAES;
  hcryp.Init.Algorithm = CRYP_AES_ECB;
  hcryp.Init.DataWidthUnit = CRYP_DATAWIDTHUNIT_WORD;
  hcryp.Init.KeyIVConfigSkip = CRYP_KEYIVCONFIG_ALWAYS;
  if (HAL_CRYP_Init(&hcryp) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN AES_Init 2 */

  /* USER CODE END AES_Init 2 */

}
调用HAL API进行数据加密:
  /*****************  AES 128   ****************/
  /* Start encrypting aPlaintextECB, the cypher data is available in aEncryptedtext */
  if (HAL_CRYP_Encrypt(&hcryp, aPlaintextECB, AES_TEXT_SIZE, aEncryptedtext, TIMEOUT_VALUE) == HAL_OK)
  {
    /* Display encrypted Data */
    Display_EncryptedData(ECB, 128, AES_TEXT_SIZE);
  }
  else
  {
    /* Processing Error */
    Error_Handler();
  }


与预期结果相比较:
static void data_cmp(uint32_t *EncryptedText, uint32_t *RefText, uint8_t Size)
{
  /*  Before starting a new process, you need to check the current state of the peripheral;
      if it�s busy you need to wait for the end of current transfer before starting a new one.
      For simplicity reasons, this example is just waiting till the end of the
      process, but application may perform other tasks while transfer operation
      is ongoing. */
  while (HAL_CRYP_GetState(&hcryp) != HAL_CRYP_STATE_READY)
  {
  }
  
  /*##-3- Check the encrypted text with the expected one #####################*/
  if(memcmp(EncryptedText, RefText, Size) != 0)
  {
    Error_Handler();
  }
  else
  {
    /* Right encryption */
  }
}


实物串口结果输出:
=============================================================
================= Crypt Using HW Crypto  ====================
=============================================================
-----------------------------------------------
Plain Data (Input data for AES ECB encryption):
-----------------------------------------------
[0xE2][0xBE][0xC1][0x6B][0x96][0x9F][0x40][0x2E][0x11][0x7E][0x3D][0xE9][0x2A][0x17][0x93][0x73]  Block 0
[0x57][0x8A][0x2D][0xAE][0x9C][0xAC][0x03][0x1E][0xAC][0x6F][0xB7][0x9E][0x51][0x8E][0xAF][0x45]  Block 1
[0x46][0x1C][0xC8][0x30][0x11][0xE4][0x5C][0xA3][0x19][0xC1][0xFB][0xE5][0xEF][0x52][0x0A][0x1A]  Block 2
[0x45][0x24][0x9F][0xF6][0x17][0x9B][0x4F][0xDF][0x7B][0x41][0x2B][0xAD][0x10][0x37][0x6C][0xE6]  Block 3

=============================================================
------------------------------------------------
Cypher Data (Input data for AES 128 decryption):
------------------------------------------------
[0xB4][0x7B][0xD7][0x3A][0x60][0x36][0x7A][0x0D][0xF3][0xCA][0x9E][0xA8][0x97][0xEF][0x66][0x24]  Block 0
[0x85][0xD5][0xD3][0xF5][0x9D][0x69][0xB9][0x03][0x5A][0x89][0x85][0xE7][0xAF][0xBA][0xFD][0x96]  Block 1
[0x7F][0xCD][0xB1][0x43][0x23][0xCE][0x8E][0x59][0xE3][0x00][0x1B][0x88][0x88][0x06][0x03][0xED]  Block 2
[0x5E][0x78][0x0C][0x7B][0x3F][0xAD][0xE8][0x27][0x71][0x20][0x23][0x82][0xD4][0x5D][0x72][0x04]  Block 3

=======================================
Encrypted Data with AES 128  Mode  ECB
---------------------------------------
[0xB4][0x7B][0xD7][0x3A][0x60][0x36][0x7A][0x0D][0xF3][0xCA][0x9E][0xA8][0x97][0xEF][0x66][0x24]  Block 0
[0x85][0xD5][0xD3][0xF5][0x9D][0x69][0xB9][0x03][0x5A][0x89][0x85][0xE7][0xAF][0xBA][0xFD][0x96]  Block 1
[0x7F][0xCD][0xB1][0x43][0x23][0xCE][0x8E][0x59][0xE3][0x00][0x1B][0x88][0x88][0x06][0x03][0xED]  Block 2
[0x5E][0x78][0x0C][0x7B][0x3F][0xAD][0xE8][0x27][0x71][0x20][0x23][0x82][0xD4][0x5D][0x72][0x04]  Block 3

=======================================
Encrypted Data with AES 256  Mode  ECB
---------------------------------------
[0xBD][0xD1][0xEE][0xF3][0x3C][0xA0][0xD2][0xB5][0x7E][0x5A][0x4B][0x06][0xF8][0x81][0xB1][0x3D]  Block 0
[0x10][0xCB][0x1C][0x59][0x26][0xED][0x10][0xD4][0x4A][0xA7][0x5B][0xDC][0x70][0x28][0x36][0x31]  Block 1
[0xB9][0x21][0xED][0xB6][0xF9][0xF4][0xA6][0x9C][0xB1][0xE7][0x53][0xF1][0x1D][0xED][0xAF][0xBE]  Block 2
[0x7A][0x4B][0x30][0x23][0xFF][0xF3][0xF9][0x39][0x8F][0x8D][0x7D][0x06][0xC7][0xEC][0x24][0x9E]  Block 3

=======================================
Decrypted Data with AES 128  Mode  ECB
---------------------------------------
[0xE2][0xBE][0xC1][0x6B][0x96][0x9F][0x40][0x2E][0x11][0x7E][0x3D][0xE9][0x2A][0x17][0x93][0x73]  Block 0
[0x57][0x8A][0x2D][0xAE][0x9C][0xAC][0x03][0x1E][0xAC][0x6F][0xB7][0x9E][0x51][0x8E][0xAF][0x45]  Block 1
[0x46][0x1C][0xC8][0x30][0x11][0xE4][0x5C][0xA3][0x19][0xC1][0xFB][0xE5][0xEF][0x52][0x0A][0x1A]  Block 2
[0x45][0x24][0x9F][0xF6][0x17][0x9B][0x4F][0xDF][0x7B][0x41][0x2B][0xAD][0x10][0x37][0x6C][0xE6]  Block 3

=======================================
Decrypted Data with AES 256  Mode  ECB
---------------------------------------
[0xE2][0xBE][0xC1][0x6B][0x96][0x9F][0x40][0x2E][0x11][0x7E][0x3D][0xE9][0x2A][0x17][0x93][0x73]  Block 0
[0x57][0x8A][0x2D][0xAE][0x9C][0xAC][0x03][0x1E][0xAC][0x6F][0xB7][0x9E][0x51][0x8E][0xAF][0x45]  Block 1
[0x46][0x1C][0xC8][0x30][0x11][0xE4][0x5C][0xA3][0x19][0xC1][0xFB][0xE5][0xEF][0x52][0x0A][0x1A]  Block 2
[0x45][0x24][0x9F][0xF6][0x17][0x9B][0x4F][0xDF][0x7B][0x41][0x2B][0xAD][0x10][0x37][0x6C][0xE6]  Block 3

=======================================
Encrypted Data with AES 128  Mode  CBC
---------------------------------------
[0x76][0x49][0xAB][0xAC][0x81][0x19][0xB2][0x46][0xCE][0xE9][0x8E][0x9B][0x12][0xE9][0x19][0x7D]  Block 0
[0x50][0x86][0xCB][0x9B][0x50][0x72][0x19][0xEE][0x95][0xDB][0x11][0x3A][0x91][0x76][0x78][0xB2]  Block 1
[0x73][0xBE][0xD6][0xB8][0xE3][0xC1][0x74][0x3B][0x71][0x16][0xE6][0x9E][0x22][0x22][0x95][0x16]  Block 2
[0x3F][0xF1][0xCA][0xA1][0x68][0x1F][0xAC][0x09][0x12][0x0E][0xCA][0x30][0x75][0x86][0xE1][0xA7]  Block 3

=======================================
Encrypted Data with AES 256  Mode  CBC
---------------------------------------
[0xF5][0x8C][0x4C][0x04][0xD6][0xE5][0xF1][0xBA][0x77][0x9E][0xAB][0xFB][0x5F][0x7B][0xFB][0xD6]  Block 0
[0x9C][0xFC][0x4E][0x96][0x7E][0xDB][0x80][0x8D][0x67][0x9F][0x77][0x7B][0xC6][0x70][0x2C][0x7D]  Block 1
[0x39][0xF2][0x33][0x69][0xA9][0xD9][0xBA][0xCF][0xA5][0x30][0xE2][0x63][0x04][0x23][0x14][0x61]  Block 2
[0xB2][0xEB][0x05][0xE2][0xC3][0x9B][0xE9][0xFC][0xDA][0x6C][0x19][0x07][0x8C][0x6A][0x9D][0x1B]  Block 3

=======================================
Decrypted Data with AES 128  Mode  CBC
---------------------------------------
[0x6B][0xC1][0xBE][0xE2][0x2E][0x40][0x9F][0x96][0xE9][0x3D][0x7E][0x11][0x73][0x93][0x17][0x2A]  Block 0
[0xAE][0x2D][0x8A][0x57][0x1E][0x03][0xAC][0x9C][0x9E][0xB7][0x6F][0xAC][0x45][0xAF][0x8E][0x51]  Block 1
[0x30][0xC8][0x1C][0x46][0xA3][0x5C][0xE4][0x11][0xE5][0xFB][0xC1][0x19][0x1A][0x0A][0x52][0xEF]  Block 2
[0xF6][0x9F][0x24][0x45][0xDF][0x4F][0x9B][0x17][0xAD][0x2B][0x41][0x7B][0xE6][0x6C][0x37][0x10]  Block 3

=======================================
Decrypted Data with AES 256  Mode  CBC
---------------------------------------
[0x6B][0xC1][0xBE][0xE2][0x2E][0x40][0x9F][0x96][0xE9][0x3D][0x7E][0x11][0x73][0x93][0x17][0x2A]  Block 0
[0xAE][0x2D][0x8A][0x57][0x1E][0x03][0xAC][0x9C][0x9E][0xB7][0x6F][0xAC][0x45][0xAF][0x8E][0x51]  Block 1
[0x30][0xC8][0x1C][0x46][0xA3][0x5C][0xE4][0x11][0xE5][0xFB][0xC1][0x19][0x1A][0x0A][0x52][0xEF]  Block 2
[0xF6][0x9F][0x24][0x45][0xDF][0x4F][0x9B][0x17][0xAD][0x2B][0x41][0x7B][0xE6][0x6C][0x37][0x10]  Block 3

=======================================
Encrypted Data with AES 128  Mode  CTR
---------------------------------------
[0xE1][0xB2][0x86][0x89][0x6D][0x04][0xC7][0x64][0xD8][0xF7][0x16][0x26][0x99][0xB0][0x6D][0x73]  Block 0
[0x19][0x60][0x6F][0xD6][0x9E][0x0E][0xBF][0xFF][0x61][0xE8][0x18][0xDE][0x9D][0xFF][0xBF][0xFF]  Block 1
[0x5A][0x27][0xFB][0x7C][0xDB][0xAB][0xCB][0x7A][0xDA][0xF2][0x90][0x40][0xB0][0x0D][0x7C][0xD5]  Block 2
[0x78][0xC0][0xB8][0x5B][0xF4][0x7D][0xC0][0x8B][0x9E][0x84][0x0E][0x05][0xCF][0x00][0x39][0x77]  Block 3

=======================================
Encrypted Data with AES 256  Mode  CTR
---------------------------------------
[0x06][0x78][0xC3][0xC8][0xEE][0xEA][0x91][0xA5][0xED][0xE5][0xAF][0x20][0xDD][0xCF][0x4B][0x14]  Block 0
[0x2F][0xC2][0xC7][0x53][0xB2][0x46][0xAD][0x59][0x53][0x21][0x97][0x09][0x53][0x53][0xAF][0xA3]  Block 1
[0xD4][0x90][0x0C][0x5B][0x45][0xBC][0x97][0x32][0x17][0x0E][0xE8][0x5D][0xB4][0x21][0x19][0xB1]  Block 2
[0xFB][0x93][0xA3][0xB1][0x6D][0x5E][0xB5][0x65][0xC8][0x43][0xBB][0x10][0xA2][0x9E][0x82][0x65]  Block 3

=======================================
Decrypted Data with AES 128  Mode  CTR
---------------------------------------
[0xD6][0x83][0x7D][0x47][0x74][0x02][0xF9][0x69][0x97][0xBC][0x7E][0x88][0xCE][0xC9][0xE8][0x54]  Block 0
[0x75][0xB4][0x51][0xEA][0x78][0xC0][0x35][0x39][0x79][0xED][0xF6][0x35][0xA2][0xF5][0x71][0x8A]  Block 1
[0x0C][0x13][0x38][0x62][0xC5][0x3A][0x27][0x88][0xA7][0xDF][0x83][0x98][0x58][0x50][0x4A][0xF7]  Block 2
[0x6F][0xF9][0x24][0xA2][0xFB][0xF2][0xD9][0xE8][0xB5][0xD4][0x82][0xDE][0x67][0x36][0xEC][0x08]  Block 3

=======================================
Decrypted Data with AES 256  Mode  CTR
---------------------------------------
[0xD6][0x83][0x7D][0x47][0x74][0x02][0xF9][0x69][0x97][0xBC][0x7E][0x88][0xCE][0xC9][0xE8][0x54]  Block 0
[0x75][0xB4][0x51][0xEA][0x78][0xC0][0x35][0x39][0x79][0xED][0xF6][0x35][0xA2][0xF5][0x71][0x8A]  Block 1
[0x0C][0x13][0x38][0x62][0xC5][0x3A][0x27][0x88][0xA7][0xDF][0x83][0x98][0x58][0x50][0x4A][0xF7]  Block 2
[0x6F][0xF9][0x24][0xA2][0xFB][0xF2][0xD9][0xE8][0xB5][0xD4][0x82][0xDE][0x67][0x36][0xEC][0x08]  Block 3
===================================================
                                                   
ECB, CBC and CTR encryptions/decryptions done.
                                                No issue detected.








使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

30

帖子

0

粉丝