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 __cplusplus
extern "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

工程链接

https://pan.baidu.com/s/1P6mdvOlSWxCRoUt71lc85w

TI bim中使用AES-CBC加解密相关推荐

  1. SpringBoot+Vue中使用AES进行加解密(加密模式等对照关系)

    场景 若依前后端分离版本地搭建开发环境并运行项目的教程: 若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客 在上面搭建起来前后端架构之后,在前后端分别进行AES方式的 ...

  2. java 和 c# 下的RSA证书+AES+DES加解密实现

    java 和 c# 下的RSA+AES+DES加解密实现 前言 在实际应用中,经常有需要使用加解密的情况,RSA\AES\DES是比较常用的几种加解密方式,使用和实现方式都比较成熟可靠,本文简要介绍一 ...

  3. AES CBC加密/解密

    简介 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的D ...

  4. 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!

    前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...

  5. Crypto++库在VS 2005中的使用——RSA加解密

    Crypto++库在VS 2005中的使用--RSA加解密 源代码:下载 一.   下载Crypto++ Library Crypto++ Library的官方网:http://www.cryptop ...

  6. php中base64和js中base64可互相加解密

    php中base64和js中base64可互相加解密 前提:加解密的字符必须转换成UTF-8编码格式. php代码: <?php $str='中国航母辽宁号-歼15战机GOOD=ok'; ech ...

  7. Java中的AES加密和解密(CBC模式)

    通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响,始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法.在本文中,我们将讨论Java中具有CBC模 ...

  8. js aes加密_nodejs中使用Crypto-JS对图片进行加解密

    在用nodejs开发后台的时候,为了安全的需要,经常会有加密的需求,对前端传入的图片进行AES加密后存储,然后在前端调用的时候,对图片进行解密,并返回Base64编码格式的图片. Crypto-JS这 ...

  9. AES实现加解密-Java

    一.加解密算法生态圈 目前的数据加密技术根据加密密钥类型可分私钥加密(对称加密)系统和公钥加密(非对称加密)系统.对称加密算法是较传统的加密体制,通信双方在加/解密过程中使用他们共享的单一密钥,鉴于其 ...

最新文章

  1. system.err android.os.NetworkOnmainThreadException 错误解决办法
  2. 背景建模与前景检测3(Background Generation And Foreground Detection Phase 3)
  3. php流调签名,微信接口签名及调用流程详解 - 黎明互联-官方博客 - 黎明互联 - 区块链培训,PHP培训,IT培训,职业技能培训,追求极致!改变您的职业生涯!...
  4. c语言0x00如何不截断_binary 和 varbinary 用法全解
  5. 深入理解数据库核心技术
  6. 网站开发与服务器匹配,合格的网站开发员应当深入考虑站点框架搭建与SEO优化的关系...
  7. 数学和物理太难?这些动图让你秒懂抽象概念
  8. 工作总结13:vue官网封装组件
  9. php 自定义格式化,PHP自定义函数格式化json数据示例
  10. apache php 工作模式,PHP Apache中两种工作方式区别(CGI模式、Apache 模块DLL)
  11. MySQL不香吗,为啥京东放弃它拥抱Elasticsearch?
  12. 蚂蚁课堂视频笔记思维导图-4期 四、微服务安全
  13. Nginx源码编译安装
  14. ET199加密狗是如何复制
  15. JVM(1.8)GC日志解析与分析
  16. JS编程建议——16:防止switch贯穿
  17. 路由器信号总是无法与手机连接服务器,手机搜不到路由器信号_手机无法搜到路由器信号怎么办?-192路由网...
  18. n 以内与 n 互素的元素集合必然形成一个循环群
  19. 中国睫毛生长液行业市场供需与战略研究报告
  20. Android初级教程短信防火墙

热门文章

  1. 这6款免费电脑版本思维导图值得
  2. android系统提醒功能,安卓手机上怎么设置工作事件提醒?
  3. output = input.matmul(weight.t()) RuntimeError: expected scalar type Long but found Float 错误解决
  4. java里的aip文件在那_Java:笔记:生产AIP文档
  5. Mysql Too many connections最实用解决办法
  6. 文件属性、用户管理、权限
  7. HTML CSS 过渡效果
  8. 【转】[安卓]解决因为冻结了系统程序导致不能开机的问题
  9. 官方出的文档 - how to Compiling Shareaza
  10. 服务器本地系统 网络受限,windows10网络受限怎么解决_win10本地系统网络受限解决方法...