【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

AES 加密算法的全面解剖:从密钥扩张到子密钥生成 (aes加密算法原理及步骤)

用户投稿2024-04-16热门资讯25

先进加密标准 (AES) 是一种对称块密码,由美国国家标准与技术研究所 (NIST) 于 2001 年发布,旨在替换数据加密标准 (DES)。AES 是一种强大的加密算法,已广泛用于各种应用中,包括在线银行、电子邮件加密和政府通信。

算法概述

AES 是一种迭代块密码,这意味着它使用一系列称为循环的重复操作对数据块进行加密和解密。AES 块的大小为 128 位,可使用 128 位、192 位或 256 位密钥进行加密。AES 算法包括以下主要步骤:

  • 密钥扩展:将初始密钥扩展为一系列子密钥,用于后续轮次。
  • 初始轮次:将明文块与初始密钥 XOR。
  • 中间轮次:执行一系列轮次,每个轮次都包括子密钥 XOR、字节替换、行移位和混合列。
  • 最终轮次:执行与中间轮次类似的轮次,但省略混合列操作。

密钥扩展

密钥扩展是 AES 算法的第一步,其将初始密钥扩展为一系列 11、13 或 15 个子密钥,具体取决于密钥长度。密钥扩展算法基于 Rijndael 密钥调度,它使用以下操作:

  • RotWord:将 32 位字循环左移 8 位。
  • SubWord:将 32 位字的每个字节替换为 S-box 中对应的字节。
  • Rcon:将字节常量添加到扩展密钥。

密钥扩展算法通过重复这些操作生成子密钥。下表显示了密钥长度为 128 位时的密钥扩展过程:

...
轮次 操作 输出
0 RotWord、SubWord、Rcon W[1]
1 XOR(W[0], W[1])
10 XOR(W[9], W[10]) W[11]

子密钥生成

子密钥生成是密钥扩展的最后一步。它将扩展密钥转换为 11、13 或 15 个 128 位子密钥,具体取决于密钥长度。这些子密钥将用于后续轮次中的操作。

子密钥生成过程如下:

  • 将扩展密钥的前 128 位复制到子密钥 K0。
  • 将扩展密钥的下一个 128 位复制到子密钥 K1。
  • 对于每个后续轮次:
    • 将上一个子密钥 (Ki-1) 循环左移 1 个字节。
    • 将该循环左移的子密钥与子密钥 Ki-4 XOR。
    • 将所得结果存储为子密钥 Ki。

轮次结构

AES 加密算法包括多个循环,每个循环都使用不同的子密钥执行以下操作:

  1. 子密钥 XOR:将输入块与当前子密钥 XOR。
  2. 字节替换:将输入块的每个字节替换为 S-box 中对应的字节。
  3. 行移位:将输入块的行循环移动不同的数量。
  4. 混合列:使用 Galois 场乘法将输入块的列组合起来(除最后循环外)。

这些操作的组合对数据块进行非线性和扩散变换,从而增强了算法的安全性。

S-box

S-box 是一个 8x8 的字节替换表,用于增加算法的非线性。S-box 中的每个条目都是一个字节值,用于替换输入块中的对应字节。

S-box 的设计基于以下原则:

  • 每个字节值只能出现一次。
  • 字节值的汉明权重(即设置的位数)应为 4。
  • 字节值的互补值应具有尽可能多的不同的位。

行移位

行移位操作将输入块的行循环移动不同的数量。这有助于增加算法的扩散特性,确保每个输入位影响输出块中的多个位。

行移位操作如下:

  • 第一行不移动。
  • 第二行循环移动 1 位。
  • 第三行循环移动 2 位。
  • 第四行循环移动 3 位。

混合列

混合列操作将输入块的列组合起来,使用 Galois 场乘法运算。这进一步增加了算法的扩散特性,确保每个输入位影响输出块中的尽可能多的位。

