《应用密码学》课件第3章分组密码2_第1页
《应用密码学》课件第3章分组密码2_第2页
《应用密码学》课件第3章分组密码2_第3页
《应用密码学》课件第3章分组密码2_第4页
《应用密码学》课件第3章分组密码2_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主要内容:

分组密码的基本概念

对称密码基本原理

数据标准加密(DES)

高级加密标准(AES)

对称密码体制工作模式

对称密码应用第三章分组密码算法2025/8/1223.4.1AES的产生历史背景20世纪70年代中期美国人开创的DES可以说经历了漫长而辉煌的年代,并逐渐由繁荣走向衰落,它之所以走向衰落,由于20世纪未出现了差分密码分析及线性密码分析,使得破译DES成为可能。NIST于1997年初发起并组织了在全世界范围内广泛征集新的加密标准算法的活动,同时要求每一种侯选算法的分组长度为128位,应当支持128,192和256比特的密钥长度,经过了几年的反复较量,对首轮入选的15种不同算法,进行了广泛的评估与测试,筛选出5种算法(MARS、RC6、Rijndael、Serpent和Twofish)进入决赛。3.4AES(高级数据加密标准)2025/8/123最终,由比利时的密码学专家JoanDaemen(ProtonWorldInternational公司)及VincentRijmen(Leuven大学)所提出的加密算法Rijndael(荣代尔)赢得了胜利,成为了21世纪新的数据加密标准AES(AdvancedEncryptionStandard)。

当美国宣布这一最后胜利的结果(2001年11月26日,NIST正式公布高级加密标准,并于2002年5月26日正式生效)时,出人意料,因为这是美国第一次将非美国公民提出的算法接受为密码标准算法,值得我们深思。目前,Rijndael以其算法设计的简洁、高效、安全而令世人关注,相信它会在国际上得到广泛的应用。2025/8/124Rijndael算法是由两位比利时的密码专家发明的,它运算速度很快而且所需的内存不多,这个算法非常可靠;Rijndael算法的设计策略是宽轨迹策略,是针对差分分析和线性分析提出来的,是一个分组迭代密码,具有可变的分组长度和密钥长度;

Rijndael汇聚了安全性能、效率、可实现性和灵活性等优点-特色:2025/8/125但是,我们应该清楚自香农(于1949年)发表“保密系统的通信理论”并确定密码学的科学体系以来,经过了1/4个世纪,RivestShamir和Adleman于1978年提出RSA公开密钥算法,美国国家标准局(NBS)于1977年数据加密标准DES。

其后,由于差分攻击及线性攻击的出现,又经过了近1/4个世纪,出现了代替DES的新的高级加密标准——Rijndael。

因此,我们应当相信Rijndael也不会是永恒的,也许经过若干年的研究会找出Rijndael致命的缺点,从而提出更安全的算法。

2025/8/126Rijndael密码设计原则

Rijndael密码的设计中考虑到的三条准则①抗击目前已知的所有攻击;-Rijndael密码的迭代变换由三个不同的、可逆的、一致变换组成,这三种不同的可逆变换提供抗线性密码分析和差分密码分析能力。②在多个平台上实现速度要快和编码紧凑;③设计简单。

-Rijndael中同样使用了迭代变换,但与大多数分组密码不同的是Rijndael没有使用Feistel结构。

