当前位置: 首页 > news >正文

【AES加密】AES加密算法实现(附代码):1 AES头文件的书写

目录

0.相关内容

1.定义密钥长度

2.定义加密模式

3.头文件函数声明


0.相关内容

【AES加密】AES加密算法流程全解析

1.定义密钥长度

//定义AES密钥长度的枚举
typedef enum {AES_KEY_LENGTH_128 = 128,AES_KEY_LENGTH_192 = 192,AES_KEY_LENGTH_256 = 256
} AES_Key_Length;
//以bit为单位的密钥长度,只能为128,192 和 256 三种
#define AES_KEY_LENGTH    AES_KEY_LENGTH_128 

定义枚举(如 AES_Key_Length)的好处包括:

■ 可读性:枚举提供了更具描述性的名称,使代码更易于理解。例如,使用AES_KEY_LENGTH_128比直接使用数字更清晰。

■ 类型安全:使用枚举可以限制传递给函数的值,从而减少错误。例如,如果函数期望的AES_Key_Length 类型的参数,它不能接受其他类型的整数。

■ 维护性:如果将来需要修改支持的密钥长度,只需在枚举中进行更改,而不需要在代码的每个地方查找和替换。

■ 防止魔法数字:避免在代码中直接使用硬编码的数字(即“魔法数字”),增强了代码的可维护性。

2.定义加密模式

// 加解密模式
typedef enum {
AES_MODE_ECB=0,  //电子密码本模式(一般模式)
AES_MODE_CBC = 1 // 密码分组链接模式
} AES_Mode;// 设置当前的加解密模式
#define AES_MODE     AES_MODE_CBC

电子密码本模式(Electronic Codebook,ECB)是一种基本的对称加密分组模式。在AES中使用时,它将每一块明文数据单独加密,因此相同的明文块总是加密成相同的密文块。

ECB模式工作原理

分组加密:将明文分割成长度固定的块(例如128位,AES的标准分组大小)。

逐块加密:每个明文块独立进行加密,生成对应的密文块。

独立性:加密过程对每一块都是独立的,块与块之间没有联系。这意味着相同的明文块将被加密成相同的密文块。

在实际应用中,AES-ECB模式通常不用于加密敏感或重要的数据,而是用于加密随机性较强的短小数据块,如密钥或会话令牌等。对于长数据或需要更高安全性的加密场景,通常选择密码分组链接模式(CBC)、计数器模式(CTR)等。

AES的密码分组链接模式(Cipher Block Chaining,CBC)是一种更安全的分组加密模式。CBC模式在加密时会利用前一个密文块的内容,将明文分组串联起来进行加密,从而增强了加密安全性。

CBC模式工作原理

i. 初始化向量(IV):加密的第一个明文块会先与一个随机生成的初始化向量(IV)进行异或(XOR)操作,再通过AES加密算法生成第一个密文块。这个IV需要保持随机性和唯一性,但不需要保密。

ii. 链接加密:

  • 第二个明文块会与第一个密文块异或后再加密,生成第二个密文块。

  • 以此类推,每个明文块都先与前一个密文块异或,再通过AES加密生成相应的密文块。

iii.依赖关系:每个加密块都依赖于前一个密文块,因此CBC模式的密文块之间具有“链接”关系。

AES-CBC模式在安全传输协议(如TLS、IPSec)和存储加密等安全性要求高的场景中广泛应用。相比ECB,CBC模式通过IV和链接机制有效抵御了模式分析攻击。

3.头文件函数声明

/******************************************************************************
* @brief 初始化 AES 加密,执行密钥扩展操作。
*
* 此函数基于提供的原始密钥生成 AES 轮密钥。
*
* @param[in] pKey 指向原始密钥的指针。密钥长度必须为 AES_KEY_LENGTH/8 字节。
*
* @return 无返回值。
******************************************************************************/
void AES_Init(const void *pkey);

为什么AES中密钥长度必须为 AES_KEY_LENGTH/8 字节?

在AES加密算法中,密钥长度以位为单位,且只能为128位、192位或256位(即对应的AES_KEY_LENGTH为128、192或256)。由于密钥在实际存储和操作时需要以字节为单位进行处理,因此密钥长度必须转换为字节(8位为1字节)来进行存储和处理。