混合列操作如下:

  • 将每一列视为一个 4 字节向量。
  • 将向量乘以恒定矩阵,该矩阵基于 Galois 场乘法。

优势和缺点

优势:强大的安全性:AES 已被证明是抵抗各种攻击,包括暴力破解、差分分析和线性分析。高效率:AES 是一种非常高效的算法,甚至可以在低功耗设备上快速执行。广泛采用:AES 已被广泛用于各种应用中,包括在线银行、电子邮件加密和政府通信。缺点:密钥长度:AES 的密钥长度有限,使其容易受到蛮力攻击。侧信道攻击:AES 可能容易受到某些侧信道攻击,例如时序分析和功率分析。

结论

AES 加密算法是一种强大且高效的对称块密码,已广泛用于各种加密应用中。其坚固的安全性、高效率和广泛的采用使其成为当今使用最广泛的加密算法之一。

AES算法原理

AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文区块(矩阵中一个 元素大小就是明文区块中的一个Byte)。 (Rijndael加密法因支持更大的区块,其矩阵行数可视情况增加)加密时, 各轮AES加密循环(除最后一轮外)均包含4个步骤: 矩阵中的各字节通过一个8位的S-box进行转换。 这个步骤提供了加密法非线性的变换能力。 S-box与GF(28)上的乘法反元素有关,已知具有良好的非线性特性。 为了避免简单代数性质的攻击,S-box结合了乘法反元素及一个可逆的仿射变换矩阵建构而成。 此外在建构S-box时,刻意避开了固定点与反固定点,即以S-box替换字节的结果会相当于错排的结果。 AES算法中的S盒如图2.2所示 例如一个字节为0x19,经过S盒变换查找n(1,9) = 0xd4,所以就替换为0xd4。 ShiftRows描述矩阵的行操作。 在此步骤中,每一行都向左循环位移某偏移量。 在AES中(区块大小128位),第一行维持不变,第二行里的每个字节都向左循环移动一格。 同理,第三行及第四行向左循环位移的偏移量就分别是2和3。 经过ShiftRows之后,矩阵中每一竖列,都是由输入矩阵中的每个不同列中的元素组成。 在MixColumns步骤,每一列的四个字节通过线性变换互相结合。 每一列的四个元素分别当作 的系数,合并即为GF(28)中的一个多项式,接着将此多项式和一个固定的多项式在modulo下相乘。 此步骤亦可视为Rijndael有限域之下的矩阵乘法。 MixColumns函数接受4个字节的输入,输出4个字节,每一个输入的字节都会对输出的四个字节造成影响。 因此ShiftRows和MixColumns两步骤为这个密码系统提供了扩散性。 AES算法利用外部输入密钥K(密钥串的字数为Nk),通过密钥的扩展程序得到共计4(Nr+1)字的扩展密钥。 它涉及如下三个模块: (1)位置变换(rotword)——把一个4字节的序列[A,B,C,D]变化成[B,C,D,A]; (2)S盒变换(subword)——对一个4字节进行S盒代替; (3)变换Rcon[i]——Rcon[i]表示32位比特字[xi-1,00,00,00]。 这里的x是(02),如 Rcon[1]=[];Rcon[2]=[];Rcon[3]=[]……  扩展密钥的生成:扩展密钥的前Nk个字就是外部密钥K;以后的字W[[i]]等于它前一个字W[[i-1]]与前第Nk个字W[[i-Nk]]的“异或”,即W[[i]]=W[[i-1]]W[[i- Nk]]。 但是若i为Nk的倍数,则W[i]=W[i-Nk]Subword(Rotword(W[[i-1]]))Rcon[i/Nk]。

如何使用java对密码加密 加密方式aes

