300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > TI bim中使用AES-CBC加解密

TI bim中使用AES-CBC加解密

时间:2020-04-30 20:26:44

相关推荐

TI bim中使用AES-CBC加解密

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-CC2652RSDK版本:simplelink_cc13x2_26x2_sdk_3_10_00_53AES库:由于是在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(;;){memset(image_input_data, 0, IMAGE_BLOCK_SIZE);memset(image_output_data, 0, IMAGE_BLOCK_SIZE);memset(image_backup_data, 0, IMAGE_BLOCK_SIZE);bimExtFlashRead(imgOffset, IMAGE_BLOCK_SIZE, image_input_data);SHA2_open();execute_aes_cbc_decrypt(image_input_data, image_output_data);update_aes_cbc_iv_value(image_input_data);SHA2_close();writeFlash(addr, image_output_data, IMAGE_BLOCK_SIZE);readFlash(addr, image_backup_data, IMAGE_BLOCK_SIZE);ret = memcmp(image_backup_data, image_output_data, IMAGE_BLOCK_SIZE);if (ret == 0){if(imgOffset == (APP_FLASH_MAX_SIZE+OTA_BACKUP_IMAGE_ADDRE)){break;}else{addr += IMAGE_BLOCK_SIZE;imgOffset += IMAGE_BLOCK_SIZE;}}else{return BOOT_NV_ERR;}}RevertSystem = RTF_OTA_BL_OTA_REVERTSYSTEM_ENABLE;//Get Backup firmware versionfetchBootNVSegmentbyType(BOOT_NV_OTA_BACKUP_FW_VERSION, OtaBackupFwVersion, sizeof(OtaBackupFwVersion));updateBootNVSegmentbyType(BOOT_NV_APP_FW_VERSION, OtaBackupFwVersion, sizeof(OtaBackupFwVersion));updateBootNVSegmentbyType(BOOT_NV_APP_IMAGE_SHA2, imagefinalHash, sizeof(imagefinalHash));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_INSTALL_EVENT, &ota_bl_install_event, sizeof(uint8_t));updateBootNVSegmentbyType(BOOT_NV_OTA_UPDATE_IMAGE_VALID, &ota_update_image_valid, sizeof(uint8_t));updateBootNvRecord();jumpToPrgEntry(FW_START_ADDRESS);return 1;}uint8_t rtf_ota_bl_ota_execute_backup_app_image(uint8_t* Version){int ret = 0;uint32_t addr = 0x00;uint32_t imgOffset = OTA_BACKUP_IMAGE_ADDRE;uint8_t ota_Backup_image_valid = RTF_OTA_EDGE_OTA_BACKUP_IMAGE_VALID;memset(imagefinalHash, 0, DIGEST_SIZE);SHA2_open();rtf_bl_init_cbc_iv();for (;;){memset(image_input_data, 0, IMAGE_BLOCK_SIZE);memset(image_output_data,0,IMAGE_BLOCK_SIZE);ret = readFlash(addr, image_input_data, IMAGE_BLOCK_SIZE);if (ret == FLASH_SUCCESS){addr += IMAGE_BLOCK_SIZE;if(addr == APP_FLASH_MAX_SIZE){break;}else{execute_application_cbc_encrypt(image_input_data, image_output_data);update_aes_cbc_iv_value(image_output_data);SHA2_addData(image_output_data, IMAGE_BLOCK_SIZE); }}else{SHA2_finalize(imagefinalHash);SHA2_close(); ota_Backup_image_valid = RTF_OTA_EDGE_OTA_UPDATE_IMAGE_UNVALID;updateBootNVSegmentbyType(BOOT_NV_OTA_BACKUP_IMAGE_VALID, &ota_Backup_image_valid, sizeof(uint8_t));updateBootNvRecord();return 0;}}SHA2_finalize(imagefinalHash);SHA2_close(); addr=0;updateBootNVSegmentbyType(BOOT_NV_APP_IMAGE_SHA2, imagefinalHash, sizeof(imagefinalHash));bimExtFlashErase(imgOffset, OTA_BACKUP_IMAGE_SIZE);rtf_bl_init_cbc_iv();for (;;){memset(image_input_data,0,IMAGE_BLOCK_SIZE);memset(image_output_data,0,IMAGE_BLOCK_SIZE);memset(image_backup_data,0,IMAGE_BLOCK_SIZE);readFlash(addr, image_input_data, IMAGE_BLOCK_SIZE);SHA2_open();execute_application_cbc_encrypt(image_input_data, image_output_data);update_aes_cbc_iv_value(image_output_data);SHA2_close(); bimExtFlashwrite(imgOffset, IMAGE_BLOCK_SIZE, image_output_data);bimExtFlashRead(imgOffset, IMAGE_BLOCK_SIZE, image_backup_data);ret = memcmp(image_backup_data, image_output_data, IMAGE_BLOCK_SIZE);if (ret == 0){if(addr == APP_FLASH_MAX_SIZE){updateBootNVSegmentbyType(BOOT_NV_OTA_BACKUP_IMAGE_SHA2, imagefinalHash, sizeof(imagefinalHash));break;}else{addr += IMAGE_BLOCK_SIZE;imgOffset += IMAGE_BLOCK_SIZE;}}else{ota_Backup_image_valid = RTF_OTA_EDGE_OTA_UPDATE_IMAGE_UNVALID;updateBootNVSegmentbyType(BOOT_NV_OTA_BACKUP_IMAGE_VALID, &ota_Backup_image_valid, sizeof(uint8_t));updateBootNvRecord();return 0;}}updateBootNVSegmentbyType(BOOT_NV_OTA_BACKUP_IMAGE_VALID, &ota_Backup_image_valid, sizeof(uint8_t));updateBootNVSegmentbyType(BOOT_NV_OTA_BACKUP_FW_VERSION, Version, 4);updateBootNvRecord();return 1;}

