最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

AES加密算法实现流程

来源:动视网 责编:小OO 时间:2025-09-23 18:42:24
文档

AES加密算法实现流程

由于AES的数学原理在网上有很多,所以在这里就不再说明,主要是加密流程。先说明一下AES的几个必备参数的初始化typedefstruct_AES{  int  Nb;                //明文或密文的行数 int  Nr;                //加密或解密时的轮数 int  Nk;                //密钥的行数       unsignedlong  *Word; //指向密钥库的指针 unsignedlong  *State; //指向每一轮加密或解
推荐度:
导读由于AES的数学原理在网上有很多,所以在这里就不再说明,主要是加密流程。先说明一下AES的几个必备参数的初始化typedefstruct_AES{  int  Nb;                //明文或密文的行数 int  Nr;                //加密或解密时的轮数 int  Nk;                //密钥的行数       unsignedlong  *Word; //指向密钥库的指针 unsignedlong  *State; //指向每一轮加密或解
由于AES的数学原理在网上有很多,所以在这里就不再说明,主要是加密流程。

先说明一下AES的几个必备参数的初始化

typedef struct _AES{

  int  Nb;                 //明文或密文的行数

  int  Nr;                 //加密或解密时的轮数

  int  Nk;                 //密钥的行数      

  unsigned long   *Word;  //指向密钥库的指针

  unsigned long   *State;  //指向每一轮加密或解后的结果

}AES;

这里统一为4列n行,可以用unsigned long数组表示。

Nb = 明文或密文长度/4 ;Nk = 密钥长度/4;加密轮数Nr = Nb < Nk ? Nk:Nb+6;

 

一.密钥库的生成过程

  1.计算库的行数并分配内存

    库行数  = Nb*(Nr+1);

  2.初始化密钥库

    库的第一个密钥为原密钥---直接将密钥拷贝到密钥库中;

  3.开始计算轮密钥

    unsigned long temp;

    for (int c = Nk; c < Nb * (Nr+1); ++c)

    {

       //把上一轮的最后一行放入temp

       temp = w[c-1];

       //判断是不是每一轮密钥的第一行

       if (c % Nk == 0) 

       {

          //左旋8位

          temp = (temp<<8)|(temp>>24);

          //查Sbox表

          SubWord((byte*)&temp);

          temp ^= Rcon[c/Nk];

        }

        else if ( Nk > 6 && (c % Nk == 4) ) 

        {

          SubWord((byte*)&temp);

        }

        //w[c-Nk] 为上一轮密钥的第一行

        w[c] = w[c-Nk] ^ temp;

       }

 

二.State生成

   为了实现快速列混淆(这里应该是行混淆),State需要多出三行作为缓冲区。

   所以State = new unsigned long[Nb+3];

   当解密时State += 3;加密时不变。

AES算法中行混淆的实现:

   加密时第1,2,3列(从0开始)分别上旋(解密时下旋)1,2,3个字节。

   先拷贝前三行到State的最后三行(就是拷贝到多出来的那三行)。

   设temp(unsigned char temp[4])为行混淆后第n行的数据。

   设Nb = 4,那么加密时的逻辑结构为:(空白为无效数据)

     拷贝前:              拷贝后:               处理完后的结果:

      c0   c1   c2   c3   c0   c1   c2   c3     c0   c1   c2   c3

--------------------- --------------------- ---------------------

| s0 | s1 | s2 | s3 | | s0 |    |    |    | | t0 | t5 | ta | tf |

--------------------- --------------------- ---------------------

| s4 | s5 | s6 | s7 | | s4 | s5 |    |    | | t4 | t9 | te | t3 |

--------------------- --------------------- --------------------- 

| s8 | s9 | sa | sb | | s8 | s9 | sa |    | | t8 | td | t2 | t7 |

--------------------- --------------------- ---------------------

| sc | sd | se | sf | | sc | sd | se | sf | | tc | t1 | t6 | tb |

--------------------- --------------------- ---------------------

|    |    |    |    | |    | s1 | s2 | s3 | |    |    |    |    | 

--------------------- --------------------- --------------------- 

|    |    |    |    | |    |    | s6 | s7 | |    |    |    |    |

--------------------- --------------------- ---------------------

|    |    |    |    | |    |    |    | sb | |    |    |    |    |

--------------------- --------------------- ---------------------

   则temp = {s0,s5,sa,sf};temp值经其它运算后放入State的第n行。

   下面是解密时的情况

    拷贝前:              拷贝后:               处理完后的结果: 

     c0   c1   c2   c3   c0   c1   c2   c3     c0   c1   c2   c3

--------------------- --------------------- ---------------------

|    |    |    |    | |    |    |    | s7 | |    |    |    |    |

--------------------- --------------------- ---------------------

|    |    |    |    | |    |    | sa | sb | |    |    |    |    |

--------------------- --------------------- --------------------- 

|    |    |    |    | |    | sd | se | sf | |    |    |    |    |

--------------------- --------------------- ---------------------

| s0 | s1 | s2 | s3 | | s0 | s1 | s2 | s3 | | t0 | td | ta | t7 |

--------------------- --------------------- ---------------------

| s4 | s5 | s6 | s7 | | s4 | s5 | s6 |    | | t4 | t1 | te | tb | 

--------------------- --------------------- --------------------- 

| s8 | s9 | sa | sb | | s8 | s9 |    |    | | t8 | t5 | t2 | tf |

--------------------- --------------------- ---------------------

| sc | sd | se | sf | | sc |    |    |    | | tc | t9 | t6 | t3 |

--------------------- --------------------- ---------------------

三.开始加密

  1.初始化第一轮

    State ^= 密钥库的第一轮密钥

  2.共Nr-1轮

    (1).先拷贝前三行到State的最后三行(就是拷贝到多出来的那三行)。

    (2).temp = {Sbox[s0],Sbox[s5],Sbox[sa],Sbox[sf]};

    (3).State第n行

        第一个字节=Log_02[temp[0]]^Log_03[temp[1]]^temp[2]^temp[3];

        第二个字节=Log_02[temp[1]]^Log_03[temp[2]]^temp[3]^temp[0];

        第三个字节=Log_02[temp[2]]^Log_03[temp[3]]^temp[0]^temp[1];

        第四个字节=Log_02[temp[3]]^Log_03[temp[0]]^temp[1]^temp[2];

    (4).State的当前行 ^= 密钥库的第n轮密钥相应行;

        再跳到(2),进行State的下一行计算

  3.最后一轮

    (1).先拷贝前三行到State的最后三行(就是拷贝到多出来的那三行)。

    (2).State的当前行 = {Sbox[s0],Sbox[s5],Sbox[sa],Sbox[sf]};

    (3).State的当前行 ^= 密钥库的最后一轮密钥相应行;

        再跳到(2),进行State的下一行计算

四.开始解密

  与加密时相反,从最后一轮开始。

  1.初始化最后一轮

    State ^= 密钥库的最后一轮密钥

  2.共Nr-1轮(Nr-1=>0)

    (1).先拷贝State的最后三行到State的前三行。

    (2).temp = {iSbox[s0],iSbox[sd],iSbox[sa],iSbox[s7]};

    (3).State的当前行 ^= 密钥库的第n轮密钥的相应行;

    (4).State第n行

        第一个字节 = Log_0e[temp[0]] ^ Log_0b[temp[1]] ^

                    Log_0d[temp[2]] ^ Log_09[temp[3]];

        第二个字节 = Log_0e[temp[1]] ^ Log_0b[temp[2]] ^

                    Log_0d[temp[3]] ^ Log_09[temp[0]];

        第三个字节 = Log_0e[temp[2]] ^ Log_0b[temp[3]] ^

                    Log_0d[temp[0]] ^ Log_09[temp[1]];

        第四个字节 = Log_0e[temp[3]] ^ Log_0b[temp[0]] ^

                    Log_0d[temp[1]] ^ Log_09[temp[2]];

        再跳到(2),进行State的下一行计算

  3.最后一轮

    (1).先拷贝State的最后三行到State的前三行。

    (2).State的当前行 = {iSbox[s0],iSbox[sd],iSbox[sa],iSbox[s7]};

    (3).State的当前行 ^= 密钥库的第一轮密钥相应行;

        再跳到(2),进行State的下一行计算

文档

AES加密算法实现流程

由于AES的数学原理在网上有很多,所以在这里就不再说明,主要是加密流程。先说明一下AES的几个必备参数的初始化typedefstruct_AES{  int  Nb;                //明文或密文的行数 int  Nr;                //加密或解密时的轮数 int  Nk;                //密钥的行数       unsignedlong  *Word; //指向密钥库的指针 unsignedlong  *State; //指向每一轮加密或解
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top