Java有相关的实现类:具体原理如下对于任意长度的明文,AES首先对其进行分组,每组的长度为128位。 分组之后将分别对每个128位的明文分组进行加密。 对于每个128位长度的明文分组的加密过程如下:(1)将128位AES明文分组放入状态矩阵中。 (2)AddRoundKey变换:对状态矩阵进行AddRoundKey变换,与膨胀后的密钥进行异或操作(密钥膨胀将在实验原理七中详细讨论)。 (3)10轮循环:AES对状态矩阵进行了10轮类似的子加密过程。 前9轮子加密过程中,每一轮子加密过程包括4种不同的变换,而最后一轮只有3种变换,前9轮的子加密步骤如下:●SubBytes变换:SubBytes变换是一个对状态矩阵非线性的变换;●ShiftRows变换:ShiftRows变换对状态矩阵的行进行循环移位;●MixColumns变换:MixColumns变换对状态矩阵的列进行变换;●AddRoundKey变换:AddRoundKey变换对状态矩阵和膨胀后的密钥进行异或操作。 最后一轮的子加密步骤如下:●SubBytes变换:SubBytes变换是一个对状态矩阵非线性的变换;●ShiftRows变换:ShiftRows变换对状态矩阵的行进行循环移位;●AddRoundKey变换:AddRoundKey变换对状态矩阵和膨胀后的密钥进行异或操作;(4)经过10轮循环的状态矩阵中的内容就是加密后的密文。 AES的加密算法的伪代码如下。 在AES算法中,AddRoundKey变换需要使用膨胀后的密钥,原始的128位密钥经过膨胀会产生44个字(每个字为32位)的膨胀后的密钥,这44个字的膨胀后的密钥供11次AddRoundKey变换使用,一次AddRoundKey使用4个字(128位)的膨胀后的密钥。 三.AES的分组过程对于任意长度的明文,AES首先对其进行分组,分组的方法与DES相同,即对长度不足的明文分组后面补充0即可,只是每一组的长度为128位。 AES的密钥长度有128比特,192比特和256比特三种标准,其他长度的密钥并没有列入到AES联邦标准中,在下面的介绍中,我们将以128位密钥为例。 四.状态矩阵状态矩阵是一个4行、4列的字节矩阵,所谓字节矩阵就是指矩阵中的每个元素都是一个1字节长度的数据。 我们将状态矩阵记为State,State中的元素记为Sij,表示状态矩阵中第i行第j列的元素。 128比特的明文分组按字节分成16块,第一块记为“块0”,第二块记为“块1”,依此类推,最后一块记为“块15”,然后将这16块明文数据放入到状态矩阵中,将这16块明文数据放入到状态矩阵中的方法如图2-2-1所示。 块0块4块8块12块1块5块9块13块2块6块10块14块3块7块11块15图2-2-1将明文块放入状态矩阵中五.AddRoundKey变换状态矩阵生成以后,首先要进行AddRoundKey变换,AddRoundKey变换将状态矩阵与膨胀后的密钥进行按位异或运算,如下所示。 其中,c表示列数,数组W为膨胀后的密钥,round为加密轮数,Nb为状态矩阵的列数。 它的过程如图2-2-2所示。 图2-2-2AES算法AddRoundKey变换六.10轮循环经过AddRoundKey的状态矩阵要继续进行10轮类似的子加密过程。 前9轮子加密过程中,每一轮要经过4种不同的变换,即SubBytes变换、ShiftRows变换、MixColumns变换和AddRoundKey变换,而最后一轮只有3种变换,即SubBytes变换、ShiftRows变换和AddRoundKey变换。 AddRoundKey变换已经讨论过,下面分别讨论余下的三种变换。 1.SubBytes变换SubBytes是一个独立作用于状态字节的非线性变换,它由以下两个步骤组成:(1)在GF(28)域,求乘法的逆运算,即对于α∈GF(28)求β∈GF(28),使αβ =βα = 1mod(x8 + x4 + x3 + x + 1)。 (2)在GF(28)域做变换,变换使用矩阵乘法,如下所示:由于所有的运算都在GF(28)域上进行,所以最后的结果都在GF(28)上。 若g∈GF(28)是GF(28)的本原元素,则对于α∈GF(28),α≠0,则存在β ∈ GF(28),使得:β = gαmod(x8 + x4 + x3 + x + 1)由于g255 = 1mod(x8 + x4 + x3 + x + 1)所以g255-α = β-1mod(x8 + x4 + x3 + x + 1)根据SubBytes变换算法,可以得出SubBytes的置换表,如表2-2-1所示,这个表也叫做AES的S盒。 该表的使用方法如下:状态矩阵中每个元素都要经过该表替换,每个元素为8比特,前4比特决定了行号,后4比特决定了列号,例如求SubBytes(0C)查表的0行C列得FE。 表2-2-1AES的SubBytes置换表它的变换过程如图2-2-3所示。 图2-2-3SubBytes变换AES加密过程需要用到一些数学基础,其中包括GF(2)域上的多项式、GF(28)域上的多项式的计算和矩阵乘法运算等,有兴趣的同学请参考相关的数学书籍。 2.ShiftRows变换ShiftRows变换比较简单,状态矩阵的第1行不发生改变,第2行循环左移1字节,第3行循环左移2字节,第4行循环左移3字节。 ShiftRows变换的过程如图2-2-4所示。 图2-2-4AES的ShiftRows变换3.MixColumns变换在MixColumns变换中,状态矩阵的列看作是域GF(28)的多项式,模(x4+1)乘以c(x)的结果:c(x)=(03)x3+(01)x2+(01)x+(02)这里(03)为十六进制表示,依此类推。 c(x)与x4+1互质,故存在逆:d(x)=(0B)x3+(0D)x2+(0G)x+(0E)使c(x)•d(x) = (D1)mod(x4+1)。 设有:它的过程如图2-2-5所示。 图2-2-5AES算法MixColumns变换七.密钥膨胀在AES算法中,AddRoundKey变换需要使用膨胀后的密钥,膨胀后的密钥记为子密钥,原始的128位密钥经过膨胀会产生44个字(每个字为32位)的子密钥,这44个字的子密钥供11次AddRoundKey变换使用,一次AddRoundKey使用4个字(128位)的膨胀后的密钥。 密钥膨胀算法是以字为基础的(一个字由4个字节组成,即32比特)。 128比特的原始密钥经过膨胀后将产生44个字的子密钥,我们将这44个密钥保存在一个字数组中,记为W[44]。 128比特的原始密钥分成16份,存放在一个字节的数组:Key[0],Key[1]……Key[15]中。 在密钥膨胀算法中,Rcon是一个10个字的数组,在数组中保存着算法定义的常数,分别为:Rcon[0] = 0xRcon[1] = 0xRcon[2] = 0xRcon[3] = 0xRcon[4] = 0xRcon[5] = 0xRcon[6] = 0xRcon[7] = 0xRcon[8] = 0x1bRcon[9] = 0x另外,在密钥膨胀中包括其他两个操作RotWord和SubWord,下面对这两个操作做说明:RotWord( B0,B1,B2,B3 )对4个字节B0,B1,B2,B3进行循环移位,即RotWord( B0,B1,B2,B3 ) = ( B1,B2,B3,B0 )SubWord( B0,B1,B2,B3 )对4个字节B0,B1,B2,B3使用AES的S盒,即SubWord( B0,B1,B2,B3 ) = ( B’0,B’1,B’2,B’3 )其中,B’i = SubBytes(Bi),i = 0,1,2,3。 密钥膨胀的算法如下:八.解密过程AES的加密和解密过程并不相同,首先密文按128位分组,分组方法和加密时的分组方法相同,然后进行轮变换。 AES的解密过程可以看成是加密过程的逆过程,它也由10轮循环组成,每一轮循环包括四个变换分别为InvShiftRows变换、InvSubBytes变换、InvMixColumns变换和AddRoundKey变换;这个过程可以描述为如下代码片段所示:九.InvShiftRows变换InvShiftRows变换是ShiftRows变换的逆过程,十分简单,指定InvShiftRows的变换如下。 Sr,(c+shift(r,Nb))modNb= Sr,c for 0 < r< 4 and 0 ≤ c < Nb图2-2-6展示了这个过程。 图2-2-6AES算法InvShiftRows变换十.InvSubBytes变换InvSubBytes变换是SubBytes变换的逆变换,利用AES的S盒的逆作字节置换,表2-2-2为InvSubBytes变换的置换表。 表2-2-2InvSubBytes置换表十一.InvMixColumns变换InvMixColumns变换与MixColumns变换类似,每列乘以d(x)d(x) = (OB)x3 + (0D)x2 + (0G)x + (0E)下列等式成立:( (03)x3 + (01)x2 + (01)x + (02) )⊙d(x) = (01)上面的内容可以描述为以下的矩阵乘法:十二.AddRoundKey变换AES解密过程的AddRoundKey变换与加密过程中的AddRoundKey变换一样,都是按位与子密钥做异或操作。 解密过程的密钥膨胀算法也与加密的密钥膨胀算法相同。 最后状态矩阵中的数据就是明文。

