在上一篇简单复习了AES的历史时间节点、产生背景、与DES的对比、算法框图(粗略)以及一些数学基础,如果不记得的话点击这里回顾。下面将介绍AES算法的细节。

下面给出AES算法的流程,图片来源:密码算法详解——AES

通过上图可以知道,AES的加密算法主要可以概括为:

① 一个初始轮密钥加变换

② Nr-1轮的标准轮变换

③ 最后一轮的非标准轮变换

注意:

① 第一步和最后一步都用了轮密钥加,因为没有密钥参与的变换都是容易被攻破的。

② DES的IP和IP-1没有密钥的参与。

8.1 轮变换 —— 加密轮函数

下面用伪代码的形式对其过程进行介绍。在AES中,除最后一轮外,其它轮次都是运行标准轮函数,最后一轮运行非标准轮函数。

① 标准轮变换

1 Round(State,RoundKey)
2 {
3 ByteSub(State); // S盒变换
4 ShiftRow(State); // 行移位变换
5 MixColumn(State); // 列混合变换
6 AddRoundKey(State,RoundKey); // 轮密钥加变换
7 }

② 最后一轮,非标准轮函数

1 FinalRound(State,RoundKey)
2 {
3 ByteSub(State); // S盒变换
4 ShiftRow(State); // 行移位变换
5 AddRoundKey(State,RoundKey); // 轮密钥加变换
6 }

通过代码可以发现:最后一轮是没有列混合的

8.1.1 S盒变换 ByteSub(State)

① S盒变换是AES的唯一非线性变换,是AES安全的关键。

② AES使用16个相同的S盒,DES使用的是8个不同的S盒。

③ AES的S盒有8位输入,8位输出,是一种非线性置换;DES的S盒有6位输入,4位输出,是一种非线性压缩

S盒变换可分为2步:(1)求逆;(2)代入公式计算

(1)第一步:

把输入字节用其GF(28)的逆来代替;

把输入字节看成GF(28)上的元素;

求出其在GF(28)上的逆元素;

用该逆元素代替原输入字节。

(2)第二步:

对上面的结果做如下仿射变换:

注意:

  • S盒变换的第一步是把字节的值用它的乘法逆来代替,是一种非线性变换
  • 第二步是仿射运算,是线性变换
  • 由于系数矩阵中每列都有5个1,说明改变输入任意一位,输出中5位发生变化。
  • 由于系数矩阵中每行都有5个1,说明输出的每一位都与输入的5位相关。

8.1.2 行移位变换 ShiftRow(State)

① 行移位变换对状态的行进行循环移位;

② 第0行不移位,第1行移C1字节,第2行移C2字节,第3行移C3字节。

Nb C1 C2 C3
4 1 2 3
6 1 2 3

③ 行移位属于置换,属于线性变换。本质在于把数据打乱重排,其扩散作用

8.1.3 列混合变换 MixColumn(State)

① 列混合变换把状态的列视为GF(28)上的多项式a(x)乘以一个固定的多项式c(x),并模x4+1.

b(x) = a(x)c(x)  mod x4+1

其中,c(x)= 03x3+01x2+01x+02.

② 列混合变换属于线性变换,起扩散作用

③ c(x)与x4+1互素,从而保证c(x)存在逆多项式d(x),而c(x)d(x)=1 mod x4+1,只有逆多项式存在,才能进行解密。

写成矩阵的形式:

8.1.4 轮密钥加变换 AddRoundKey(State,RoundKey)

① 把轮密钥与状态进行模2相加

② 轮密钥根据密钥产生算法产生

③ 轮密钥长度等于数据块长度

8.2 轮密钥的产生

① 加密迭代中每一轮需要一个轮密钥参与加密

② 轮密钥根据密钥产生算法通过用户密钥得到

③ 密钥产生分两步进行:

(1)密钥扩展

(2)轮密钥选择

④ 密钥扩展将用户密钥扩展为一个扩展密钥

⑤ 密钥选择从扩展密钥中选出轮密钥

密钥扩展的原理图如下图所示,图片来源:密码算法详解——AES

8.2.1 密钥扩展

① 密钥扩展产生扩展密钥。

② 用一个字元素的一维数组W[Nb*(Nr+1)]表示扩展密钥。

③ 用户密钥放在该数组最开始的Nk个字中。

④ 其它的字由它前面的字经过处理后得到。

⑤ 分Nk≤6Nk>6两种密钥扩展算法。

