AES CBC Encrypt/Decrypt
AES加密的几种工作模式
高级加密标准(Advanced Encryption Standard: AES)是美国国家标准与技术研究院(NIST)在2001年建立了电子数据的加密规范。其是对称加解密算法的最经典算法之一,它是一种分组加密标准,每个加密块大小为128位,允许的密钥长度为128、192和256位。这里只介绍CBC加密模式。
CBC 模式
CBC模式又称密码分组链接(Cipher-block chaining):加密时,明文首先与IV异或,然后将结果进行块加密,得到的输出就是密文,同时本次的输出密文作为下一个块加密的IV; 解密时,先将密文的第一个块进行块解密,然后将结果与IV异或,就能得到明文,同时,本次解密的输入密文作为下一个块解密的IV;如下图:
AES CBC加密允许加密或解密长度不是16的整数倍,不足的部分会用0填充,输出总是16的整数倍;完成加密或解密后会更新初始化向量IV;CBC模式相比ECB有更高的保密性,但由于对每个数据块的加密依赖与前一个数据块的加密所以加密无法并行;与ECB一样在加密前需要对数据进行填充。
测试例程
本文测试环境:
芯片型号:TI-CC2652R
SDK版本:simplelink_cc13x2_26x2_sdk_3_10_00_53
AES库:由于是在TI提供的bim中进行aes加解密所以只能使用driverlib库中比较底层的crypto.c
代码实现
/*******************************************************************************
* EXTERNAL FUNCTIONS
*/
uint8_t rtf_ota_bl_execute_version_fallback(void)
{
int ret = 0;
uint32_t addr = 0x00;
uint8_t ota_bl_install_event = RTF_OTA_EVENT_EDGE_REVERT_SUCCESS;
uint32_t imgOffset = OTA_BACKUP_IMAGE_ADDRE;
uint8_t RevertSystem = RTF_OTA_BL_OTA_REVERTSYSTEM_DISABLE;
uint8_t ProvisionalPeriod = 0;
uint8_t ota_state = RTF_OTA_EDGE_REVERTED_IMAGE;
uint8_t ota_update_image_valid = RTF_OTA_EDGE_OTA_UPDATE_IMAGE_UNVALID;
uint8_t OtaBackupFwVersion[4] = {
0};
extFlashOpen();
bimDelay(1);
memset(imagefinalHash, 0, DIGEST_SIZE);
SHA2_open();
for(;;)
{
memset(image_input_data, 0, IMAGE_BLOCK_SIZE);
extFlashRead(imgOffset, IMAGE_BLOCK_SIZE, image_input_data);
imgOffset+=IMAGE_BLOCK_SIZE;
if(imgOffset == (APP_FLASH_MAX_SIZE + OTA_BACKUP_IMAGE_ADDRE))
{
break;
}else{
SHA2_addData(image_input_data, IMAGE_BLOCK_SIZE);
}
}
SHA2_finalize(imagefinalHash);
SHA2_close();
extFlashClose();
imgOffset=OTA_BACKUP_IMAGE_ADDRE;
ret = memcmp(BOOT_NV_Config_buff.BOOT_NV_Buf.OtaBackupImageSHA2, imagefinalHash, DIGEST_SIZE);
if (ret != 0)
{
RevertSystem = RTF_OTA_BL_OTA_REVERTSYSTEM_FAIL;
ota_state = RTF_OTA_EDGE_NORMAL_IMAGE;
ota_bl_install_event = RTF_OTA_EVENT_EDGE_REVERT_FAILED;
updateBootNVSegmentbyType(BOOT_NV_PROVISIONAL_PERIOD, &ProvisionalPeriod, sizeof(uint8_t));
updateBootNVSegmentbyType(BOOT_NV_REVERT_SYSTEM, &RevertSystem, sizeof(uint8_t));
updateBootNVSegmentbyType(BOOT_NV_OTA_STATE, &ota_state, sizeof(uint8_t));
updateBootNVSegmentbyType(BOOT_NV_OTA_UPDATE_IMAGE_VALID, &ota_update_image_valid, sizeof(uint8_t));
updateBootNVSegmentbyType(BOOT_NV_OTA_INSTALL_EVENT, &ota_bl_install_event, sizeof(uint8_t));
updateBootNvRecord();
return BOOT_NV_ERR;
}
eraseFWStartFlash();
rtf_bl_init_cbc_iv();
for(