例如:

■ 对于128位密钥,长度为128,128/8=16字节。

■ 对于192位密钥,长度为192,192/8=24字节。

■ 对于256位密钥,长度为256,256/8=32字节。

/******************************************************************************
* @brief 加密数据。
*
* 此函数对给定的明文进行AES 加密,生成对应的密文。
*
* @param[in] pPlainText      指向明文数据的指针。数据长度为 nDataLen 字节。
* @param[out] pCipherText    指向用于存储密文的缓冲区的指针,长度与pPlainText 相同。
* @param[in] nDataLen        数据长度,以字节为单位,必须为 AES_KEY_LENGTH/8 的整倍数。
* @param[in] pIV             指向初始化向量的指针,如果使用 ECB 模式,可设为 NULL。
*
* @return 无返回值。
******************************************************************************/
void AES_Encrypt(const unsigned char *pPlainText, unsigned char *pCipherText,unsigned int nDataLen, const unsigned char *pIV);

为什么nDataLen必须为 AES_KEY_LENGTH/8 的整倍数?

  • 数据填充:如果输入的数据长度不符合整倍数的要求,通常需要进行填充(Padding),以使得数据的长度达到块大小的整数倍。

  • 确保兼容性:采用这种整倍数的要求使得不同的实现和模式(如CBC、ECB等)之间的接口和数据格式更加一致,降低了出错的概率。

/******************************************************************************
* @brief 加密数据。
*
* 此函数对给定的明文进行AES 解密,生成对应的明文。
*
* @param[in] pCipherText 指向密文数据的指针。数据长度为nDataLen字节。
* @param[out] pPlainText 指向用于存储解密后明文的缓冲区的指针,长度与 pCipherText 相同。
* @param[in] nDataLen    数据长度,以字节为单位,必须为AES_KEY_LENGTH/8 的整倍数。
* @param[in] pIV         指向初始化向量的指针,如果使用 ECB 模式,可设为 NULL。
*
* @return 无返回值。
******************************************************************************/
void AES_Decrypt(const unsigned char *pCipherText, unsigned char *pPlainText,unsigned int nDatalen, const unsigned char *pIV);

http://www.dtcms.com/a/541849.html

相关文章:

  • Linux入门2(1/3)
  • 哪个网站可以做条形码毛坯房最便宜装修方法
  • 北京塞车网站建设wordpress安装到万网
  • 包头企业做网站能免费建网站吗
  • C++ 字符串型
  • ELK运维之路(定时清理索引)
  • 行业协会网站模板网站按天扣费优化推广
  • 网站开发提高加载速度网站备案服务内容
  • 硬件电路RS485通信EMC 设计
  • Visual Basic 随机文件
  • 选服务好的网站建设公司网易企业邮箱app叫什么名字
  • 比百度更好的网站网站后台怎么做友情链接
  • 网站建站侵权怎么办推荐一下做图文的网站
  • Java 多线程:从单体到分布式的演进与陷阱
  • JAVA中的注解是什么玩意
  • 能不能上传网站再备案陕西西安网站设计公司
  • 各大网站注册记录商城建站报价方案
  • 注入漏洞网站源码程序开发的基本步骤是什么?
  • 超硬核c语言编程随想笔记:深挖cint**二级指针-核心多级指针的内存陷阱,彻底终结多级指针恐惧症
  • 邯郸建立网站费用乐清网站开发
  • JAVA面试入职笔记 | linux常用基本指令快速查看
  • 网站设计公司苏州erp系统的功能包括哪些
  • 【2025-系统规划与管理师】第16章:资源与工具管理
  • 天津网站建设案例wordpress怎么导入自己的php
  • 东莞网站优化方法有哪些哈尔滨大型网站设计公司
  • 模板的网站都有哪些公司网站建设公
  • 避免踩坑!三星打印机SCX3401驱动安装详细步骤解析
  • 有哪些网站开发技术甘肃省建设工程造价信息网站
  • 建网站 选安全网页设计代码单元格内容怎么居中
  • 双牌网站建设app网站样式