AES算法简介

一、 AES的结构

1、总体结构

明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位)。根据密钥的长度,算法被称为AES-128,AES-192或者AE-256。

2、明文密钥组织方式

3、一些相关的的术语定义和表示

状态(State):密码运算的中间结果称为状态。

State的表示:状态用以字节为基本构成元素的矩阵阵列来表示,该阵列有4行,列数记为Nb。 Nb=分组长度(bits)÷ 32。Nb可以取的值为4,对应的分组长度为128bits。

密码密钥(Cipher Key)的表示: Cipher Key类似地用一个4行的矩阵阵列来表示,列数记为Nk。Nk=密钥长度(bits)÷32。Nk可以取的值为4,6,8,对应的密钥长度为128, 192, 256 bits。

4、详细过程

由四个不同的变换组成,包括一个置换和三个替代:

字节代替(SubBytes): 用一个S盒完成分组的字节到字节的代替。

行移位(ShiftRows):一个简单的置换。

列混淆(MixColumns):利用域GF(28)上的算术特性的一个代替。

轮密钥加(AddRoundKey):当前分组和扩展密钥的一部分进行按位XOR(异或)。

输入的密钥被扩展成由44个32位子所组成的数组w[i],由上图可知,每轮有四个不同的字(128位)作为该轮到密钥。

对加密和解密的操作,算法由轮密钥加开始,接着执行9轮迭代运算,每轮都包含所有4个阶段的代替,接着是第10轮的三个阶段。

仅仅在轮密钥加阶段使用密钥。由于这个原因,该算法以轮密钥加开始,以轮密钥加结束。

二、AES的变换函数

1、字节替代

正向和逆向变换。被称为字节代替的正向字节代替变换是一个简单的查表操作。

映射方式:把该字节的高4位作为行值,低4位作为列值,以这些行列值作为索引从S盒中对应位置取出元素作为输出。例如,十六进制数{95}所对应的S盒的行值是9,列值是5,S盒中在此位置的值是{2A},相应的{95}被映射为{2A}。

下面是一个字节代替的例子:

2、行移位

正向和逆向变换。正向行移位,state的第一行保持不变。把state的第二行循环左移一个字节,state的第三行循环左移两个字节,state的第四行循环左移三个字节。

行移位变换的例子:

逆向行移位将state中的后三行执行相反方向的移位操作,如第二行向右循环移位一个字节,其他类似操作。

3、列混淆

正向和逆向变换。

列混淆变换的正向列混淆变换对每列独立地进行操作。每列中的每个字节被映射为一个新值,此值由该列中的4个字节通过函数变换得到。

列混淆例子:

计算过程:

47 = (02•87)⊕(03•6E)⊕(01•4A)⊕(01•A6)

其中:

02•87 = 02•10000111B = 00001110B⊕00011011B = 00010101B = 15

03•6E = (01⊕02)•6E = (01•6E)⊕(02•6E)

= 01101110B⊕(11011100B) = 10110010B = B2

01•46 = 46

01•A6 = A6

15⊕B2⊕46⊕A6 = 47

注意: G(28)上的运算

加法:按位异或

乘法:可通过对多个中间结果的移位运算和异或一个特定的比特串(比如00011011)实现。(与最高位b7有关)

逆向列混淆变换可以再乘以矩阵的逆得到

4、轮密钥加

正向和逆向变换。

在轮密钥加中,128位的state按位与128位的轮密钥XOR。

逆向轮密钥加变换是和正向轮密钥加变换一样的,因为异或操作是其本身的逆。

A⊕B⊕B = A

单轮AES输入:

5、用伪代码表示的Rijndael加密算法

Rijndael ( State, CipherKey )

{

KeyExpansion ( CipherKey, ExpandedKey );

AddRoundKey ( State, ExpandedKey );

For ( i=1; i<Rnd; i++ )

Round ( State, ExpandedKey + Nb*i );

FinalRound ( State, ExpandedKey + Nb*Rnd );

}

三、密钥扩展

密钥扩展伪代码描述

KeyExpansion ( byte, Key[16],word w[44] )

{

word temp;

for (i = 0;i < 4; i++)

w[i] = (key[4*i],key[4*i+1], key[4*i+2], key[4*i+3]);

for (i = 4;i < 44; i++)

{   temp = w[i - 1];

if (i mod 4 = 0) temp = SubWord(RotWord(temp)) + Rcon[i/4];

w[i] = w[i-4] + temp;

}

}

输入密钥直接被复制到扩展密钥数组的前四个字节。然后每次用四个字节填充扩展密钥数组余下的部分。在扩展密钥数组中,每一个新增的字w[i]的值依赖于w[i-1] w[i-4]。

四、等价的解密算法

交换逆向行移位和逆向字节代替

逆向移行[逆向字节代替(Si)] = 逆向字节代替[逆向移行 (Si)]

交换轮密钥加和逆向列混淆