不可约多项式:一个多项式f(x)称为是不可约的,如果不存在多项式f1(x),f2(x)∈Zp[x],满足f(x)=f1(x)×f2(x),其中deg(f1)>0和deg(f2)>0,也即f1(x),f2(x)不能是常数。3.4.1AES的数学基础-对于多项式f(x),设它的次数为n,表示为deg(f)=n。何谓有限域?-Zp[x]为变元x的所有多项式的集合,多项式的每一项的系数为整数且都小于p。对于非空集合元素F,若在F中定义了加和乘两种运算,且满足下述公理:(1)F关于加法构成交换群。其加法恒等元记为0。(2)F中非零元素全体对乘法构成交换群。其乘法恒等元(单位元)记为1。(3)加法和乘法间有如下分配律:a×(b+c)=a×b+a×c(b+c)×a=b×a+c×a则称F为一个域。若F中的元素个数有限,称F为有限域(FiniteField)。有限域也叫伽罗瓦(GaloisField)域。Zp[x]/f(x)是域当且仅当f(x)是不可约的,也就是说,如果f(x)是不可约的,则所有属于Zp[x]的多项式,在modf(x)后的余式,组成的集合构成一个域。反之也成立。例如:计算Z2[x]/x3+x+1,可得所有余式构成八个元素的集合{0,1,x,x+1,x2,x2+1,x2+x,x2+x+1},这个集合构成一个有限域,加法单位元为0,乘法单位元为1。这八个域元素的系数为:(000,001,010,011,100,101,110,111)

很容易知道,1,x,x+1,x2,x2+1,x2+x,x2+x+1模x3+x+1就是自身。下面是进一步的例子:例如求x3modx3+x+1,因为x3+x+1≡0modx3+x+1,故x3≡x3+x3+x+1≡x+1modx3+x+1。又如求x4modx3+x+1,注意到x4=x3×x,故x4≡(x+1)×xmodx3+x+1≡x2+x.在AES中选择的不可约多项式是p(x)=x8+x4+x3+x+1,余式的次数至多是7次,共28=256个多项式,这256个余式构成了一个有限域。字节b用二进制表示为b=b7b6b5b4b3b2b1b0为有限域GF(28)上的域元素,若用多项式表示,bi可看作是多项式的系数,bi∈{0,1},则字节b对应多项式为:b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x+b0例如:字节‘57’(十六进制数)对应的二进制为01010111,为GF(28)上域元素,字节‘57’对应的多项式为x6+x4+x2+x+1。AES计算是在一个特别的有限域完成的。在有限域GF(28)上的字节运算和字运算是AES算法中的两种基本运算。

-GF(28)上两个域元素的和GF(28)上两个域元素的和对应的多项式仍然是一个次数不超过7的多项式,其多项式系数等于两个元素对应多项式系数的模2加,即域元素对应二进制按位异或运算。例如:‘57’+‘83’=‘D4’,用多项式表示为:(x6+x4+x2+x+1)+(x7+x+1)≡x7+x6+x4+x2(modp(x))-有限域GF(28)上的字节运算字节运算时,一个字节被看做有限域GF(28)上的元素。有限域GF(28)可以定义为三元组:

(F,+,.),其中,F={b7b6b5b4b3b2b1b0|bi=0,1;i=0,1,2,3,4,5,6,7}用二进制表示为:01010111⊕10000011=11010100由于每个元素的加法逆元等于自己,所以有限域减法和加法相同。-GF(28)上两个域元素的乘要计算GF(28)上域元素的乘法,必须先确定一个GF(2)上的8次不可约多项式;GF(28)上两个元素的乘积就是这两个多项式的模乘。在Rijndael密码中,这个8次不可约多项式确定为:p(x)=x8+x4+x3+x+1它的十六进制表示为‘11B’。例如,‘57’·‘83’=‘C1’可表示为多项式乘法:

(x6+x4+x2+x+1)·(x7+x+1)≡x7+x6+1(modp(x))即:注:乘法“•”

是普通多项式乘法,但系数运算可看作比特的乘法和异或运算,即看作域{0,1}上的运算。x7+x6+1的系数对应的二进制为11000001,即十六进制的C1。2025/8/1213-例2:(01110011)(10010101)所以,(01110011)(10010101)=(01110000)

2025/8/1214-乘法的实际计算方法-讨论:2025/8/1215-X乘法:上述过程称之为x乘法,其定义为:x·b(x)≡b7x8+b6x7+b5x6+b4x5+b3x4+b2x3+b1x2+b0x(modp(x))

如果b7=0,求模结果不变,由此得出x(十六进制数‘02’)乘b(x)为对b(x)在字节内左移一位(最后一位补0)。若b7=1,则再与‘1B’(其二进制为00011011)做逐比特异或来实现,而任意常数乘法可以通过对中间结果相加实现。b7=0举例02·54=(00000010)·(01010100)=(x)·(x6+x4+x2)(modp(x))=x7+x5+x3(modp(x))=x7+x5+x3(modp(x))

