《现代密码学》学习笔记——第三章 分组密码 [二] AES
版本 | 密钥长度 | 分组长度 | 迭代轮数 |
---|---|---|---|
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)为了能在各种应用场合使用DES,美国在FIPS PUS 74和8 ...
- 《Go语言圣经》学习笔记 第三章 基础数据类型
<Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...
- 机器人导论(第四版)学习笔记——第三章
机器人导论(第四版)学习笔记--第三章 3 操作臂运动学 3.1 引言 3.2 连杆的描述 3.3 连杆连接的描述 3.4 连杆坐标系的定义 3.5 操作臂运动学 3.6 驱动空间.关节空间和笛卡尔空 ...
- 2022 最新 Android 基础教程,从开发入门到项目实战【b站动脑学院】学习笔记——第三章:简单控件
第 3 章 简单控件 本章介绍了App开发常见的几类简单控件的用法,主要包括:显示文字的文本视图.容纳视图的常用布局.响应点击的按钮控件.显示图片的图像视图等.然后结合本章所学的知识,演示了一个实战项 ...
- Win32学习笔记 第三章 HelloWin 选择自 villager 的 Blog
Win32学习笔记 作者: 姜学哲(netsail0@163.net) 教材: Windows程序设计(第五版)北京大学出版社 [美]Charles Petzold 著 北京博彦科技发展有限公司 ...
- ros2 Navigation 学习笔记 第三章(the construct 网站)
第三章 如何在环境中给机器人定位 序言 本章包括: 机器人定位的意义(即需要知道它对于环境中的位置和方向) 如何在ROS2中用AMCL定位 如何设置机器人的初始位置(手动.自动与使用ROS API) ...
- 信号与系统学习笔记 第三章
第三章 周期信号的傅里叶级数表示 下面将讨论信号与线性时不变系统的另一种表示,讨论的出发点仍是将信号表示成一组基本信号的线性组合.这是因为,将信号表示成基本信号的线性组合是有利的,如果基本信号具有一下 ...
- 仿生学导论学习笔记——第三章
第三章 仿生学基本要素 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 ...
- 计算机网络学习笔记——第三章:数据链路层
目录 第三章:数据链路层 3.1 数据链路层功能概述 3.2 封装成帧和透明传输 3.3 差错控制 3.3.1 检错编码 3.3.2 纠错编码 3.4 流量控制与可靠传输机制 3.4.1 流量控制.可 ...
最新文章
- 关于数据库,你可能最想知道的几件事
- 部署教程 | ResNet原理+PyTorch复现+ONNX+TensorRT int8量化部署
- 网站开发常用jQuery插件总结(四)验证插件validation
- python做小程序-抖音最火的整蛊表白小程序如何做出来的?教你用python做出
- 9、使用GROUP BY分组查询
- js,jquery获取页面元素距离浏览器工作区顶端的距离
- Http、Socket、WebSocket之间联系与区别
- C语言:函数中参数的传值与传地址
- 8086汇编-实验9-字符打印
- ecmall支持php5.3,在PHP5.3以上版本运行ecshop和ecmall出现的问题及解决方案
- 【leetcode】75. Sort Colors
- [转]retina屏下支持0.5px边框的情况
- poj 1904 King's Quest 强连通分量+匹配
- (转)Spring如何装配各种集合类型的属性
- phpstorm连接ssh php,我可以在PhpStorm中使用远程ssh终端访问吗?
- ssh密钥登录 改密码登录_如何使用密钥对通过SSH登录而不使用密码
- 【java集合框架源码剖析系列】java源码剖析之TreeSet
- 信道检测手机软件 ios_wifi分析仪如何检测周围wifi信号 wifi分析仪使用方法【详解】...
- 根据从数据库中获取到的值控制按钮被选中
- python开发要学哪些内容_Python开发工程师需要学习哪些内容?
热门文章
- “核心+平台”硬实力!人大金仓助您轻松上云
- 【YOLOV5-6.x讲解】模型搭建模块 models/yolo.py
- php将微信绑定到账号上,微信通帐户绑定
- 控制工程基础MATLAB仿真实验,控制工程基础实验指导书——MATLAB仿真部分.doc
- 闲云旅游网04(基于vue+element ui)完成机票数据列表渲染
- 10条恶风水,你占了几条?
- BitBlt实现透明背景贴图
- GStreamer移植
- mysql--使用full join报错
- 十种经典排序算法总结