逆向列混淆(Siwj) = [逆向列混淆(Si)] ⊕[逆向列混淆(wj)]

五、参考文献

[1] William Stallings著;王张宜等译. 密码编码学与网络安全——原理与实践(第五版)[M]. 北京:电子工业出版社,2012.1.

[2]密码算法详解——AES

[3]AES加密算法动画演示

AES算法简介的更多相关文章

  1. webrtc 的回声抵消(aec、aecm)算法简介(转)

    webrtc 的回声抵消(aec.aecm)算法简介        webrtc 的回声抵消(aec.aecm)算法主要包括以下几个重要模块:1.回声时延估计 2.NLMS(归一化最小均方自适应算法) ...

  2. 使用python进行加密解密AES算法

    使用python进行加密解密AES算法-代码分享-PYTHON开发者社区-pythoner.org 使用python进行加密解密AES算法 TY 发布于 2011-09-26 21:36:53,分类: ...

  3. C#与Java互通AES算法加密解密

    /// <summary>AES加密</summary> /// <param name="text">明文</param> /// ...

  4. AES算法,DES算法,RSA算法JAVA实现

    1     AES算法 1.1    算法描述 1.1.1      设计思想 Rijndael密码的设计力求满足以下3条标准: ① 抵抗所有已知的攻击. ② 在多个平台上速度快,编码紧凑. ③ 设计 ...

  5. 排列熵算法简介及c#实现

    一.   排列熵算法简介: 排列熵算法(Permutation Entroy)为度量时间序列复杂性的一种方法,算法描述如下: 设一维时间序列: 采用相空间重构延迟坐标法对X中任一元素x(i)进行相空间 ...

  6. <算法图解>读书笔记:第1章 算法简介

    阅读书籍:[美]Aditya Bhargava◎著 袁国忠◎译.人民邮电出版社.<算法图解> 第1章 算法简介 1.2 二分查找 一般而言,对于包含n个元素的列表,用二分查找最多需要\(l ...

  7. LARS 最小角回归算法简介

    最近开始看Elements of Statistical Learning, 今天的内容是线性模型(第三章..这本书东西非常多,不知道何年何月才能读完了),主要是在看变量选择.感觉变量选择这一块领域非 ...

  8. AI - 机器学习常见算法简介(Common Algorithms)

    机器学习常见算法简介 - 原文链接:http://usblogs.pwc.com/emerging-technology/machine-learning-methods-infographic/ 应 ...

  9. ORACLE 字段AES算法加密、解密

    ORACLE 字段AES算法加密.解密(解决中文乱码问题)2014年02月12日 17:13:37 华智互联 阅读数:97971.加解密函数入口 CREATE OR REPLACE FUNCTION ...

随机推荐

  1. python课程第一天作业1-模拟登录

    第一周作业: 作业1:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 流程图: 代码:后来修改过一次: #!/usr/bin/env python # -*-conding:ut ...

  2. CentOS yum Fatal Error 处理一例

    环境说明 [root@thatsit ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@thatsit ~]# uname - ...

  3. C++ Primer 5th 第4章 表达式

    表达式是运算对象及运算符组成的式子,表达式求值将得到一个结果,单独的变量或者字面值也算表达式,结果是其本身. 运算符分为:一元运算符.二元运算符.三元运算符.一元即一个作用对象,二元两个作用对象,以此 ...

  4. 对于js原型和原型链继承的简单理解(第二种,对象冒充)

    关键代码    this.parent = Cat;    this.parent.apply(this); function Cat(){ this.climb = function(){ aler ...

  5. jquery1.9学习笔记 之层级选择器(二)

    子孙选择器(“祖先 子孙”) 描述:选择所有给出祖先选择器的子孙选择器. 例子: 用蓝色虚线边框标记所有表单子孙元素的输入.表单里的输入框用黄色背景. <!doctype html>< ...

  6. pubwin数据云备份

    由于pubwin自带的异地备份一直不好用,并且pubwin自带的37分钟备份也不方便手动备份,考虑用python 与写一个基于酷盘的pubwin数据备份工具(本来想基于百度云的,发现百度云用的人太多, ...

  7. MySQL数据库中日期中包涵零值的问题

    默认情况下MySQL是可以接受在日期中插入0值,对于现实来说日期中的0值又没有什么意义.调整MySQL的sql_mode变量就能达到目的. set @@global.sql_mode='STRICT_ ...

  8. IOS 如何选择delegate、notification、KVO?

    IOS 如何选择delegate.notification.KVO? 博客分类: IOS   前面分别讲了delegate.notification和KVO的实现原理,以及实际使用步骤,我们心中不禁有 ...

  9. Map的三种遍历

    import java.util.*;/*** Map的三种遍历方式* @author Administrator**/public class m {public static void main( ...

  10. android特效

    http://houxiyang.com/archives/89/ http://blog.csdn.net/hjj0212/article/details/8535817 http://www.li ...