≡x7+x5+x3(modp(x))=(10101000)由上面的规则:相当于把字节(01010100)左移一位即得(10101000)(最后一位补0)。02·D4=(00000010)·(11010100)=(x)·(x7+x6+x4+x2)(modp(x))=x8+x7+x5+x3(modp(x))≡(x4+x3+x+1)+x7+x5+x3(modp(x))≡x7+x5+x4+x+1(modp(x))

多项式

x7+x5+x4+x+1映射为二进制即为:(10110011)由上面的规则:先把(11010100)在字节内左移一位即得(10101000)(最后一位补0),因为b7=1,故(10101000)再与(00011011)异或得(10110011)b7=1举例例3:求‘57’·‘13’

因为:而:-再看前面的例2:(01110011)•(10010101)=[(00000001)+(00000010)+(00010000)+(00100000)+(01000000)]•(10010101)=(00000001)•(10010101)⊕(00000010)•(10010101)⊕(00010000)•(10010101)⊕(00100000)•(10010101)⊕(01000000)•(10010101)=(10010101)⊕[(00101010)⊕(00011011)]⊕(00010000)•(10010101)⊕(00100000)•(10010101)⊕(01000000)•(10010101)=(10010101)⊕(00110001)⊕[(10001000)⊕(00011011)]⊕(00100000)•(10010101)⊕(01000000)•(10010101)=(10010101)⊕(00110001)⊕(10010011)⊕[(00100110)⊕(00011011)]⊕(01000000)•(10010101)=(10010101)⊕(00110001)⊕(10010011)⊕(00111101)⊕(01111010)=(01110000)=(70)∴(01110011)•(10010101)=(01110000),即(73)•(95)=(70)1、整除补充2、同余

补充3、欧几里得除法(带余除法)补充4、最大公因数补充5、扩展的欧几里得除法补充补充=(a,b)补充例-逆元

设m是正整数,a是整数,如果存在a’,使得a×a’≡1(modm)成立,则a叫模m的可逆元,a’

叫a模m的逆元。例如,设m为11,则8模11的逆元为7,因为8×7≡1(mod11)当a和m互素的情况下,即(a,m)=1,则a的模m的逆元总是存在的,且可以用下面的辗转相除法(扩展的欧几里得算法)求得。例如,知道89是素数,求60模89的逆元,可以用下面方法。89=1×60+2960=2×29+229=14×2+1则1=29-14×2=29-14×(60-2×29)=29×29-14×60=(89-60)×29-14×60=89×29-60×43上页等式两端同时mod89得:60×(-43)≡1mod89故60模89的逆元为-43,为方便记为最小非负数,因为-43≡46mod89,故一般说60模89的逆元为46。因此,求a(x)模p(x)的乘法逆元转化为求两个多项式b(x)和c(x),使得满足b(x)a(x)+p(x)c(x)=1,即满足a(x)·b(x)≡1modp(x),因此b(x)是a(x)模p(x)的乘法逆元。GF(28)上域元素的乘法逆元在有限域GF(28)中,域元素的乘法满足交换律,且有单位元,并且每个域元素都有乘法逆元。在GF(28)中求乘法逆元也是利用多项式的扩展的欧几里得算法计算出来。求次数小于8的非零多项式b(x)的乘法逆元,首先利用多项式的扩展欧几里得算法得出两个多项式a(x)和c(x),使得满足b(x)a(x)+p(x)c(x)=1,即满足a(x)·b(x)≡1modp(x),因此a(x)是b(x)的乘法逆元。求GF(28)上域元素‘F5’(十六进制)的乘法逆元。(1)‘F5’用对应二进制为11110101,则用多项式表示为b(x)=x7+x6+x5+x4+x2+1然后计算两个多项式a(x)和c(x)满足(x7+x6+x5+x4+x2+1)·a(x)+p(x)c(x)=1(2)采用多项式的扩展欧几里得算法按照如下步骤计算:-乘法逆元举例因为:(x8+x4+x3+x+1)=(x7+x6+x5+x4+x2+1)(x+1)+x2(x7+x6+x5+x4+x2+1)=x2(x5+x4+x3+x2+1)+11=(x7+x6+x5+x4+x2+1)-x2(x5+x4+x3+x2+1)=(x7+x6+x5+x4+x2+1)-[(x8+x4+x3+x+1)-(x7+x6+x5+x4+x2+1)(x+1)](x5+x4+x3+x2+1)=(x8+x4+x3+x+1)(x5+x4+x3+x2+1)-(x7+x6+x5+x4+x2+1)[1+(x+1)(x5+x4+x3+x2+1)]=(x8+x4+x3+x+1)(x5+x4+x3+x2+1)-(x7+x6+x5+x4+x2+1)(x6+x2+x)-课堂作业1:请使用有限域GF(28)上的字节运算方法计算:(1)16进制的“12”与“59”的加法,即计算“12+59”的值;(2)16进制的“12”与“59”的乘法,即计算“12•59”的值。2025/8/12333.4.3AES算法描述