加密技术02-对称加密-AES原理

AES 全称 Advanced Encryption Standard(高级加密标准)。它的出现主要是为了取代 DES 加密算法的,因为 DES 算法的密钥长度是 56 位,因此算法的理论安全强度是 2^56。但二十世纪中后期正是计算机飞速发展的阶段,元器件制造工艺的进步使得计算机的处理能力越来越强,所以还是不能满足人们对安全性的要求。于是 1997 年 1 月 2 号,美国国家标准技术研究所宣布希望征集高级加密标准,用以取代 DES。AES 也得到了全世界很多密码工作者的响应,先后有很多人提交了自己设计的算法。最终有5个候选算法进入最后一轮:Rijndael,Serpent,Twofish,RC6 和 MARS。最终经过安全性分析、软硬件性能评估等严格的步骤,Rijndael 算法获胜。

AES 密码与分组密码 Rijndael 基本上完全一致,Rijndael 分组大小和密钥大小都可以为 128 位、192 位和 256 位。然而 AES 只要求分组大小为 128 位,因此只有分组长度为 128位的 Rijndael 才称为 AES 算法。本文只对分组大小 128 位,密钥长度也为 128 位的 Rijndael 算法进行分析。密钥长度为 192 位和 256 位的处理方式和 128 位的处理方式类似,只不过密钥长度每增加 64 位,算法的循环次数就增加 2 轮,128 位循环 10 轮、192 位循环 12 轮、256 位循环 14 轮。

