密码 | 对称加密 - AES
一、AES 算法简介
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,用来替换原先的 DES.
背景介绍:1997年1月2号,美国国家标准技术研究所(National Institute of Standards and Technology: NIST)宣布希望征集高级加密标准(Advanced Encryption Standard: AES),用以取代DES。AES得到了全世界很多密码工作者的响应,先后有很多人提交了自己设计的算法。最终有5个候选算法进入最后一轮:Rijndael,Serpent,Twofish,RC6和MARS。最终经过安全性分析、软硬件性能评估等严格的步骤,Rijndael算法获胜。
AES 算法的区块长度固定为128位(16 字节),密钥长度则可为128位,192位,256位。加密模式可采用 ECB,CBC,CTR,OFB,CFB 等模式进行加密。
其中 ECB 与 CBC 模式是对数据原文做加密处理,原文长度的必须为 16 或 16 的倍数方可加密成功,不足16倍数的部分则需进行 Padding 处理(Padding 方式为 PKCS5 Padding 或 PKCS7 Padding)。
CTR,OFB,CFB 模式则是对待加密数据的 IV 做加密处理,原文长度不需为 16 或 16 的倍数,原文长度与密文长度相等。
AES 属于对称加密即加密密钥与解密密钥是相同的,加密速度快。
二、AES 加密原理
AES 是分组密码技术,将明文进行分组加密,每组为固定128位(16字节)区块长度,不足 128 位的部分需采用补位方式,将其补全成为 128 位数据后进行加密。AES密钥区块长度可为 128位,192位,256位区块长度,加密过程中采用 Rijndael 提出的特定的密钥生成方案。
\[
\begin{array}{c|ccccc}{AES} & {密钥长度} & {加密轮数} \\ \hline 128 & {16字节} & {10轮} \\ {192} & {24字节} & {12轮}\\ {256} & {32字节} & {14轮} \end{array}
\]
加解密步骤:
AES 加密分为 4步。
- SubBytes(),ShiftRows(),MixColumns(),AddRoundKey()。
AES 解密分为 4步。 - 逆向 MixColumn 子层, 逆向 ShiftRow 子层, 逆向 SubBytes 层,逆向 AddRoundKey()。