Rijndael是一种灵活的算法,加密明文分组块的长度可变、密钥长度也可变的分组密码。分组长度、密钥长度彼此独立地确定为128、192、256比特,因而Rijndael算法可以9种不同的版本,而迭代次数与明文分组块的大小和密钥有关(如下表)。

轮数(Round)分组长度128bit分组长度192bit分组长度256bit密钥128比特101214密钥192比特121214密钥256比特141414对于AES,只用了第一列,即明文长度固定为128比特2025/8/1234Rijndael算法不像DES算法,采用包含置换操作的典型的Feistel轮结构,而是进行多轮的替换、列混合和密钥加操作,因此Rijndael本质上是采用代替/置换网络的对称分组密码体制。

AES和Rijndael密码算法并不完全一样,AES算法限定了明文分组大小为128比特,而密钥长度可为128、192、256比特,因而实际上AES有三个版本:AES-128、AES-192、AES-256,相应的迭代轮数为10轮、12轮、14轮。

AES算法是Rijndael算法的子集,但实际应用中,术语AES和Rijndael视为等价,可以交替使用。

AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”或者“状态”,其初值就是一个明文区块(矩阵中一个元素单位大小就是明文区块中的一个Byte(8比特))。加密时,明文块与子密钥首先进行一次轮密钥加,然后各轮AES加密循环(除最后一轮外)均包含4个步骤,其结构如下页图所示。2025/8/12351.字节代替(SubBytes):通过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。

2.行移位(ShiftRows):将矩阵中的每个横列进行循环式移位。

3.列混合(MixColumns):为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每行内的四个字节。2025/8/12364.轮密钥加(AddRoundKey):矩阵中的每一个字节都与该次循环的子密钥(roundkey)做XOR逻辑运算;每个子密钥由密钥生成方案产生。

最后一个加密循环中没有列混合(MixColumns)步骤,而以另一个轮密钥加(AddRoundKey)取代。大多数AES计算是在由不可约多项式x8+x4+x3+x+1构造的有限域上完成的。AES的加密过程演示2025/8/12373.4.4基本变换

AES算法每次明文分组以及每次变换的中间结果分组称为状态(State)。

状态用以字节(8比特位)为基本构成元素的矩阵阵列来表示,该阵列有4行,即每列为32比特,因而列数为分组长度除以32,通常记为Nb。

列数:

Nb=分组长度(比特)÷32

Rijndael算法列数Nb可以取的值为4,6,8,对应的分组长度为128,192,256比特。

而AES算法的分组长度固定为128比特,以字节为基本单位转换为状态字节,依顺序

a00,a10,a20,a30,a01,…a23,a33,前4个字节组成第1列,后四个字节组成第2列,依次类推,AES算法明文分组可以构成一个4×4的字节矩阵,如下页图所示,加密结束时,输出也是从状态字节中按相同的顺序提取。

2025/8/1238阵列状态图:

AES算法加密和解密过程中密码密钥(CipherKey)同样以字节为基本单位转换,因而依顺序

k00,k10,k20,k30,k01,…k23,k33,…,为类似地用一个4行的矩阵阵列来表示,前4个字节组成第1列,后四个字节组成第2列,依次类推,列数记为Nk。

Nk=密钥长度(比特)÷322025/8/1239

Rijndael算法和AES算法的密码密钥的列数Nk可以取的值为4、6、8,对应的密钥长度为128、192、256bits,因而密码密钥构成一个4×4、4×6、4×8的密钥字节矩阵。如下图所示,192比特密钥的密码密钥矩阵,Nk为6。密码密钥阵列状态

2025/8/1240下面我们以一个128位块为例,介绍AES加密算法基本变换的具体过程。若示例块是由0和1组成的,输入的128位块为10000000010111100110101000110110010100110010010100111010011001100110001100110101011010010000001100100000011011000010100000000110为了表达简洁,下面的AES算法基本变换的中间结果都用16进制来表示。则128比特二进制示例块用16进制表示则对应为805E6A3653253A6663356903206C2806(如下表

所示)。2025/8/1241在进行AES加密算法过程中,首先把输入明文128比特示例块805E6A3653253A6663356903206C2806按照AES算法规则构成一个构成一个4×4的字节矩阵,如下图所示。阵列状态

1.字节代替(SubBytes)

Rijndael算法的字节变换(SubBytes)使用一个S盒(不像DES算法使用8个S盒)进行非线性置换。如下页表所示,它将输入或中间态的每一个字节通过一个简单的查表操作,映射为另外一个字节。2025/8/1242映射方法:输入字节前4位指定S盒的行值,后4位指定S盒的列值。有行和列所确定S盒位置的元素作为输出(如下页图所示)。例如输入字节“03”,行值为0,列值为3;根据上表可以查得第0行第3列对应的值为“7B”,输出字节为“7B”。

2025/8/1243Rijndael算法字节代替操作

例如,输入矩阵(用16进制表示)进入S盒替换操作,则相应的输出如下所示:

2025/8/1244其实S盒是一个复杂的代数结构,S盒的设计是有一定限制条件的,其中的一些限制条件是:它应当是可逆的,不能存在这种情况:行i列j位置上的值为ij。实际Rijndael的S盒字节替代操作它包括两个代数变换:2025/8/1245上面仿射变换用矩阵可以表示如下:

下面以输入“F5”为示例来说明S盒替代操作它包括两个变换,不通过查S盒表,而通过代数计算求解。首先求解“F5”由f(x)=x8+x4+x3+x+1构造GF(28)有限域上的乘法逆元,然后进行上式的变换。

2025/8/1246

1)其输入十六进制“F5”对应二进制为“11110101”,多项式为(x7+x6+x5+x4+x2+1),求其模f(x)=x8+x4+x3+x+1的逆,即求b(x):

(x7+x6+x5+x4+x2+1)·b(x)≡1(modf(x))通过多项式欧几里得扩展算法,求解得:

(x7+x6+x5+x4+x2+1)(x6+x2+x)≡1mod(x8+x4+x3+x+1)即:(x7+x6+x5+x4+x2+1)模(x8+x4+x3+x+1)的乘法逆元为x6+x2+x

,即‘F5’的乘法逆元为‘46’

2)十六进制‘46’其二进制为01000110,进行第2步的仿射变换,代入矩阵运算运行:即二进制结果为11100110,对应十六进制结果为“E6”,与查表S盒替代操作结果一样。2025/8/12472.行移位(ShiftRows)

在Rijndael算法中,行移位操作作用于S盒的输出。其中,状态阵列的4个行循环以字节为基本单位进行左移,而每1行循环做移的偏移量是由明文分组的大小和所在行数共同确定,即列数Nb和行号确定。设状态阵列的每行用Ci来表示,那么每行偏移量如下表所示:

AES算法中Nb为4,即第1行循环左移0字节,第二行循环左移1字节,第三行循环左移2字节,第四行循环左移3字节,如下页图。从该图中可以看出,这使得列完全进行了重排。2025/8/1248行移位操作

