STM32H533RE AES使用ECB模式加密

/**
  *@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)或数据错误。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值