版本 密钥长度 分组长度 迭代轮数
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14

一、AES的整体结构

二、轮函数

(1)字节代换(SubByte)
(2)行移位(ShiftRow)
(3)列混合(MixColumn)
(4)密钥加(AddRoundKey)

1.字节代换

  字节代换是非线性变换,独立地对状态的每个字节进行。代换表(S-Box)是可逆的。
  将明文字节Ai看作GF(28)上的元素,映射到自己的乘法逆元,’00’映射到自己。(可以通过矩阵计算得出)B′
对字节B′i做仿射变换得到密文Bi

2.行移位

  将状态阵列的各行进行循环移位,不同用的状态行的位移量不同。第0行不移动,第1行循环左移C1个字节,第二行循环左移C2个字节,第三行循环左移C3个字节。

3.有限域上的字节运算

  GF(28) 上的元素表示方法:
    字节表示 Byte: a7a6a5a4a3a2a1a0
    多项式表示 s(x): s(x) =a7x7+a6x6+a5x5+a4x4+a3x3+a2x2+a1x+ a0

(1)28有限域上的加法运算
例:0x57 + 0x83 = ?
0x57表示16进制的57,表示成二进制为:01010111
0x83表示16进制的83,表示成二进制为:10000011
相加相当于对两个数做异或运算,01010111 ⊕ 10000011 = 11010100 = 0xD4

原式 =(0x7 + 1x6 + 0x5 + 1x4 + 0x3 + 1x2 + 1x + 1) + ( 1x7 + 0x6 + 0x5 + 0x4 + 0x3 + 0x2 + 1x + 1 )

= ( x6 + x4+ x2 + x + 1 ) + ( x7 + x + 1 )

=x7 + x6 + x4+ x2

(2)28有限域上的乘法运算
例:0x57 × 0x83 = ?
0x57表示16进制的57,表示成二进制为:01010111
0x83表示16进制的83,表示成二进制为:10000011
mod m(x)= x8+x4+x3+x+1

原式 =[(0x7 + 1x6 + 0x5 + 1x4 + 0x3 + 1x2 + 1x + 1) × ( 1x7 + 0x6 + 0x5 + 0x4 + 0x3 + 0x2 + 1x + 1 )] mod (x8+x4+x3+x+1)

= [( x6 + x4+ x2 + x + 1 ) × ( x7 + x + 1 )] mod (x8+x4+x3+x+1)

= [( x6 × x7 + x4 × x7 + x2 × x7 + x × x7 + 1 × x7 ) + ( x6 × x + x4 × x + x2 × x + x × x + 1 × x ) + ( x6 × 1 + x4 × 1 + x2 × 1 + x × 1 + 1 × 1 )] mod (x8+x4+x3+x+1)

= [( x13 + x11 + x9 + x8 + x7 ) + ( x7 + x5 + x3 + x2 + x ) + (x6 + x4 + x2+ x + 1)] mod (x8+x4+x3+x+1)

= [x13 + x11 + x9 + x8+ x6 + x5 + x4 + x3 + 1] mod (x8+x4+x3+x+1)

x5m(x) = x5( x8+x4+x3+x+1) = x13 +x9 +x8+x6+x5

原式= (x11 + x4 + x3 + 1) mod (x8+x4+x3+x+1)

x3m(x) = x3( x8+x4+x3+x+1) = x11 +x7 +x6+x4+x3

原式= ( x7 + x6 + 1) mod (x8+x4+x3+x+1) [一直做到原式中的最高次数低于8]

0x57 × 0x83 = x7 + x6 + 1

( x7 + x6 + 1)对应二进制为1100 0001,即:0×C1

(3)28有限域上的x乘法运算
  定义为x·b(x) = b7x8+b6x7+b5x6+b4x5+b3x4+b2x3+b1x2+ b0x(mod m(x))
  如果b7=0,求模结果不变,否则为乘积结果减去m(x),即求乘积结果与m(x)的异或。由此得出x(十六进制02)乘b(x)可以先对b(x)在字节内左移一位(最后一位补0),若b7=1 则再与1B(其二进制为0001 1011)做逐比特异或来实现,该运算记为b= xtime(a)。在专用芯片中,xtime只需4个异或。x的幂乘运算可以重复应用xtime来实现。而任意常数乘法可以通过对中间结果相加实现。