例如,输入矩阵(用16进制表示)进入行移位操作,则相应的输出如下所示:2025/8/12493.列混合(MixColumns)

列混合操作可以将输入的状态矩阵的每列看作是有限域GF(28)上的多项式b(x),与多项式s(x)=03x3+01x2+01x+02相乘然后模x4+1,其中多项式的系数为有限域GF(28)的运算。其方法为令c(x)=s(x)×b(x)mod(x4+1),因而列混合是可以表示为矩阵相乘来实现,进行移位后的矩阵与固定矩阵(十六进制表示)相乘,如下所示:2025/8/1250列混合操作如下图所示:例如,输入矩阵(用16进制表示)进入列混合操作,则相应的输出如下所示:2025/8/1251例如:第1行02,03,01,01与第1列E6,1B,50,18相乘,其中符号“*”和“⊕”分别为有限域GF(28)的乘法和加法运算,具体操作如下:可以看到通过列混合操作第1列包含字节为B2、38、75、4A,经过这些操作明文经过几轮迭代后高度打乱了,同时还保证输入和输出之间关联很少了。2025/8/12524.轮密钥加(AddRoundKey)

最后一阶段是将列混合的状态矩阵与子密钥进行XOR逻辑运算(子密钥是从初始密钥派生而来的),即将轮密钥与状态按比特异或。轮密钥是通过密钥调度过程从密码密钥中得到的,轮密钥长度等于分组长度。如下图,这完成了算法的一次迭代。2025/8/1253例如,输入状态矩阵和子密钥矩阵(用16进制表示)进入轮密钥加操作,则相应的输出如下所示:2025/8/1254-AES加密过程的流程图(如右):加密算法的描述及实现Rijndael解密算法用伪C语言表示如下:Rijndael-Chiper(bytein[4*Nb],byteout[4*Nb],wordw[Nb*Nr+1])Beginbytestate[4,Nb]state=inAddRoundKey(State,w[0,Nb-1])forround=1step1toNr-1SubBytes(state)ShiftRows(state)MixColumn(state)AddRoundKey(State,w[round*Nb,(round+1)*Nb-1])EndforSubBytes(state)ShiftRows(state)AddRoundKey(State,w[Nr*Nb,(round+1)*Nb-1])Out=stateend-加密的具体过程:首先将明文分组复制到矩阵中,经过初始轮密钥加后,在执行Nr-1次轮变换来转变状态矩阵,最后一轮与前Nr-1轮不同之处在于这一轮没有列混合变换;最后将状态矩阵中的各个字节按顺序输出就得到密文分组。2025/8/12563.4.5密钥扩展

Rijndael算法的密钥按照矩阵的列进行分组,密钥比特的总数等于明文分组长度乘以轮数加1,即密钥bit的总数=分组长度×(轮数Round+1)。例如当明文分组长度为128bits和轮数Round为10时,轮密钥长度为128×(10+1)=1408bits,则需要添加40个新列来进行扩充;当明文分组为128bits和轮数Round为12时,轮密钥长度为128×(12+1)=1664bits,则需要添加46个新列来进行扩充。

Rijndael算法由于密码密钥Nk列数的不同,其密钥扩展算法有所不同。2025/8/1257下面以密钥长度128比特为例,Nk=4,其密钥扩展示意图如下图。首先初始密钥按照矩阵列进行分组,前4列初始密钥计为K0,K1,K2,K3,那么新的列如下递归:

(1)如果Ki中,i不是4的倍数,那么i列由如下等式确定:

Ki=Ki-4XORKi-1

NK=4的密钥扩展示意图

2025/8/1258其中T[Ki-1]是Ki-1的一种转换形式,按以下方式实现:

循环地将Ki-1的元素左移位,每次一个字节,如

abcd变成bcda②

将这4个字节作为S盒的输入,输出新的4个字节efgh③

计算一轮的常量

r(i)=Rcon(j/NK)④

