openSSL AES 加密引擎代码分析

本文以openssl-0.9.8l代码为基础,对openSSL中AES加密引擎的代码做一个分析,这里侧重于应用的角度对代码进行分析,有关aes加密算法的原理等有很多介绍(例如:http://zh.wikipedia.org/zh-cn/AES),不在本文的讨论范围之内。

AES的区块长度固定为128 位元,密钥长度则可以是128,192或256位元;AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:

1. AddRoundKey — 矩阵中的每一个字节都与该次回合金钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。

2. SubBytes — 透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。

3. ShiftRows — 将矩阵中的每个横列进行循环式移位。

4. MixColumns — 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每行内的四个字节。

最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。

一般的加密通常都是块加密,如果要加密超过块大小的数据,就需要涉及填充和链加密模式,对于快加密而言,主要有4种加密处理模式,如:

1. 电子密码本模式       Electronic Code Book(ECB)

2. 加密块链模式          Cipher Block Chaining(CBC)

3. 加密反馈模式          Cipher Feedback Mode(CFB)

4. 输出反馈模式          Output Feedback Mode(OFB)

有关四种处理模式的介绍可以参见如下的两个文档:

分组对称加密模式:ECB/CBC/CFB/OFBhttp://blog.csdn.net/SearchSun/archive/2008/06/06/2516191.aspx.

对称块加密算法加密模式详解http://dev.csdn.net/article/16/16674.shtm

文件说明

aes.h             头文件,提供给外部调用和包含,openSSL本身通常以库的形式供外部调用;

aes_core.c     aes加密引擎的基础和核心文件,主要实现基于AES的区块加解密和密钥设置;

aes_x86core.c 基于x86架构进行优化的核心文件;

aes_ecb.c         ECB模式加密的实现,将要加密的数据分成固定位元的大小,然后使用密钥对每一个位元进行加密,位元之间没有关联。

aes_cbc.c         CBC模式加密的实现,将要加密的数据分成固定位元的大小并构成一个位元的序列,将前面一个加密块输出的密文与下一个要加密的明文块进行XOR(异或)操作计算,将计算结果再用密钥进行加密得到密文。第一明文块加密的时候,因为前面没有加密的密文,所以需要一个初始化向量(IV);

aes_cfb.c         CFB模式加密的实现;

aes_ofb.c         OFB模式加密的实现;

aes_ctr.c          CTR模式加密的实现;CTR模式是NIST为对称分组密码算法新开发的种操作模式。AES—CTR加密机制对于高速网络,具有许多引人的特性。首先,AES—CTR使用AES分组密码加密连续的计数分组(CTRBLK:Counter Block)生成密钥流。数据在加、解密时,明、密文与密钥流进行异或运算 AES—CTR易于实
现,可以进行流水线和并行处理。多个独立的AES加密实现可以用于提高效率。例如,AES-CTR加密处理可以进行双机并行实现,从而达到双倍效率的吞吐量。AES—CTR支持密钥流的预计算。预计算处理能够减少数据包的延迟性。无论对于加密还是解密,AES CTR仅使用AES的加密操作。这使得AES—CTR相较于AES其它模式实现更为精简。如果AES—CTR得到正确使用,能够提供很强的保密性;

aes_ige.c         IGE模式加密的实现;

asm                  汇编目录下放置着不同架构cpu对aes加密的优化实现。

参考文献:

1. 分组对称加密模式:ECB/CBC/CFB/OFBhttp://blog.csdn.net/SearchSun/archive/2008/06/06/2516191.aspx.

2. 对称块加密算法加密模式详解 http://dev.csdn.net/article/16/16674.shtm

3. http://zh.wikipedia.org/zh-cn/AES

AES的区块长度固定为128 位元,密钥长度则可以是128,192或256位元;AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个元素大小就是明文区块中的一个Byte)。加密时,各轮AES加密循环(除最后一轮外)均包含4个步骤:

1. AddRoundKey — 矩阵中的每一个字节都与该次回合金钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。

2. SubBytes — 透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。

3. ShiftRows — 将矩阵中的每个横列进行循环式移位。

4. MixColumns — 为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每行内的四个字节。

最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。

一般的加密通常都是块加密,如果要加密超过块大小的数据,就需要涉及填充和链加密模式,对于快加密而言,主要有4种加密处理模式,如:

1. 电子密码本模式       Electronic Code Book(ECB)

2. 加密块链模式          Cipher Block Chaining(CBC)

3. 加密反馈模式          Cipher Feedback Mode(CFB)

4. 输出反馈模式          Output Feedback Mode(OFB)

有关四种处理模式的介绍可以参见如下的两个文档:

分组对称加密模式:ECB/CBC/CFB/OFBhttp://blog.csdn.net/SearchSun/archive/2008/06/06/2516191.aspx.

对称块加密算法加密模式详解http://dev.csdn.net/article/16/16674.shtm

文件说明

aes.h             头文件,提供给外部调用和包含,openSSL本身通常以库的形式供外部调用;

aes_core.c     aes加密引擎的基础和核心文件,主要实现基于AES的区块加解密和密钥设置;

aes_x86core.c 基于x86架构进行优化的核心文件;

aes_ecb.c         ECB模式加密的实现,将要加密的数据分成固定位元的大小,然后使用密钥对每一个位元进行加密,位元之间没有关联。

aes_cbc.c         CBC模式加密的实现,将要加密的数据分成固定位元的大小并构成一个位元的序列,将前面一个加密块输出的密文与下一个要加密的明文块进行XOR(异或)操作计算,将计算结果再用密钥进行加密得到密文。第一明文块加密的时候,因为前面没有加密的密文,所以需要一个初始化向量(IV);

aes_cfb.c         CFB模式加密的实现;

aes_ofb.c         OFB模式加密的实现;

aes_ctr.c          CTR模式加密的实现;CTR模式是NIST为对称分组密码算法新开发的种操作模式。AES—CTR加密机制对于高速网络,具有许多引人的特性。首先,AES—CTR使用AES分组密码加密连续的计数分组(CTRBLK:Counter Block)生成密钥流。数据在加、解密时,明、密文与密钥流进行异或运算 AES—CTR易于实
现,可以进行流水线和并行处理。多个独立的AES加密实现可以用于提高效率。例如,AES-CTR加密处理可以进行双机并行实现,从而达到双倍效率的吞吐量。AES—CTR支持密钥流的预计算。预计算处理能够减少数据包的延迟性。无论对于加密还是解密,AES CTR仅使用AES的加密操作。这使得AES—CTR相较于AES其它模式实现更为精简。如果AES—CTR得到正确使用,能够提供很强的保密性;

aes_ige.c         IGE模式加密的实现;

asm                  汇编目录下放置着不同架构cpu对aes加密的优化实现。

参考文献:

1. 分组对称加密模式:ECB/CBC/CFB/OFBhttp://blog.csdn.net/SearchSun/archive/2008/06/06/2516191.aspx.

2. 对称块加密算法加密模式详解 http://dev.csdn.net/article/16/16674.shtm

3. http://zh.wikipedia.org/zh-cn/AES