(1)Nk ≤ 6的密钥扩展

① 最前面的Nk个字是由用户密钥填充的

② 之后的每一个字W[j]等于前面的字W[j-1]与Nk个位置之前的字W[j-Nk]的异或

③ 而且对于Nk的整数倍的位置处的字,在异或之前,对W[j-1]进行Rotl变换和ByteSub变换,之后再异或一个常数Rcon.

当j不是Nk的整数倍:Wj=Wj-Nk⊕Wj-1

当j是Nk的整数倍:Wj=Wj-Nk⊕ByteSub(Rotl(Wj-1)⊕Rcon[j/Nk]

说明:

  • Rotl是一个字里的字节循环左移函数:

设 W=(A,B,C,D) 则 Rotl(W)=(B,C,D,A)

  • 轮常数Rcon与Nk无关,且定义为:

Rcon[i] = (RC[i],'00','00','00')

RC[0] = '01'

RC[i] = xtime(RC[i-1])

(2)Nk > 6的密钥扩展

说明:

Nk>6的密钥扩展 与 Nk≤6的密钥扩展 基本相同,不同之处在于:如果j被Nk除的余数=4,则在异或之前,对W[j-1]进行ByteSub变换。

增加ByteSub变换是因为当Nk>6时密钥很长,仅仅对Nk的整数倍的位置处的字进行ByteSub变换,就显得ByteSub变换的密度比较稀,安全程度不够强。

8.2.2 轮密钥的选择

根据分组大小,依次从扩展密钥中取出轮密钥。

前面的Nb个字作为轮密钥0,接下来的Nb个字作为轮密钥1...

8.3 AES的基本逆变换

AES的加密算法不是对合运算,所以解密算法和加密算法不同。

AES的巧妙之处:虽然解密算法和加密算法不同,但解密算法与加密算法的结构相同

把加密算法的基本变换换成逆变换,便得到解密算法。

AES的基本变换都是可逆的

① 轮密钥加的逆就是其本身:(AddRoundKey)-1 = AddRoundKey

② 行移位变换的逆就是状态的后三行分别移位Nb-C1、Nb-C2、Nb-C3个字节。

③ 列混合的逆

状态的每列都乘以c(x)的逆多项式d(x):

d(x) = (c(x))-1  mod x4+1

c(x) = 03x3+01x2+01x+02

d(x) = 0Bx3+0Dx2+09x+0E

④ S盒变换的逆

第一步:首先进行逆仿射变换

第二步:再把每个字节用其在GF(28)上的来代替。

(1)把输入字节看成GF(28)上的元素

(2)求出其在GF(28)上的逆元素

(3)用该逆元素代替原输入字节

注:S盒的逆仿射变换:

⑤ 解密的密钥扩展

解密的密钥扩展与加密的密钥扩展不同,解密的密钥扩展定义如下:

(1) 加密算法的密钥扩展

(2) 把InvMixColumn(逆列混合)应用到除第一和最后一轮外的所有轮密钥上。

⑥ 逆轮变换

(1) 标准拟轮变换

1  Inv_Round(State,RoundKey)
2 {
3 Inv_ByteSub(State); // S盒变换的逆
4 Inv_ShiftRow(State); // 逆行移位变换
5 Inv_MixColumn(State); // 逆列混合变换
6 AddRoundKey(State,RoundKey); // 轮密钥加变换
7 }

(2) 最后一轮,非标准逆轮函数

1  Inv_FinalRound(State,RoundKey)
2 {
3 Inv_ByteSub(State); // S盒变换的逆
4 Inv_ShiftRow(State); // 逆行移位变换
5 AddRoundKey(State,RoundKey); // 轮密钥加变换
6 }

8.4 AES的实现

实现方法:软件、硬件

软件方法:

① 基于算法的描述 —— 效率不够高

② 基于查表 —— 时空折换,提高效率

基于查表:

① S盒,本质上是8进8出,但要S盒和逆S盒2个表。

② 列混合变换

GF(28)的非零元素构成循环群,可通过加法和查表实现乘法。逆列混合同理。

8.5 AES的安全性

能够抵抗目前所有的已知攻击。①穷举攻击 ②差分攻击 ③线性攻击 ④Square攻击 ⑤侧信道攻击

目前已有低于穷举复杂度的攻击方法,但都还不能对AES构成本质的威胁。

8.6 AES的体现

AES体现了香农的密码设计理论。

体现了公开设计的原则。

实践是检验AES密码安全性的唯一标准。

8.7 AES的优点

① 运算速度快

② 对内存的需求非常低,适合于受限环境

③ 分组长度和密钥长度设计灵活

④ AES的密钥长度比DES的密钥长度要长,用穷举法破译较难

⑤ 很好的抵抗差分密码分析和线性密码分析的能力

分组密码(五)AES算法② — 密码学复习(八)的更多相关文章

  1. 分组密码(四)AES算法① — 密码学复习(七)

    介绍完S-PN型结构之后,下面介绍AES算法.由于内容比较多所以将其分为两篇来介绍,本篇主要讲AES的历史时间节点.产生背景.与DES的对比.算法框图(粗略)以及一些数学基础. 7.1 AES的历史时 ...

  2. 分组密码(三)DES 算法— 密码学复习(六)

    在介绍完Feistel结构之后,接下来进入到著名的DES算法. 6.1 DES算法的意义 在正式介绍DES之前,首先介绍几个重要的历史时间节点. ① 1973年,美国国家标准局(NBS)向社会公开征集 ...

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

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

  4. AES算法简介

    AES算法简介 一. AES的结构 1.总体结构 明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位).根据密钥的长度,算法被称为AES-128,AES ...

  5. #微码分享#AES算法的C++包装类

    AES为Advanced Encryption Standard的缩写,中文名:高级加密标准,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,用来替代DES.基于std:: ...

  6. Delphi与JAVA互加解密AES算法

    搞了半天终于把这个对应的参数搞上了,话不多说,先干上代码: package com.bss.util; import java.io.UnsupportedEncodingException; imp ...

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

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

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

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

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

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

