/**
*@func halAESEncrypt
*@brief AES 128bit加密
*@param key
*@param in
*@param out
*@param
*@retval
*/
bool halAESEncrypt(const uint8_t *key, const uint8_t *in, uint8_t *out)
{
uint32_t cr_value = 0;
uint8_t wait_timer = 0;
uint32_t temp_key[4]; // 临时缓冲区用于存储密钥
uint32_t temp_in[4]; // 临时缓冲区用于存储输入数据
/* 将密钥复制到临时缓冲区,并确保它是32位对齐的 */
memcpy(temp_key, key, 16);
/* 将输入数据复制到临时缓冲区,并确保它是32位对齐的 */
memcpy(temp_in, in, 16); // 假设输入数据也是16字节
if (0 == LL_AHB2_GRP1_IsEnableClock(LL_AHB2_GRP1_PERIPH_AES))
{
return false;
}
SET_BIT(AES->CR, AES_CR_IPRST); // 重置AES
CLEAR_BIT(AES->CR, AES_CR_IPRST);
/* 设置秘钥长度,数据类型,加密算法和模式 */
cr_value = (uint32_t)(CRYP_NO_SWAP | CRYP_KEYSIZE_128B | CRYP_AES_ECB | CRYP_KEYMODE_NORMAL);
MODIFY_REG(AES->CR, AES_CR_KMOD | AES_CR_DATATYPE | AES_CR_KEYSIZE | AES_CR_CHMOD, cr_value);
MODIFY_REG(AES->CR, AES_CR_MODE, CRYP_OPERATINGMODE_ENCRYPT);
/* 设置秘钥 */
AES->KEYR0 = temp_key[0];
AES->KEYR1 = temp_key[1];
AES->KEYR2 = temp_key[2];
AES->KEYR3 = temp_key[3];
/* 等待秘钥有效 */
wait_timer = 100;
while (READ_BIT(AES->SR, AES_SR_KEYVALID) == 0)
{
halWdgReset();
if (--wait_timer == 0)
{
return false; // 密钥加载超时
}
halMcuWaitUs(1000);
}
/* 使能AES */
SET_BIT(AES->CR, AES_CR_EN);
/* 加密数据 */
AES->DINR = temp_in[0];
AES->DINR = temp_in[1];
AES->DINR = temp_in[2];
AES->DINR = temp_in[3];
/* 等待加密完成 */
wait_timer = 100;
while (READ_BIT(AES->ISR, AES_ISR_CCF) == 0)
{
halWdgReset();
if (--wait_timer == 0)
{
CLEAR_BIT(AES->CR, AES_CR_EN);
return false; // 加密超时
}
halMcuWaitUs(1000);
}
/* 清除CCF标志 */
SET_BIT(AES->ICR, AES_ICR_CCF);
/* 读出密文 */
for (uint8_t i = 0; i < 4; i++)
{
*(uint32_t *)&out[i * 4] = AES->DOUTR;
}
CLEAR_BIT(AES->CR, AES_CR_EN);
return true;
}
/* 设置秘钥 */
for (uint32_t i = 0; i < (128 / 32); i++)
{
*(uint32_t *)&AES->KEYR0 + i = *(uint32_t *)&key[i * 4];
}
之前使用这种方式传秘钥,在C语言中,使用(uint32_t *)&key[i * 4]
进行类型转换时,需要确保key
指针所指向的内存地址是4字节对齐的,因为uint32_t
类型通常要求4字节对齐。如果key
不是4字节对齐的,那么这种类型转换可能会导致未定义行为,比如访问违规(segmentation fault)或数据错误。