openSSL AES 加密引擎代码分析相关推荐

  1. C++ Openssl AES GCM 128bits代码示例,可wins10的visual studio 2017 中直接运行

    C++ Openssl AES GCM 128bits代码示例,可wins直接运行 使用vcpkg安装64bits的openssl,本人当前的openssl为openssl-1.1.1d版本,wins ...

  2. 关于“给PHP源代码加密“的代码分析

    /* 时间:2022-1-9  作者:aweii 内容:关于"给PHP源代码加密"的代码分析[原创] */ 网上看到一则"给PHP源代码加密"的代码,饶有兴趣研 ...

  3. aes离线解密工具_如何在Python中解密OpenSSL AES加密文件?

    OpenSSL为AES加密提供了一种流行的(但不安全 - 见下文!)命令行界面: openssl aes-256-cbc -salt -in filename -out filename.enc Py ...

  4. python怎样打开加密的文件_如何在Python中解密OpenSSL AES加密的文件?

    拉莫斯之舞 我将通过一些更正重新发布您的代码(我不想掩盖您的版本).当您的代码正常工作时,它不会检测到填充周围的一些错误.特别是,如果提供的解密密钥不正确,则填充逻辑可能会做一些奇怪的事情.如果您同意 ...

  5. php 前端加密密码,WEB前端对应PHP后端的AES加密解密代码

    研究了一阵子,各种翻阅资料测试,今天终于找到了能跟我PHP后端配合解密加密的JS解决方案.代码如下: AES TEST var data = '{"test": "a&q ...

  6. 回测引擎代码分析流程图

    转载:https://www.vnpy.com/forum/topic/26-hui-ce-yin-qing-dai-ma-fen-xi-liu-cheng-tu

  7. openssl 加密解密 指令_openssl命令aes加密和解密

    openssl命令aes加密和解密 日期:2014-11-12 10:41:25 最后更新日期:2017-07-06 10:00:10 [技术] man openssl查看openssl的功能: [c ...

  8. 【Android工具】DES终结者加密时报——AES加密演算法

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在前面的两篇文章中.我们介绍了DES算法,3DES算法以及他们的Android程序实现,并研究了怎样才干实现 ...

  9. jsencrypt代码分析——openssl的rsa加密解密在js的实现

    在js上做rsa,感觉jsencrypt这个是封装的比较好的,但用起来还是遇到了些坑,所以踩进代码里填填坑- 项目在这里 https://github.com/travist/jsencrypt [r ...

  10. 小X通m3u8视频流AES加密分析

    最近有空研究了下小X通的视频协议,下面记录下研究过程 首先我们要了解下m3u8是什么 m3u8基础 首先我们需要了解什么时HLS,所谓HLS(HTTP Live Streaming)是一个由苹果公司提 ...

最新文章

  1. NeHe教程Qt实现——lesson10
  2. 【转】调试JavaScript 错误的解决方案
  3. html实战例子: 点击图片超链接跳转
  4. webpack 独立打包 css 文件
  5. python操作SQL
  6. 拉斯维加斯算法结合八皇后问题
  7. 正则表达式去除括号的问题
  8. C++primer笔记之顺序容器
  9. 高速PCB设计之“20H ”原则
  10. systrace简介
  11. nrf52832 学习笔记(三)蓝牙从机广播
  12. Buuctf 佛系青年
  13. CC2640R2F之配对绑定与解除绑定篇
  14. STM32,点亮RGB灯,指南者,新手
  15. Memwatch简介
  16. OKhttp3工具类
  17. 大学matlab选择试题和答案,Matlab与信息处理-中国大学mooc-试题题目及答案
  18. 计算机考研难度2017,2017大专生考研难度分析
  19. bzoj 4627 回转寿司(权值线段树)
  20. 常用GIT命令整理 - WIP

热门文章

  1. map和foreach的区别和应用场景_面试官:说说UDP和TCP的区别及应用场景
  2. 16位灰度数据成像_DICOM Pixel Data核心图像信息数据介绍
  3. sql between的用法的意思_SQL 语法手册来啦,你想要的这里都有!
  4. 学一门计算机语言大体的过程,学习一门新编程语言的6个步骤
  5. matlab执行m文件语句,matlab 编写m文件函数
  6. java cucumber_Cucumber框架入门篇
  7. mysql中文占两位_mysql 保留两位小数
  8. mysql死锁案例及解决方案_MySQL死锁案例分析与解决方案
  9. PHP正则提取超链接地址及标题,PHP正则表达式提取超链接及其标题
  10. Understanding COM Apartments