SubBytes()
字节替换,AES 定义了一个 16(0~F) * 16(0~F) 字节的 S 盒(S-Box),将输入的数据 16 byte(4 * 4) 按照 S 盒的内容进行依次替换。例如数据为0x31,则需找到 S-Box 中横坐标为 3 纵坐标为 1 的值,进行替换操作。
\[
\begin{array}{c|ccccc}{\times} & {0} & {1} & {…} & {e} & {f} \\ \hline 0 & {x} & {x} & {x} & {x} & {x} \\ {1} & {x} & {x} & {x} & {x} & {x} \\ {…} & {x} & {x} & {x} & {x} & {x} \\ {e} & {x} & {x} & {x} & {x} & {x} \\ {f} & {x} & {x} & {x} & {x} & {x}\end{array}
\]
ShiftRows()
ShiftRows 行位移变换是状态数组的第一行保持不变,第二行循环左移一个字节,第三行循环左移两个字节,第四行循环左移三个字节。行移位变换的目的就是增加 AES 的扩展属性。
\[
\left(\begin{array}{llll}{B_{0}} & {B_{4}} & {B_{8}} & {B_{12}} \\ {B_{1}} & {B_{5}} & {B_{9}} & {B_{13}} \\ {B_{2}} & {B_{6}} & {B_{10}} & {B_{14}} \\ {B_{3}} & {B_{7}} & {B_{11}} & {B_{15}}\end{array}\right)
\]
经过 ShiftRows 操作结果为:
\[
\left(\begin{array}{llll}{B_{0}} & {B_{4}} & {B_{8}} & {B_{12}} \\ {B_{5}} & {B_{9}} & {B_{13}} & {B_{1}} \\ {B_{10}} & {B_{14}} & {B_{2}} & {B_{6}} \\ {B_{15}} & {B_{3}} & {B_{7}} & {B_{11}}\end{array}\right)
\]
MixColumns()
MixColumns 列混淆变换是一个线性变换,混淆了状态矩阵的每一列。列混淆变换中,每输入的一个字节均影响了 4 个输出字节,MixColumn 操作是 AES 中的主要扩散元素。ShiftRows() 和 MixColumns() 组合操作使得三轮以后,状态矩阵的每个字节都依赖于所有 16 个明文字节成为可能。
\[
\left(\begin{array}{l}{C_{0}} \\ {C_{1}} \\ {C_{2}} \\ {C_{3}}\end{array}\right)=\left(\begin{array}{llll}{02} & {03} & {01} & {01} \\ {01} & {02} & {03} & {01} \\ {01} & {01} & {02} & {03} \\ {03} & {01} & {01} & {02}\end{array}\right)\left(\begin{array}{l}{B_{0}} \\ {B_{5}} \\ {B_{10}} \\ {B_{15}}\end{array}\right)
\]
同理输出字节(C4,C5,C6,C7)的第二列是通过四个输入字节(B4,B9,B14,B3)与同一个常数矩阵相乘得到的,依此类推。计算法则按照伽罗瓦域内加减乘逆进行计算。
AddRoundKey()
密钥加法层是将 16 字节的当前状态矩阵和 16 字节的子密钥通过按位 XOR 操作结合在一起的。
\[
\left(\begin{array}{llll}{A_{0}} & {A_{4}} & {A_{8}} & {A_{12}} \\ {A_{1}} & {A_{5}} & {A_{9}} & {A_{13}} \\ {A_{2}} & {A_{6}} & {A_{10}} & {A_{14}} \\ {A_{3}} & {A_{7}} & {A_{11}} & {A_{15}}\end{array}\right)\left(\begin{array}{llll}{K_{0}} & {K_{4}} & {K_{8}} & {K_{12}} \\ {K_{1}} & {K_{5}} & {K_{9}} & {K_{13}} \\ {K_{2}} & {K_{6}} & {K_{10}} & {K_{14}} \\ {K_{3}} & {K_{7}} & {K_{11}} & {K_{15}}\end{array}\right) = \left(\begin{array}{llll}{A_{0} \wedge K_{0}} & {A_{4} \wedge K_{4}} & {A_{8} \wedge K_{8}} & {A_{12} \wedge K_{12}} \\ {A_{1} \wedge K_{1}} & {A_{5} \wedge K_{5}} & {A_{9} \wedge K_{9}} & {A_{13} \wedge K_{13}} \\ {A_{2} \wedge K_{2}} & {A_{6} \wedge K_{6}} & {A_{10} \wedge K_{10}} & {A_{14} \wedge K_{14}} \\ {A_{3} \wedge K_{3}} & {A_{7} \wedge K_{7}} & {A_{11} \wedge K_{11}} & {A_{15} \wedge K_{15}}\end{array}\right)
\]
三、AES 模式说明
分组密码算法(DES,AES,SM4等)只能加密固定长度的分组,当待加密明文数据长度都超过分组密码长度时,就需要对分组密码算法进行迭代,将明文数据进行加密,迭代的方法称为分组密码的模式。
ECB 模式
ECB 模式全称为电子密码本模式,ECB 模式中,将明文分组加密之后的结果直接拼接成密文分组。
ECB 模式中相同的明文分组会被转换成为相同的密文分组。
计算支持并行计算(加密,解密)。
ECB 模式存在非常大的风险,攻击者不需要破译密码就可以操作明文。
分组1:卡号A
分组2:金额1
分组3:卡号B
交易信息为卡号A 向卡号B 转账 金额1,攻击者将分组信息对调成 卡号B 向卡号A 转账 金额1,攻击者无需解析密文,就能更改交易信息,显然是存在风险的。

CBC 模式
CBC 模式全称为密码分组链接模式,CBC 模式中加密过程引入初始化向量 IV,第一包数据与初始化向量 IV 做异或操作后进行加密,接下来将明文分组与前一个密文分组进行 异或操作后在进行加密。
计算支持并行计算(仅解密)。

CFB 模式
CFB 模式为密文反馈模式,在 CFB 模式中,明文分组并没有直接进行加密,第一包数据将初始化向量加密,密文值与明文分组进行异或操作,接下来依次将每次异或得到的结果进行加密得到数据密文。
计算支持并行计算(仅解密),可以解密任意分组。

OFB 模式
OFB 模式为输出反馈模式,OFB 模式中,密码算法的输出会反馈到密码算法的输入中。OFB 模式中,XOR 所需要的比特序列可以事先通过密码算法生成,和明文分组无关。只要提前准备好所需的密钥流,则在实际从明文生成密文的过程中,就不需要动态密码算法了。
计算不支持并行计算(加密,解密)。

CTR 模式
CTR 模式为计数器模式,CTR 模式是一种通过将逐次累加的计数器进行加密来生成密钥流的流密码。CTR 模式中,每个分组对应一个逐次累加的计数器,并通过对计数器进行加密来生成密钥流。最终的密文分组是通过将计数器加密得到的比特序列,与明文分组进行异或得到。CTR 模式可以以任意顺序对分组进行加解密,在加解密时需要用到的 “计数器” 的值可以由分组序号直接计算出来,可以实现并行计算,支持并行计算的系统中,CTR 模式的速度非常快。CFB,OFB 模式均推荐使用 CTR 模式代替。
支持并行计算(加密,解密)。

