本帖最后由 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.
|