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

    AES算法简介

    一、 AES的结构

     

    1、总体结构

    明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位)。根据密钥的长度,算法被称为AES-128,AES-192或者AE-256。

    clip_image002

    2、明文密钥组织方式

    (@2CQP15US3}R09LZ7F8RRN

     

    3、一些相关的的术语定义和表示

    状态(State):密码运算的中间结果称为状态。

    State的表示:状态用以字节为基本构成元素的矩阵阵列来表示,该阵列有4行,列数记为Nb。 Nb=分组长度(bits)÷ 32。Nb可以取的值为4,对应的分组长度为128bits。

    密码密钥(Cipher Key)的表示: Cipher Key类似地用一个4行的矩阵阵列来表示,列数记为Nk。Nk=密钥长度(bits)÷32。Nk可以取的值为4,6,8,对应的密钥长度为128, 192, 256 bits。

     

    4、详细过程

    由四个不同的变换组成,包括一个置换和三个替代:

    字节代替(SubBytes): 用一个S盒完成分组的字节到字节的代替。

    行移位(ShiftRows):一个简单的置换。

    列混淆(MixColumns):利用域GF(28)上的算术特性的一个代替。

    轮密钥加(AddRoundKey):当前分组和扩展密钥的一部分进行按位XOR(异或)。

    clip_image006

    输入的密钥被扩展成由44个32位子所组成的数组w[i],由上图可知,每轮有四个不同的字(128位)作为该轮到密钥。

    对加密和解密的操作,算法由轮密钥加开始,接着执行9轮迭代运算,每轮都包含所有4个阶段的代替,接着是第10轮的三个阶段。

    仅仅在轮密钥加阶段使用密钥。由于这个原因,该算法以轮密钥加开始,以轮密钥加结束。

     

    二、AES的变换函数

     

    1、字节替代

    正向和逆向变换。被称为字节代替的正向字节代替变换是一个简单的查表操作。

    映射方式:把该字节的高4位作为行值,低4位作为列值,以这些行列值作为索引从S盒中对应位置取出元素作为输出。例如,十六进制数{95}所对应的S盒的行值是9,列值是5,S盒中在此位置的值是{2A},相应的{95}被映射为{2A}。

    clip_image008

    clip_image010

    下面是一个字节代替的例子:

    0$PX88P2L$T6LT29YSANZ~R

     

    2、行移位

    正向和逆向变换。正向行移位,state的第一行保持不变。把state的第二行循环左移一个字节,state的第三行循环左移两个字节,state的第四行循环左移三个字节。

    行移位变换的例子:

    45~C`_81$YB%UO)()H%$USH

    逆向行移位将state中的后三行执行相反方向的移位操作,如第二行向右循环移位一个字节,其他类似操作。

     

    3、列混淆

    正向和逆向变换。

    列混淆变换的正向列混淆变换对每列独立地进行操作。每列中的每个字节被映射为一个新值,此值由该列中的4个字节通过函数变换得到。

    列混淆例子:

    M3SVEDHJ`%LE]4Z5583E2X9

    计算过程:

    47 = (02•87)⊕(03•6E)⊕(01•4A)⊕(01•A6)

    其中:

    02•87 = 02•10000111B = 00001110B⊕00011011B = 00010101B = 15

    03•6E = (01⊕02)•6E = (01•6E)⊕(02•6E)

             = 01101110B⊕(11011100B) = 10110010B = B2

    01•46 = 46

    01•A6 = A6

    15⊕B2⊕46⊕A6 = 47

    注意: G(28)上的运算

    加法:按位异或

    乘法:可通过对多个中间结果的移位运算和异或一个特定的比特串(比如00011011)实现。(与最高位b7有关)

    [874JN)~DR[P)O7[DYXPOSS

    逆向列混淆变换可以再乘以矩阵的逆得到

    W@A@2QH)IJ9GT1`8JY$$UZQ

     

    4、轮密钥加

    正向和逆向变换。

    在轮密钥加中,128位的state按位与128位的轮密钥XOR。

    3VLGY(@14ISB)WAH8$7MMIC

    逆向轮密钥加变换是和正向轮密钥加变换一样的,因为异或操作是其本身的逆。

    A⊕B⊕B = A

    单轮AES输入:

    clip_image021

     

    5、用伪代码表示的Rijndael加密算法

    Rijndael ( State, CipherKey )

    {

    KeyExpansion ( CipherKey, ExpandedKey );

    AddRoundKey ( State, ExpandedKey );

    For ( i=1; i<Rnd; i++ )

           Round ( State, ExpandedKey + Nb*i );

    FinalRound ( State, ExpandedKey + Nb*Rnd );

    }

     

    三、密钥扩展

    clip_image023

    clip_image025

    clip_image027

    clip_image029

     

    密钥扩展伪代码描述

    KeyExpansion ( byte, Key[16],word w[44] )

    {

    word temp;

    for (i = 0;i < 4; i++)

         w[i] = (key[4*i],key[4*i+1], key[4*i+2], key[4*i+3]);

    for (i = 4;i < 44; i++)

    {   temp = w[i - 1];

        if (i mod 4 = 0) temp = SubWord(RotWord(temp)) + Rcon[i/4];

        w[i] = w[i-4] + temp;

    }

    }

    输入密钥直接被复制到扩展密钥数组的前四个字节。然后每次用四个字节填充扩展密钥数组余下的部分。在扩展密钥数组中,每一个新增的字w[i]的值依赖于w[i-1] w[i-4]。

     

    四、等价的解密算法

     

    交换逆向行移位和逆向字节代替

    逆向移行[逆向字节代替(Si)] = 逆向字节代替[逆向移行 (Si)]

    交换轮密钥加和逆向列混淆

    逆向列混淆(Siwj) = [逆向列混淆(Si)] ⊕[逆向列混淆(wj)]

    clip_image031

     

    五、参考文献

    [1] William Stallings著;王张宜等译. 密码编码学与网络安全——原理与实践(第五版)[M]. 北京:电子工业出版社,2012.1.

    [2]密码算法详解——AES

    [3]AES加密算法动画演示

  • 相关阅读:
    POJ 1953 World Cup Noise
    POJ 1995 Raising Modulo Numbers (快速幂取余)
    poj 1256 Anagram
    POJ 1218 THE DRUNK JAILER
    POJ 1316 Self Numbers
    POJ 1663 Number Steps
    POJ 1664 放苹果
    如何查看DIV被设置什么CSS样式
    独行DIV自适应宽度布局CSS实例与扩大应用范围
    python 从入门到精通教程一:[1]Hello,world!
  • 原文地址:https://www.cnblogs.com/OneFri/p/5924605.html
Copyright © 2011-2022 走看看