/******************************************************************************@file rtf_bl_aes_interface.c@brief Note: Group:Target Device: cc13x2_26x2*****************************************************************************//********************************************************************** INCLUDES*/#include "rtf_bl_aes_interface.h"#include "flash_interface.h"#include "sha2_driverlib.h"#include <stdbool.h>#include <stdint.h>#include <ti/devices/DeviceFamily.h>#include DeviceFamily_constructPath(driverlib/crypto.h)#include DeviceFamily_constructPath(driverlib/aes.h)#include DeviceFamily_constructPath(driverlib/prcm.h)#include DeviceFamily_constructPath(driverlib/rom_crypto.h)#include DeviceFamily_constructPath(driverlib/flash.h)#include DeviceFamily_constructPath(driverlib/gpio.h)#include DeviceFamily_constructPath(inc/hw_crypto.h)volatile unsigned char m_aes_cbc_iv[RTF_BL_AES_CBC_IV_LEN] = {0};void rtf_bl_init_cbc_iv(void){memset((void *)m_aes_cbc_iv, 0x00, RTF_BL_AES_CBC_IV_LEN);}void update_aes_cbc_iv_value(uint8_t *data_buff){int index = 0;if (data_buff == NULL){return;}for(index = 0; index < RTF_BL_AES_CBC_IV_LEN; index++){m_aes_cbc_iv[index] = data_buff[RTF_BL_INPUT_DATA_LEN- RTF_BL_AES_CBC_IV_LEN + index];}}app_cbc_encrypt_decrypt_ret execute_application_cbc_encrypt(uint8_t *input_data, uint8_t *output_data){app_cbc_encrypt_decrypt_ret ret = RTF_BL_CBC_ENCRYPT_DECRYPT_SUCCESS;rtf_bl_image_backup_kuinque_t image_backup_kuinque;readFlash(OTA_KUNIQUE_ADDRE, (uint8_t *)&image_backup_kuinque, sizeof(rtf_bl_image_backup_kuinque_t));CRYPTOAesLoadKey((uint32_t *)image_backup_kuinque.key_offset, AES_KEY_AREA_6);CRYPTOAesCbc((uint32_t *)input_data,(uint32_t *)output_data,RTF_BL_INPUT_DATA_LEN,(uint32_t *)m_aes_cbc_iv,AES_KEY_AREA_6,true,0);while (CRYPTOAesEcbStatus() != AES_SUCCESS);HWREG(CRYPTO_BASE + CRYPTO_O_SWRESET) = 0x00000001;while (HWREG(CRYPTO_BASE + CRYPTO_O_SWRESET) == 0x00000001);return ret;}app_cbc_encrypt_decrypt_ret execute_aes_cbc_decrypt(uint8_t *input_data, uint8_t *output_data){app_cbc_encrypt_decrypt_ret ret = RTF_BL_CBC_ENCRYPT_DECRYPT_SUCCESS;rtf_bl_image_backup_kuinque_t image_backup_kuinque;readFlash(OTA_KUNIQUE_ADDRE, (uint8_t *)&image_backup_kuinque, sizeof(rtf_bl_image_backup_kuinque_t));CRYPTOAesLoadKey((uint32_t *)image_backup_kuinque.key_offset, AES_KEY_AREA_6);CRYPTOAesCbc((uint32_t *)input_data,(uint32_t *)output_data,RTF_BL_INPUT_DATA_LEN,(uint32_t *)m_aes_cbc_iv,AES_KEY_AREA_6,false,0);while (CRYPTOAesEcbStatus() != AES_SUCCESS);HWREG(CRYPTO_BASE + CRYPTO_O_SWRESET) = 0x00000001;while (HWREG(CRYPTO_BASE + CRYPTO_O_SWRESET) == 0x00000001);return ret;}