AES 加密算法的全面解剖:从密钥扩张到子密钥生成 (aes加密算法原理及步骤) 第1张

给定一个 128 位的明文和一个 128 位的密钥,输出一个 128 位的密文。这个密文可以用相同的密钥解密。虽然 AES 一次只能加密 16 个字节,但我们只需要把明文划分成每 16 个字节一组的块,就可以实现任意长度明文的加密。如果明文长度不是 16 个字节的倍数,则需要填充,目前填充方式主要是 PKCS7 / PKCS5。

下来主要分析 16 个字节的加解密过程,下图是 AES 算法框架。

密钥生成流程

G 函数

关于轮常量的生成下文会介绍。

主要作用:一是增加密钥编排中的非线性;二是消除AES中的对称性。这两种属性都是抵抗某些分组密码攻击必要的。

接下来详细解释一下几个关键步骤。

明文矩阵和当前回次的子密钥矩阵进行异或运算。

字节代换层的主要功能是通过 S 盒完成一个字节到另外一个字节的映射。

依次遍历 4 * 4 的明文矩阵 P 中元素,元素高四位值为行号,低四位值为列号,然后在 S 盒中取出对应的值。

行位移操作最为简单,它是用来将输入数据作为一个 4 * 4 的字节矩阵进行处理的,然后将这个矩阵的字节进行位置上的置换。ShiftRows 子层属于 AES 手动的扩散层,目的是将单个位上的变换扩散到影响整个状态当,从而达到雪崩效应。它之所以称作行位移,是因为它只在 4 * 4 矩阵的行间进行操作,每行 4 字节的数据。在加密时,保持矩阵的第一行不变,第二行向左移动 1 个字节、第三行向左移动 2 个字节、第四行向左移动 3 个字节。