例:用x乘法实现0×57·13
0×57的二进制表示为:01010111
  57 · 02 = xtime(57) = AE (将57的二进制形式01010111左移一位再补0得到10101110,也就是十六进制的AE)
  57 · 03 = 57·(02+01) = 57· 02+57·01 = 0×AE+0×57=10101110+01010111=111111001=0×F9
  57 · 04 = AE·02 = xtime(AE) = 47(将AE的二进制形式10101110左移一位再补0得到01011100,然后将其与1B也就是00011011异或,得到01000111,也就是0×47)
  57 · 08 = 47·02 = xtime(47) = 8E
  57 · 10 = 8E·02 = xtime(8E) = 07
  57 · 13 = 57 ·(01 ⊕ 02 ⊕ 10)=57⊕ AE⊕ 07=FE

(4)系数在GF(28)上的mod(x4+1)的乘法
  4个字节构成的向量可以表示为系数在GF(28)上的次数小于4的多项式。多项式的加法就是对象系数相加,换句话说,也就是4字节向量逐比特异或。
a(x) = a3x3+a2x2+a1x+ a0
b(x) = b3x3+b2x2+b1x+ b0
c(x) = a(x) ⊕ b(x) = c3x3+c2x2+c1x + c0

c0 = a0b0 ⊕ a3b1⊕ a2b2⊕ a1b3
c0 = a1b0 ⊕ a0b1⊕ a3b2⊕ a2b3
c0 = a2b0 ⊕ a1b1⊕ a0b2⊕ a3b3
c0 = a3b0 ⊕ a2b1⊕ a1b2⊕ a0b3


例:b(x)=01x2
  a(x)=03x3+01x2+01x+02
  c(x)=a(x) ⊕ b(x)

解:a3=03,a2=02,a1=01,a0=02

4.列混合

  列混合即是用一个常矩阵乘以第二步变换后的矩阵,以达到矩阵中每一个元素都是该元素原所在列所有元素的加权和。列混合的定义是:MixColumn(State)是将状态矩阵的每一列看成GF( 28 ) 上的一个多项式,且与一个固定的多项式c (x) = { 03 } x 3 + { 01 } x2 + { 01 } x + { 02 }相乘后模x4+1

  对于上面的矩阵,我们有b(0) = 02a0 +03a1+01a2+01a3,这里的02要转成“系数在GF(28)上的mod(x4+1)的乘法”,同理03和01也要转成“系数在GF(28)上的mod(x4+1)的乘法”,利用其中运算规则进行计算。

5.密钥加

三、AES算法的密钥编排算法

  密钥编排是指从种子密钥得到轮函数的过程,AES的密钥编排由密钥扩展和轮轮密钥选取两部分组成,其基本原则如下:
(1)轮密钥的总比特数等于轮数加1再乘分组长度,如128比特的明文经过10轮加密,总共需要(10+1)*128 = 1408比特的密钥。
(2)种子密钥被扩展成为扩展密钥。
(3)轮密钥从扩展密钥中取,其中第1轮轮密钥取扩展密钥的前Nb个字,第2轮轮密钥取接下来的Nb个字,以此类推。

1.当i=4,4%4=0时(128比特的时候是4个字,Nk=4)

2.当i=5,5%4≠0时(Nk=4)

四、AES的解密变换

AES解密运算是加密运算的逆运算,其中轮函数的逆为:
(1)ByteSub的逆变换由代换表的逆表做字节代换,也可通过如下两步实现: 首先进行仿射变换的逆变换,再求每一字节在GF(28)上逆元。
(2)行移位运算的逆变换是循环右移,位移量与左移时相同。
(3)列混合运算的逆运算是类似的,即每列都用一个特定的多项式d(x)相乘, d(x)满足
  (03x3+01x2+01x+02)*d(x)=01
由此可得
  d(x)=0Bx3+0Dx2+09x+0E
(4) 密钥加运算的逆运算是其自身。

