密码 | 对称加密 - 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 ...
随机推荐
- 洛谷P4136 谁能赢呢? 题解 博弈论
题目链接:https://www.luogu.org/problem/P4136 找规律 首先这道题目我没有什么思路,所以一开始想到的是通过搜索来枚举 \(n\) 比较小的时候的情况. 所以我开搜索枚 ...
- Codeforces Round #188 (Div. 1 + Div. 2)
A. Even Odds 奇数个数\(\lfloor \frac{n+1}{2}\rfloor\) B. Strings of Power 从位置0开始,统计heavy个数,若当前为metal,则可以 ...
- pycharm下的多个python版本共存(二)
上一篇博文介绍了在windows下同时安装python2和python3.而在工作的过程中,我习惯于用pycharm作为IDE.本文将记录如何在pycharm中选择python版本,并给相应的版本安装 ...
- laravel 常用文档
[ Laravel 5.6 文档 ] 快速入门 —— 目录结构 laravel学院 http://laravelacademy.org/post/8657.html Laravel 的缓存系统 ...
- Java中的断言assert的用法
Java陷阱之assert关键字 一.概述 在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多. 二.语法 在Java中,ass ...
- H3C STP可选配置
- JS(JavaScript)的j进一步了解9(更新中···)
1.动画 (1) Css样式提供了运动 过渡的属性transition 从一种情况到另一种情况叫过渡 Transition:attr time linear delay: Attr 是变化的属 ...
- CF1088F Ehab and a weird weight formula
CF1088F Ehab and a weird weight formula 推性质猜结论题 第一步转化,考虑把点的贡献加到边里: $con=\sum (log_2(dis(a_u,a_b))\ti ...
- vagrant在windows下的安装和配置(一)
记录一下安装和配置过程中的一些坑步骤一分别下载vagrant和VirtualBox,我这里下载的是vagrant_1.9.1.msi 和 VirtualBox-5.1.14-112924-Win.ex ...
- HDU1172猜数字 [模拟]
1.题意 任务是猜一个四位数,每次尝试后会给出这次猜中了几个数字和猜中了几个位置,求能否根据尝试的记录给出答案 2.分析 数据给出查询次数和每次查询的数及其有几个数和几个位置符合,值得注意的是,猜对的 ...