列混淆层是 AES 算法中最为复杂的部分,属于扩散层,列混淆操作是 AES 算法中主要的扩散元素,它混淆了输入矩阵的每一列,使输入的每个字节都会影响到 4 个输出字节。行位移层和列混淆层的组合使得经过三轮处理以后,矩阵的每个字节都依赖于 16 个明文字节成可能。其实质是在有限域 GF(2^8) 上的多项式乘法运算,也称伽罗瓦域上的乘法。

伽罗瓦域

伽罗瓦域上的乘法在包括加/解密编码和存储编码中经常使用,AES 算法就使用了伽罗瓦域 GF(2^8) 中的运算。以 2^n 形式的伽罗瓦域来说,加减法都是异或运算,乘法相对较复杂一些,下面介绍 GF(2^n) 上有限域的乘法运算。

本原多项式:域中不可约多项式,是不能够进行因子分解的多项式,本原多项式是一种特殊的不可约多项式。当一个域上的本原多项式确定了,这个域上的运算也就确定了,本原多项式一般通过查表可得,同一个域往往有多个本原多项式。通过将域中的元素化为多项式的形式,可以将域上的乘法运算转化为普通的多项式乘法模以本原多项式的计算。比如 g(x) = x^3+x+1 是 GF(2^3) 上的本原多项式,那么 GF(2^3) 域上的元素 3*7 可以转化为多项式乘法:

乘二运算:无论是普通计算还是伽罗瓦域上运算,乘二计算是一种非常特殊的运算。普通计算在计算机上通过向高位的移位计算即可实现,伽罗瓦域上乘二也不复杂,一次移位和一次异或即可。从多项式的角度来看,伽罗瓦域上乘二对应的是一个多项式乘以 x,如果这个多项式最高指数没有超过本原多项式最高指数,那么相当于一次普通计算的乘二计算,如果结果最高指数等于本原多项式最高指数,那么需要将除去本原多项式最高项的其他项和结果进行异或。

比如:GF(2^8)(g(x) = x^8 + x^4 + x^3 + x^2 + 1)上 15*15 = 85 计算过程。

15 写成生成元指数和异或的形式 2^3 + 2^2 + 2^1 + 1,那么:

乘二运算计算过程:

列混淆 :就是把两个矩阵的相乘,里面的运算,加法对应异或运算,乘法对应伽罗瓦域 GF(2^8)上的乘法(本原多项式为:x^8 + x^4 + x^3 + x^1 + 1)。

Galois函数为伽罗瓦域上的乘法。

解码过程和 DES 解码类似,也是一个逆过程。基本的数学原理也是:一个数进行两次异或运算就能恢复,S ^ e ^ e = S。

密钥加法层

通过异或的特性,再次异或就能恢复原数。

逆Shift Rows层

恢复 Shift Rows层 的移动。

逆Mix Column层

通过乘上正矩阵的逆矩阵进行矩阵恢复。

一个矩阵先乘上一个正矩阵,然后再乘上他的逆矩阵,相当于没有操作。

逆字节代换层

通过再次代换恢复字节代换层的代换操作。

比如:0x00 字节的置换过程

轮常量生成规则如下:

算法原理和 AES128 一样,只是每次加解密的数据和密钥大小为 192 位和 256 位。加解密过程几乎是一样的,只是循环轮数增加,所以子密钥个数也要增加,最后轮常量 RC 长度增加。

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

AES 加密算法的全面解剖:从密钥扩张到子密钥生成 (aes加密算法原理及步骤) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
欢迎你第一次访问网站!