#ifndef RTF_BL_AES_INTERFACE_H#define RTF_BL_AES_INTERFACE_H#ifdef __cplusplusextern "C"{#endif/******************************************************************************** Includes*/#include "hal_flash.h"#include "hal_types.h"#ifdef __cplusplus}#endif/********************************************************************** MACROS*/#define OTA_KUNIQUE_ADDRE(0x4EC00)#define RTF_BL_AES_CBC_IV_LEN (16)#define RTF_BL_AES_GCM_IV_INI_VALUE(0x01000000)#define RTF_BL_INPUT_DATA_LEN (512)#define RTF_BL_OUTPUT_DATA_LEN(512)#define RTF_BL_ADD_LEN (8)#define RTF_BL_AES_GCM_KEY_LEN(16)/******************************************************************************** Typedefs*/typedef enum{RTF_BL_CBC_ENCRYPT_DECRYPT_SUCCESS = 0,RTF_BL_CBC_ENCRYPT_DECRYPT_FAIL = 1,RTF_BL_CBC_INVALID_PARAMETER = 3} app_cbc_encrypt_decrypt_ret;typedef enum {RTF_BL_AES_CBC_OPERATION_TYPE_ENCRYPT = 1,RTF_BL_AES_CBC_OPERATION_TYPE_DECRYPT = 2,} aes_cbc_operation_type;__packed typedef struct {uint8_t unqiue_id[4];uint8_t version[4];uint8_t key_offset[16];//Actual KUnique (16 Bytes)} rtf_bl_image_backup_kuinque_t;extern app_cbc_encrypt_decrypt_ret execute_application_cbc_encrypt(uint8_t *input_data, uint8_t *output_data);extern app_cbc_encrypt_decrypt_ret execute_aes_cbc_decrypt(uint8_t *input_data, uint8_t *output_data);extern void rtf_bl_init_cbc_iv(void);extern void update_aes_cbc_iv_value(uint8_t *data_buff);#endif /* RTF_BL_AES_INTERFACE_H */

特别提示

本人加解密明文的长度为512Bytes,这远远超过16Bytes,所以对于加密正如上文所述长度为512Bytes的明文在使用CBC加密后使用密文的后16字节作为下一次加密的IV值,对于解密,使用需要解密的密文的后16字节作为下一次解密的IV

工程链接

/s/1P6mdvOlSWxCRoUt71lc85w

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。