随机推荐

  1. 使用filter过滤GZIP压缩(二)

    在代码之前,讲一下用filter实现GZIP压缩的原理: 因为GZIP压缩之后,是从服务器端传输到浏览器端,从servlet到浏览器(从jsp到浏览器),其实是response带回内容,所以我们要在f ...

  2. 解决servlet中get方式中中文乱码问题(二):装饰者模式使用

    注意,这里是针对Tomcat容器中get方式提交的servlet中获得参数,参数中有中文的时候乱码的问题: 之前我已经讲过,Tomcat8.0及以上URIEncoding都是utf-8的默认编码,不会 ...

  3. 测试Kaggle kernel commit 是否会删除以前的output

    在kaggle上创建kernel,加入如下代码. 连续运行两次,可以看到保存的文件名字不一样,且无论运行错少次,都只有一个输出文件. 这说明,kaggle上的kernel每次commit运行,都会清空 ...

  4. 2021年哪个低代码平台更值得关注?T媒体盘点国内主流低代码厂商

    2020年圣诞前夜,国内知名创投科技媒体T媒体旗下的T研究发布了2020中国低代码平台指数测评报告.报告除了对国内低代码行业现状进行总结外,还对主流低代码厂商的市场渗透和曝光进行测评. 报告认为,低代 ...

  5. grpc基础

    RPC 框架原理 RPC 框架的目标就是让远程服务调用更加简单.透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP).序列化方式(XML/Json/ 二进制)和通信细节.服务调用者可以像调 ...

  6. 20210804 noip30

    考场 第一眼感觉 T1 是状压 DP,弃了.T2 好像也是 DP???看上去 T3 比较可做. 倒序开题.T3 暴力是 \(O(pn\log p)\)(枚举 \(x\),二分答案,看能否分成合法的不超 ...

  7. Java并发知识总结,超详细!

    首先给大家分享一个github仓库,上面放了200多本经典的计算机书籍,包括C语言.C++.Java.Python.前端.数据库.操作系统.计算机网络.数据结构和算法.机器学习.编程人生等,可以sta ...

  8. php图片处理库

    <?php namespace app\common\library; /** * include 'imagick.class.php'; $image = new lib_image_ima ...

  9. idea鼠标双击.log日志文件无法打开

    发现只要再mybatis-config.xml的起别名中加<package name="xxx"/>,就会导致Reader entry: ����   1 n乱码,而R ...

  10. 迷你商城后台管理系统---------stage3项目部署测试汇总

    系统测试 在项目部署到云服务器之前,已通过本机启动springboot程序,访问localhost:8080,输入登陆的账户等一系列操作测试:功能测试.健壮性测试,系统已满足用户规定的需求. 系统部署 ...