zoukankan      html  css  js  c++  java
  • AES算法

    AES算法

    AES(Advanced Encryption Standard),是一种替代了DES加密算法的另一种分组加密算法,需要注意的是AES算法并不属于Feistel分组加密算法结构的算法。

    AES加密算法在最初设计的时候分组长度和密钥长度都是可变的,可以分别为128bits、160bits、192bits、224bits和256bits。但最后还是选取了以128bits为分组长度,密钥长度可以为128bits、192bits和256bits

    下表是AES算法迭代轮数、密钥长度和分组长度之间的关系:

    AES算法加密流程

    本文以密钥长度为128位的情况进行解释,AES算法对明文以字节为单位进行处理,首先将明文的前四个字节组成一列,接下来的四个字节组成第二列,后面的字节一次组成第三和第四列,则组成了一个4×4的二维矩阵,如下图:

     这样输入的16个字节便排成了一个二维数组,称之为状态矩阵。AES的加密和解密变换都是基于状态矩阵进行的,在中间结果上的不同变换操作称为状态。

    下图是AES加密算法的大致流程:

                                    

    明文在开始进行迭代加密之前需要与轮密钥进行一次异或操作,迭代的次数为Nr-1,也就是说128位密钥的AES算法需要先进行9轮的迭代,因为第十轮也就是最后一轮迭代不需要进行列混合变换。

    迭代运算的第一步是字节代替,这是一种非线性、可逆的字节代替变换,它作用在状态的每个字节上,利用字节替换表进行替换,下图是字节替换表,替换表的每行和每列都用一个1位的16进制数编号

    其替换规律是:对每个字节,以前4四位对应的16进制数为行编号,以后4位对应的16进制数为列编号,用替换表中对应位置中的字节替换该字节。

    接下来是行移位变换,对于状态矩阵中的每一行进行相应的循环左移操作,第一行循环左移0个字节,第二行循环左移1个字节,第三行循环左移2字节,第四行循环左移3个字节,如下图:

    列混合变换使用特殊的加法和乘法,也就是基于有限域GF(28),有限域GF(28)有一组从0x00到0xff的256个值组成,GF(28)中的加法是异或操作,乘法具有以下规律,乘以0x01的结果等于其本身,乘以0x02的结果分为两类,如果被乘的值小于0x80,乘法的结果就是该值左移一位;如果被乘的值大于或等于0x80,乘法的结果就是该值左移一位再与0x1b进行异或。

    AES中的列混合变换需要知道七个常量0x01、0x02、0x03、0x09、0x0b、0x0d和0x0e的乘法结果:

    与0x01相乘:temp×ox1=x

    与0x02相乘:temp×0x02=temp左移一位

    与0x03相乘:temp×ox03=temp×(0x02 XOR 0x01)=(temp×0x02) XOR temp=(temp左移一位) XOR temp

    与0x09相乘:temp×ox09=temp×(0x08 XOR 0x01)=(temp×0x08) XOR temp=(temp左移三位) XOR temp

    以此类推

    AES算法中的列混合变换是将状态数组上的每个列看成有限域GF(28)上的多项式,然后与一个固定的多项式c(x)进行模M=x4+1乘法,在加密过程中的列混合变换中的固定的多项式c(x)=3x3+1x2+1x+2,而在解密过程中的列混合变换中的固定的多项式c(x)=bx3+dx2+9x+e,如下图:

    加密的列混合变换:

     

     解密的列混合变换:

     

    经过列混合变换之后就是与子密钥进行异或操作,这一步操作只需要简单地将密钥按位异或到一个状态上,每个轮密钥的长度为4个字节,每轮加密的密钥按顺序取自扩展密钥,扩展密钥是由初始密钥扩展而成。在密钥长度为128位的情况下,一个分组的加密过程的轮密钥长度总和为44个字节。

    AES算法解密流程

                                     

    密文与轮密钥进行了异或操作之后进入迭代操作,迭代操作的第一步是逆行移位操作,这一步与加密过程中的行移位操作相反,第一行保持不变,第二行循环右移一个字节,第三行循环右移两个字节,第四行循环右移三个字节。如下图:

    然后是逆字节替换操作,这一步的原理与加密操作中的字节替换一样,只不过字节替换表不同:

     进行了逆字节替换操作之后就是与轮密钥进行异或操作,这一步与加密过程中的轮密钥异或操作相同。

    迭代操作中的最后一步是逆列混合变换,其原理与加密过程中的列混合变换一样,只不过固定的多项式c(x)有所不同。

    AES密钥编排

    密钥编排是指从种子密钥得到轮密钥的过程,它由密钥扩展和轮密钥选区两个阶段构成。

    轮密钥的总长度为4×(Nr+1)个字节;种子密钥经过扩展算法运算后称为扩展密钥,轮密钥按顺序取自扩展密钥。

  • 相关阅读:
    BZOJ 1449: [JSOI2009]球队收益 最小费用最大流 网络流
    HDU 4348 To the moon 主席树 在线更新
    省选模拟赛20180416
    线性基总结
    Write-up-Bulldog2
    [Write-up]BSides-Vancouver
    Write-up-Bob_v1.0.1
    Genymotion设置代理至BurpSuite和Charles
    PE之RVA转FOA
    django的序列化
  • 原文地址:https://www.cnblogs.com/TheFutureIsNow/p/10794184.html
Copyright © 2011-2022 走看看