这样生成转换后的列:[eXORr(i),f,g,h]第i轮的轮密钥组成了列K4i,K4i+1,K4i+2,K4i+3.

(2)如果Ki中,i是4的倍数,那么i列由如下等式确定:

Ki=Ki-4XORT[Ki-1]

实例:设初始种子密钥为

K0=75356B99,K1=05613956,K2=73620531,K3=00550932,下一个子密钥段为K4,由于i是4的倍数,所以K4计算如下:

K4=K0XORT[K3]2025/8/1259T[K3]的计算要涉及Rcon数组,下面解释下Rcon数组的计算。

密钥扩展中:Rcon[i]=(RC[i],

’00’,’00’,’00’)RC[1]=1(即’01’)RC[i]=2*RC[i-1]=(02)(i-1);i=2,3,......也即RC[i]=x(i-1)modp(x);i=2,3,......其中,p(x)=x8+x4+x3+x+1-Rcon[i]的计算:RC[1]=’01’(00000001)Rcon[1]=(’01’,00,00,00)RC[2]=‘02’(00000010)Rcon[2]=(’02’,00,00,00)RC[3]=‘04’(00000100)Rcon[3]=(’04’,00,00,00)RC[4]=‘08’(00001000)Rcon[4]=(’08’,00,00,00)RC[5]=‘10’(00010000)Rcon[5]=(’10’,00,00,00)RC[6]=‘20’(00100000)Rcon[6]=(’20’,00,00,00)RC[7]=‘40’(01000000)Rcon[7]=(’40’,00,00,00)RC[8]=‘80’(01000000)Rcon[8]=(’80’,00,00,00)RC[9]=‘1b’(00011011)Rcon[9]=(’1b’,00,00,00)RC[10]=‘36’(00110110)Rcon[10]=(’36’,00,00,00)RC[i]2025/8/1261实例:设初始种子密钥为

K0=75356B99,K1=05613956,K2=73620531,K3=00550932,下一个子密钥段为K4,由于i是4的倍数,所以K4计算如下:

K4=K0XORT[K3]2025/8/1262T[K3]的计算步骤如下:

(1)循环将K3按照字节为单位左移1字节,00550932变成了55093200

(2)将55093200作为S盒的输入,查表得到输出

fc012363

(3)计算常量Rcon(i)=(RC[i],00,00,00)异或,RC[i/NK]=RC[4/4]RC[1]=0x01(十六进制)(4)将01000000与fc012363异或运算得fd012363

因此,T[K3]=fd012363

K4=75356B99XORfd012363=883448fa

接着三列密钥计算如下:

K5=Ki-4XORKi-1=K1XORK4=05613956XOR883448fa=8d5571ac;K6=Ki-4

XORKi-1=K2XORK5=73620531XOR8d5571ac=fe37749d;K7=Ki-4

XORKi-1=K3XORK6=00550932XORfe37749d=fe627daf;2025/8/1263

因此下一轮得密钥为:883448fa8d5571acfe37749dfe627daf按照上述算法依次扩展,128位密钥由种子密钥扩展K4,K5,…,

K43为止。密钥扩展完成之后,进行轮密钥选取。

密钥选取非常简单,从扩展密钥中取出轮密钥:第一个轮密钥由扩展密钥的第一个Nb个字(其实就是Nb列),第二个轮密钥由接下来的Nb个字组成,以此类推。其结构如下图所示:轮密钥选择

Wi-4Wi-3Wi-2Wi-1WiByteSubstituionByteRotate+Rcons+密钥扩展(128)4=<i<4(Rnd+1)imod4=0imod4!=0Wi-6Wi-5Wi-4Wi-3Wi-2ByteSubstituionByteRotate+Rcons+6=<i<6(Rnd+1)imod6=0imod6!=0Wi-1Wi密钥扩展(192)Nk<=6若Nk<=6,则有:

KeyExpansion(byteKey[4*Nk],W[Nb*(Nr+1)]){for(i=0;i<Nk;i++)W[i]=(Key[4*i],Key[4*i+1],Key[4*i+2],Key[4*i+3]);for(i=Nk;i<Nb*(Nr+1);i++){temp=W[i-1];

if(i%Nk==0)

temp=SubByte(RotByte(temp))^Rcon[i/Nk];W[i]=W[i-Nk]^temp;}}Wi-6Wi-5Wi-4Wi-3Wi-2ByteSubstituion++密钥扩展8=<i<8(Rnd+1)imod8=0imod4!=0Wi-1WiWi-8Wi-7ByteSubstituionByteRotate+Rconsimod4=0密钥扩展(256)Nk=8时的密钥扩展KeyExpansion(byteKey[4*Nk],W[Nb*(Nr+1)]){for(i=0;i<Nk;i++)W[i]=(Key[4*i],Key[4*i+1],Key[4*i+2],Key[4*i+3]);for(i=Nk;i<Nb*(Nr+1);i++){temp=W[i-1];

if(i%Nk==0)temp=SubByte(RotByte(temp))^Rcon[i/Nk];

elseif(i%Nk==4)temp=SubByte(temp);W[i]=W[i-Nk]^temp;}}Rijndael密钥扩展算法用伪C语言表示如下:Rijndael-KeyExpansion(bytekey[4*Nk],wordw[Nb*(Nr+1]),Nk)Beginwordtempi=0while(i<Nk)w[i]=word(key(4*i],key(4*i+1],key(4*i+2],key(4*i+3])i=i+1endwhilei=Nkwhile(i<Nb*(Nr+1))temp=w[i-1]if(imodNk=0)temp=Subword(RotWord(temp))xorRcon[i/Nk]elseifw[i]=w[i-Nk]xortempi=i+1endwhileend密钥扩展算法的描述及实现(Nk=4或6)

2025/8/12703.4.6解密过程

由AES解密过程中的基本运算,除了轮密钥加AddRoundKey与AES加密算法中一样,其它基本运算字节替代SubBytes、行移位ShiftRows、列混合MixColumns都要求逆,解密过程中的基本运算为逆字节替代InvSubBytes、逆行移位InvShiftRows、逆列混合InvMixColumns。解密结构如下图所示。2025/8/12711.逆字节代替(InvSubBytes)

Rijndael算法的逆字节变换(InvSubBytes)是与字节替代一样,它将输入或中间状态的每一个字节通过一个简单查表操作,只是查表操作变为查逆S盒,逆S盒如右表所示。映射方法是:输入字节前4位指定逆S盒的行值,后4位指定逆S盒的列值,有行和列所确定逆S盒位置的元素作为输出。

2025/8/1272同样,Rijndael的逆S盒替代操作它包括两个变换,其变换顺序与S盒刚好相反,先进行仿射变换的逆变换,然后进行求逆运算:(1)在GF(2)上进行下面的仿射变换,每个字节可以依次记为(b7,b6,b5,b4,b3,b2,b1,b0),依次做下面的仿射变换:其中di是指字节(05=00000101)中的第i位的值。上面逆仿射变换用矩阵可以表示为:

2025/8/12732025/8/12742.逆行移位(InvShiftRows)

在Rijndael算法中,逆行移位操作与行移位操作相反,行移位操作循环左移,而逆行移位操作则循环向右移。若AES算法中Nb为4,即第1行循环右移0字节,第2行循环右移1字节,第3行循环右移2字节,第4行循环右移3字节,如下图所示。从该图中可以看出,这使得列完全进行了重排。

2025/8/12753.逆列混合(InvMixColumns)

逆列混合操作与列混合操作一样,只是多项式不同,则逆列混合操作多项式d(x)=0Bx3+0Dx2+09x+0E相乘然后模x4+1,因而逆列混合是可以表示为矩阵相乘来实现,输入的矩阵与固定矩阵(十六进制表示)相乘,如下所示:其图形表示如下图所示:

Rijndael加密算法用伪C语言表示如下:Rijndael-InvChiper(bytein[4*Nb],byteout[4*Nb],wordw[Nb*Nr+1])Beginbytestate[4,Nb]state=inAddRoundKey(State,w[Nr*Nb,(round+1)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论