《现代密码学》学习笔记——第三章 分组密码 [二] AES相关推荐

  1. 《现代密码学》学习笔记——第三章 分组密码 [三]分组密码的运行模式

    1.分组密码的运行模式   分组密码在加密时,明文的分组长度是固定的,而实际应用中待加密消息的数据量是不定的,数据格式多种多样. (1)为了能在各种应用场合使用DES,美国在FIPS PUS 74和8 ...

  2. 《Go语言圣经》学习笔记 第三章 基础数据类型

    <Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...

  3. 机器人导论(第四版)学习笔记——第三章

    机器人导论(第四版)学习笔记--第三章 3 操作臂运动学 3.1 引言 3.2 连杆的描述 3.3 连杆连接的描述 3.4 连杆坐标系的定义 3.5 操作臂运动学 3.6 驱动空间.关节空间和笛卡尔空 ...

  4. 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第三章:简单控件

    第 3 章 简单控件 本章介绍了App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图.容纳视图的常用布局.响应点击的按钮控件.显示图片的图像视图等.然后结合本章所学的知识,演示了一个实战项 ...

  5. Win32学习笔记 第三章 HelloWin 选择自 villager 的 Blog

    Win32学习笔记 作者: 姜学哲(netsail0@163.net) 教材: Windows程序设计(第五版)北京大学出版社  [美]Charles Petzold 著  北京博彦科技发展有限公司 ...

  6. ros2 Navigation 学习笔记 第三章(the construct 网站)

    第三章 如何在环境中给机器人定位 序言 本章包括: 机器人定位的意义(即需要知道它对于环境中的位置和方向) 如何在ROS2中用AMCL定位 如何设置机器人的初始位置(手动.自动与使用ROS API) ...

  7. 信号与系统学习笔记 第三章

    第三章 周期信号的傅里叶级数表示 下面将讨论信号与线性时不变系统的另一种表示,讨论的出发点仍是将信号表示成一组基本信号的线性组合.这是因为,将信号表示成基本信号的线性组合是有利的,如果基本信号具有一下 ...

  8. 仿生学导论学习笔记——第三章

    第三章 仿生学基本要素 3.1 仿生需求 3.1.1 需求驱动 3.1.1.1 生存需求 3.1.1.2 健康需求 3.1.1.3 军事需求 3.1.1.4 发展需求 3.1.1.5 精神需求 3.1 ...

  9. 计算机网络学习笔记——第三章:数据链路层

    目录 第三章:数据链路层 3.1 数据链路层功能概述 3.2 封装成帧和透明传输 3.3 差错控制 3.3.1 检错编码 3.3.2 纠错编码 3.4 流量控制与可靠传输机制 3.4.1 流量控制.可 ...

最新文章

  1. 关于数据库,你可能最想知道的几件事
  2. 部署教程 | ResNet原理+PyTorch复现+ONNX+TensorRT int8量化部署
  3. 网站开发常用jQuery插件总结(四)验证插件validation
  4. python做小程序-抖音最火的整蛊表白小程序如何做出来的?教你用python做出
  5. 9、使用GROUP BY分组查询
  6. js,jquery获取页面元素距离浏览器工作区顶端的距离
  7. Http、Socket、WebSocket之间联系与区别
  8. C语言:函数中参数的传值与传地址
  9. 8086汇编-实验9-字符打印
  10. ecmall支持php5.3,在PHP5.3以上版本运行ecshop和ecmall出现的问题及解决方案
  11. 【leetcode】75. Sort Colors
  12. [转]retina屏下支持0.5px边框的情况
  13. poj 1904 King's Quest 强连通分量+匹配
  14. (转)Spring如何装配各种集合类型的属性
  15. phpstorm连接ssh php,我可以在PhpStorm中使用远程ssh终端访问吗?
  16. ssh密钥登录 改密码登录_如何使用密钥对通过SSH登录而不使用密码
  17. 【java集合框架源码剖析系列】java源码剖析之TreeSet
  18. 信道检测手机软件 ios_wifi分析仪如何检测周围wifi信号 wifi分析仪使用方法【详解】...
  19. 根据从数据库中获取到的值控制按钮被选中
  20. python开发要学哪些内容_Python开发工程师需要学习哪些内容?

热门文章

  1. “核心+平台”硬实力!人大金仓助您轻松上云
  2. 【YOLOV5-6.x讲解】模型搭建模块 models/yolo.py
  3. php将微信绑定到账号上,微信通帐户绑定
  4. 控制工程基础MATLAB仿真实验,控制工程基础实验指导书——MATLAB仿真部分.doc
  5. 闲云旅游网04(基于vue+element ui)完成机票数据列表渲染
  6. 10条恶风水,你占了几条?
  7. BitBlt实现透明背景贴图
  8. GStreamer移植
  9. mysql--使用full join报错
  10. 十种经典排序算法总结