四、参考
参考链接:
https://en.wikipedia.org/wiki/Advanced_Encryption_Standard
http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf
http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf
https://bbs.pediy.com/thread-253884.htm
参考书籍:
《深入浅出密码学》
《图解密码技术》
参考代码:
LGPL-AES:https://tls.mbed.org/source-code
密码 | 对称加密 - AES的更多相关文章
- iOS CommonCrypto 对称加密 AES ecb,cbc
CommonCrypto 为苹果提供的系统加密接口,支持iOS 和 mac 开发: 不仅限于AES加密,提供的接口还支持其他DES,3DES,RC4,BLOWFISH等算法, 本文章主要讨论AES在i ...
- 对称加密----AES和DES加密、解密
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.get ...
- PHP对称加密-AES加密、DES加密
对称加密 对称加密算法是指,数据发信方将明文(原始数据)和密钥一起经过加密处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若要解读原文,则需要使用加密密钥及相关算法的逆算法对密文进行解密,使 ...
- 对称加密-AES
假设有一个发送方在向接收方发送消息.如果没有任何加密算法,接收方发送的是一个明文消息:“我是小灰”. 如果消息被中间人截获到,即使中间人无法篡改消息,也可以窥探到消息的内容,从而暴露了通信双方的私密. ...
- 对称加密AES
static void Main(string[] args) { //string str = "rqiJI7eEICT+YZmScpAdbjzLnA4mgL3uU5uHXLBeaE6s8 ...
- [Node.js] 对称加密、公钥加密和RSA
原文地址:http://www.moye.me/2015/06/14/cryptography_rsa/ 引子 对于加解密,我一直处于一种知其然不知其所以然的状态,项目核心部分并不倚重加解密算法时,可 ...
- 加密算法--->对称加密与非对称加密算举例说明
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA 对称加密例子:des对称加密 des对称加密,对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用 ...
- 对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)
一. AES对称加密: AES加密 分组 二. 分组密码的填充 分组密码的填充 e.g.: PKCS#5填充方式 三. 流密码: 四. 分组密码加密中的四种模式: 3.1 ECB模式 优点: 1. ...
- AES —— JAVA中对称加密和解密
package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...
随机推荐
- 【t065】最敏捷的机器人
Time Limit: 1 second Memory Limit: 128 MB [问题描述] [背景] Wind设计了很多机器人.但是它们都认为自己是最强的,于是,一场比赛开始了~ [问题描述] ...
- npm镜像及配置方法
npm全称Node Package Manager,是node.js的模块依赖管理工具.由于npm的源在国外,所以国内用户使用起来各种不方便.下面整理出了一部分国内优秀的npm镜像资源,国内用户可以选 ...
- [转]cron表达式的用法
cron表达式通过特定的规则指定时间,用于定时任务,本文简单记录它的部分语法和实例,并不完全,能覆盖日常大部分需求. 1. 整体结构 cron表达式是一个字符串,分为6或7个域,每两个域之间用空格分隔 ...
- CodeForces 1216C(假的计算几何+扫描线)
传送门 •题意 给你三个矩形,依次编号为 1,2,3: 判断 矩形1 是否被 矩形2 和 矩形3 完全覆盖: 如果没有完全覆盖,输出 "YES",反之,输出 "NO&qu ...
- 深度学习——CNN
整理自: https://blog.csdn.net/woaidapaopao/article/details/77806273?locationnum=9&fps=1 思想 filter尺寸 ...
- linux 禁止所有中断
如果你需要禁止所有中断如何? 在 2.6 内核, 可能关闭在当前处理器上所有中断处理, 使用任一个下面 2 个函数(定义在 <asm/system.h>): void local_irq_ ...
- H3C查看历史命令--用户以上
[H3Cwang]display history-command sys sysname H3C sysname H3Cwang display history-command q ...
- 理解Servlet
题记:框架横行,似乎已经忘记JavaWeb最基础Servlet是如何工作的,这也是为什么要写这篇文章. Servlet是Java语言应用到Web的扩展技术,是运行在Web应用服务器上的Java程序.与 ...
- vue-learning:22 - js - directives
directives 在讲解视图层指令时,我们讲到ref特性,使用它我们可以获取当前DOM元素对象,以便执行相关操作. <div id="app"> <input ...
- js实现new
function New(fn,...args){ let obj={} obj.__proto__=fn.prototype let result=fn.apply(obj,args) if(typ ...