精华内容
下载资源
问答
  • 2012-03-03 13:40:56
     AES明文在加密过程中涉及到字节代换、行移位、列混合、轮密钥加等过程。这里对列混合的算法做出一些浅显的解释。
    列混合其实就是对一个状态的每一列去乘一个矩阵,其中乘法是在有限域GF(2^8)内进行的,不可约多项式为x^8+x^4+x^2+x+1如图:
    http://pic002.cnblogs.com/images/2010/169108/2010103102021588.png
    先把算法代码列出来:
    代码:

    void AES::MixColumns(unsigned char state[][4])    //列混合
    {


      unsigned char t[4];


      int r,c;


      for(c=0; c< 4; c++)      //按列处理


      {


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


        {


          t[r] = state[r][c];      //每一列中的每一个字节拷贝到t[r]中


        }


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


        {


          state[r][c] = FFmul(0x02, t[r])      //矩阵计算,其中加法为异或


                ^ FFmul(0x03, t[(r+1)%4])


                ^ FFmul(0x01, t[(r+2)%4])


                ^ FFmul(0x01, t[(r+3)%4]);
        }


      }


    }

    unsigned char AES::FFmul(unsigned char a, unsigned char b)    //有限域GF(2^8)上的乘法
    {


      unsigned char bw[4];


      unsigned char res=0;


      int i;


      bw[0] = b;


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


      {


        bw[i] = bw[i-1]<<1;


        if(bw[i-1]&0x80)


        {


          bw[i]^=0x1b;


        }


      }


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


      {


        if((a>>i)&0x01)


        {


          res ^= bw[i];


        }


      }


      return res;


    }

      

    这里重点是有限域GF(2^8)上的乘法。采用的算法的原理如下:1、  GF(2^8)中任何数乘0x01都不变2、  GF(2^8)中计算乘0x02,可以分两种情况考虑:(1)、原数值小于(1000 0000)2,即0x80的时候,乘2后第8个比特不会溢出,那么结果就是原数值左移一位;(2)、原数值大于(1000 0000)2,即0x80的时候,乘2后第8个比特会溢出,结果需要减去一个不可约多项式(x8+x4+x2+x+1),注意到GF(2^8)中的减法就是加法,那么结果就为原数值左移一位后(乘2)再与(0001 1011)2即0x1b进行异或(这里x8已经减掉了,只需要再减去x4+x2+x+1)。3、类似第2点,可以得到GF(2^8)中计算乘4、乘8的结果;4、GF(2^8)中计算乘其它数时,可以表示为乘1、2、4、8的线性组合。根据以上几点再对有限域GF(2^8)上的乘法源代码进行解释:

     

     
    

    代码:

    unsigned char AES::FFmul(unsigned char a, unsigned char b)    //有限域GF(2^8)上的乘法
    {
      unsigned char bw[4];
      unsigned char res=0;
      int i;
      bw[0] = b;
      for(i=1; i<4; i++)      //循环三次,分别得到参数b乘2、4、8后的值,储存到bw[i]里面
      {
        bw[i] = bw[i-1]<<1;    //原数值乘2
        if(bw[i-1]&0x80)    //判断原数值是否小于0x80
        {
          bw[i]^=0x1b;    //如果大于0x80的话,减去一个不可约多项式
        }
      }
      for(i=0; i<4; i++)
      {
        if((a>>i)&0x01)      //将参数a的值表示为1、2、4、8的线性组合
        {
          res ^= bw[i];
        }
      }
      return res;
    }

     

    更多相关内容
  • 美国国家标准与技术局(National Institute of Standard and Technology,NIST)于1997年1月提出发展AES(Advanced Encryption Standard)加密算法,并于同年9月12日推出AES的早期基本算法。在研究了一系列早期算法之后...
  • 在自己的学号后面补充6个零组成共16个字符作为明文,经过列混合得到16个字节的密文,密文以字符的形式输出显示(不以16进制显示),再经过逆列混合恢复出明文,运行结果截图粘贴在文档中。程序中至少包含三个自定义...

    这是《应用密码学》课程中的一次作业,我把他分享出来。

    在自己的学号后面补充6个零组成共16个字符作为明文,经过列混合得到16个字节的密文,密文以字符的形式输出显示(不以16进制显示),再经过逆列混合恢复出明文,运行结果截图粘贴在文档中。

    程序中至少包含三个自定义函数,其参考原型分别是:

    unsignedchar xtime(unsigned char input);//x乘法(’02’乘法)

    void mixcolum(unsigned char input[16],unsigned char output[16]);//列混合

    void imixcolum(unsigned char input[16],unsigned char output[16]);//逆列混合

    参考示例:

    假设某同学的学号是2008122212,则在后面补充6个零,形成2008122212000000,可定义明文为:

    unsigned char input[16]={'2','0','0','8','1','2','2','2','1','2','0','0','0','0','0','0'};

    1.[代码][C/C++]代码

    #include

    #include

    unsigned char xtime (unsigned char input)// x乘法('02'乘法)

    {

    int temp;

    temp = input<<1;

    if(input & 0x80)

    {

    temp ^= 0x1b;

    }

    return temp;

    }

    void mixcolum(unsigned char input[4][4], unsigned char output[4][4]) //列混合

    {

    int i, j;

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

    {

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

    {

    output[i][j] = xtime(input[i%4][j]) //0x02乘法

    ^ ( input[ ( i + 1 ) % 4][j] ^ xtime( input[ ( i + 1 ) % 4][j] ) ) //0x03乘法

    ^ input[ ( i + 2 ) % 4][j]//0x01乘法

    ^ input[ ( i + 3 ) % 4][j]; //0x01乘法

    }

    }

    }

    void imixcolum(unsigned char input[4][4], unsigned char output[4][4])//逆列混合

    {

    int i, j;

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

    {

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

    {

    output[i][j] = (xtime(xtime(xtime(input[i % 4][j]))) ^ xtime(xtime(input[i % 4][j]))^xtime(input[i % 4][j])) //0x0E乘法

    ^ (xtime(xtime(xtime(input[ ( i + 1 ) % 4][j]))) ^ xtime(input[ ( i + 1 ) % 4][j]) ^ input[ ( i + 1 ) % 4][j]) //0x0B乘法

    ^ (xtime(xtime(xtime(input[ ( i + 2 ) % 4][j]))) ^ xtime(xtime(input[ ( i + 2 ) % 4][j])) ^ input[ ( i + 2 ) % 4][j]) //0x0D乘法

    ^ (xtime(xtime(xtime(input[ ( i + 3 ) % 4][j]))) ^ input[ ( i + 3 ) % 4][j]); //0x09乘法

    }

    }

    }

    int main()

    {

    unsigned char input[4][4] = {'2','0','1','0','1','2','1','0','9','9','0','0','0','0','0','0'};

    unsigned char mixcolum_output[4][4];

    unsigned char imixcolum_output[4][4];

    int i, j;

    mixcolum(input,mixcolum_output);

    imixcolum(mixcolum_output,imixcolum_output);

    //以下代码是按格式输出:明文,列混合后的密文,逆列混合后恢复的明文

    printf("\n plaintext:\n\n");

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

    {

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

    {

    printf("%c ",input[i][j]);

    }

    }

    printf("\n\n after mixcolum:\n\n");

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

    {

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

    {

    printf("%c ",mixcolum_output[i][j]);

    }

    }

    printf("\n\n after imixcolum:\n\n");

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

    {

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

    {

    printf("%c ",imixcolum_output[i][j]);

    }

    }

    printf("\n");

    return 0;

    }

    2.[图片] 图片1.png

    20223057_2TRL.png

    展开全文
  • 关于AES的列混合计算和解密流程问题

    千次阅读 多人点赞 2021-01-18 19:45:22
    关于AES的列混合计算和解密流程问题 我们知道AES的加解密过程都可以用有限域中的计算表示出来。关于AES的加解密过程,很多教材资料都有详细描述,这里我想强调①关于AES加密过程中的MixColumn阶段是如何计算的;②...

    关于AES的列混合计算和解密流程问题

    我们知道AES的加解密过程都可以用有限域中的计算表示出来。关于AES的加解密过程,很多教材资料都有详细描述,这里我想强调①关于AES加密过程中的MixColumn阶段是如何计算的;②AES的解密流程问题。
    关于AES算法的全部代码可以看这个AES加解密算法全过程实现(C++)

    AES的列混合计算

    我们经常会看到参考资料说AES的列混合过程是对状态矩阵的每一列左乘一个确定的矩阵(如下图),一般表示为

    在这里插入图片描述

    然后我们乘了之后会发现结果并不对。事实上,这里表示的并不是简单的矩阵乘法,而是 G F ( 2 8 ) GF(2^{8}) GF(28)上的多项式模乘。

    从AES的列混合定义说起

    列混合的定义是:MixColumn(State)是将状态矩阵的每一列看成 G F ( 2 8 ) GF(2^{8}) GF(28)上的一个多项式,且与一个固定的多项式 c ( x ) = { 03 } x 3 + { 01 } x 2 + { 01 } x + { 02 } c(x)=\lbrace 03\rbrace x^{3}+\lbrace 01\rbrace x^{2}+\lbrace 01\rbrace x+\lbrace 02\rbrace c(x)={03}x3+{01}x2+{01}x+{02}相乘后模 x 4 + 1 x^{4}+1 x4+1。例如:对于状态矩阵的某一列
    ( a 0 a 1 a 2 a 3 ) \begin{pmatrix} a_{0} \\ a_{1}\\ a_{2}\\ a_{3} \end{pmatrix} a0a1a2a3
    看成多项式 a 3 x 3 + a 2 x 2 + a 1 x + a 0 a_{3}x^{3}+a_{2}x^{2}+a_{1}x+a_{0} a3x3+a2x2+a1x+a0,列混合就是计算 ( a 3 x 3 + a 2 x 2 + a 1 x + a 0 ) c ( x ) ( m o d ( x 4 + 1 ) ) (a_{3}x^{3}+a_{2}x^{2}+a_{1}x+a_{0})c(x)\pmod{(x^{4}+1)} (a3x3+a2x2+a1x+a0)c(x)(mod(x4+1))。这样的定义也才是符合"AES的加解密过程都可以用有限域中的计算表示出来"这句话嘛。

    那问题来了,这个多项式相乘的计算怎么就成上述的矩阵形式?这就关乎 x 4 + 1 x^{4}+1 x4+1这个多项式了。对于任意 x i x^{i} xi x i m o d ( x 4 + 1 ) = x i ( m o d 4 ) x^{i}mod(x^4+1)=x^{i\pmod{4}} ximod(x4+1)=xi(mod4)。例如: x 6 ≡ x 2 ( m o d x 4 + 1 ) x^{6}\equiv x^{2}\pmod{x^{4}+1} x6x2(modx4+1)。根据这个事实,我们可以计算多项式相乘再取模的结果(在计算时, x 6 x^{6} x6就等于 x 2 x^{2} x2 x 5 x^{5} x5就等于 x x x x 4 x^{4} x4就等于1):
    b 3 x 3 + b 2 x 2 + b 1 x + b 0 = ( a 3 x 3 + a 2 x 2 + a 1 x + a 0 ) ( { 03 } x 3 + { 01 } x 2 + { 01 } x + { 02 } ) = ( a 3 ∗ 03 ) x 6 + ( a 3 ∗ 01 + a 2 ∗ 03 ) x 5 + ( a 3 ∗ 01 + a 2 ∗ 01 + a 1 ∗ 03 ) x 4 + ( a 3 ∗ 02 + a 2 ∗ 01 + a 1 ∗ 01 + a 0 ∗ 03 ) x 3 + ( a 2 ∗ 02 + a 1 ∗ 01 + a 0 ∗ 01 ) x 2 + ( a 1 ∗ 02 + a 0 ∗ 01 ) x + a 0 ∗ 02 = ( a 3 ∗ 02 + a 2 ∗ 01 + a 1 ∗ 01 + a 0 ∗ 03 ) x 3 + ( a 3 ∗ 03 + a 2 ∗ 02 + a 1 ∗ 01 + a 0 ∗ 01 ) x 2 + ( a 3 ∗ 01 + a 2 ∗ 03 + a 1 ∗ 02 + a 0 ∗ 01 ) x + ( a 3 ∗ 01 + a 2 ∗ 01 + a 1 ∗ 03 + a 0 ∗ 02 ) b_{3}x^{3}+b_{2}x^{2}+b_{1}x+b_{0}=(a_{3}x^{3}+a_{2}x^{2}+a_{1}x+a_{0})(\lbrace 03\rbrace x^{3}+\lbrace 01\rbrace x^{2}+\lbrace 01\rbrace x+\lbrace 02\rbrace)=(a_{3}*03)x^{6}+(a_{3}*01+a_{2}*03)x^{5}+(a_{3}*01+a_{2}*01+a_{1}*03)x^{4}+(a_{3}*02+a_{2}*01+a_{1}*01+a_{0}*03)x^{3}+(a_{2}*02+a_{1}*01+a_{0}*01)x^{2}+(a_{1}*02+a_{0}*01)x+a_{0}*02\\ =(a_{3}*02+a_{2}*01+a_{1}*01+a_{0}*03)x^{3}+(a_{3}*03+a_{2}*02+a_{1}*01+a_{0}*01)x^{2}+(a_{3}*01+a_{2}*03+a_{1}*02+a_{0}*01)x+(a_{3}*01+a_{2}*01+a_{1}*03+a_{0}*02) b3x3+b2x2+b1x+b0=(a3x3+a2x2+a1x+a0)({03}x3+{01}x2+{01}x+{02})=(a303)x6+(a301+a203)x5+(a301+a201+a103)x4+(a302+a201+a101+a003)x3+(a202+a101+a001)x2+(a102+a001)x+a002=(a302+a201+a101+a003)x3+(a303+a202+a101+a001)x2+(a301+a203+a102+a001)x+(a301+a201+a103+a002)
    把上述结果写成矩阵形式,不正是
    ( b 0 b 1 b 2 b 3 ) = ( 02 03 01 01 01 02 03 01 01 01 02 03 03 01 01 02 ) ( a 0 a 1 a 2 a 3 ) \begin{pmatrix} b_{0}\\b_{1}\\b_{2}\\b_{3} \end{pmatrix}= \begin{pmatrix} 02 & 03 & 01 & 01\\ 01 & 02 & 03 & 01\\ 01 & 01 & 02 & 03\\ 03 & 01 & 01 & 02 \end{pmatrix} \begin{pmatrix} a_{0}\\a_{1}\\a_{2}\\a_{3} \end{pmatrix} b0b1b2b3=02010103030201010103020101010302a0a1a2a3
    所以现在你懂了这个矩阵式子表达的意思了吧。

    如何计算

    那这个矩阵如何计算呢?对于上面的矩阵,我们有 b 0 = 02 ∗ a 0 + 03 ∗ a 1 + 01 ∗ a 2 + 01 ∗ a 3 b_{0}=02*a_{0}+03*a_{1}+01*a_{2}+01*a_{3} b0=02a0+03a1+01a2+01a3。这里的02要转化成 G F ( 2 8 ) GF(2^{8}) GF(28)上的多项式 x x x。(因为02=00000010,写成多项式就是 x x x)同理,03,01和每个 a i a_{i} ai都要写成 G F ( 2 8 ) GF(2^{8}) GF(28)上的多项式,乘法和加法都是模 m ( x ) = x 8 + x 4 + x 3 + x + 1 m(x)=x^{8}+x^{4}+x^{3}+x+1 m(x)=x8+x4+x3+x+1上的加法和乘法(这是AES选的 G F ( 2 8 ) GF(2^{8}) GF(28)上的不可约多项式)。

    简化计算

    m ( x ) m(x) m(x)的加法很简单,就直接异或。乘法计算就比较复杂了。其实多项式相乘本就比较麻烦,这里还要模 m ( x ) m(x) m(x),而且这个 m ( x ) m(x) m(x)很不友好,不像模 ( x 4 + 1 ) (x^{4}+1) (x4+1)那么有特点,所以这个多项式模乘需要寻找更好的方法。这里就介绍一种较为方便的方法。我们观察上面的矩阵,发现每个 a i a_{i} ai只需乘01、02、03这3个数,并不用乘其他数,所以只要知道如何乘01,02,03即可。

    乘01

    01表示成多项式就是1,对任何 a i a_{i} ai 01 ∗ a i = a i 01*a_{i}=a_{i} 01ai=ai,再模 m ( x ) m(x) m(x)依旧是 a i a_{i} ai

    乘02

    02表示多项式 x x x,对任何 a i a_{i} ai a i ∗ 02 ( m o d m ( x ) ) a_{i}*02\pmod{m(x)} ai02(modm(x))相当于先把 a i a_{i} ai表示的二进制串左移1位。移位后,若首位上是1,则再将该二进制串的后8位异或0x1b得到结果;若首位上是0,取后8位就是结果。例如: a = 0 x 23 a=0x23 a=0x23, 转化乘二进制就是00100011, 0 x 23 ∗ 0 x 02 0x23*0x02 0x230x02应该这么计算:先左移1位成为001000110,首位(最左边)上是0,所以后8位01000110=0x46就是结果。再如 a = 0 x a 3 a=0xa3 a=0xa3,转化成二进制是10100011,计算 0 x a 3 ∗ 0 x 02 0xa3*0x02 0xa30x02:左移一位得101000110,首位是1,则取后8位异或0x1b得01011101,即0x5d。

    为什么是这样算?很简单,由于02表示多项式x, a i ∗ 02 a_{i}*02 ai02相当于 a i a_{i} ai的多项式乘x,也就是多项式系数不变,每一项次数加1,这不就是相当于左移一位嘛。再一步,要模 m ( x ) = x 8 + x 4 + x 3 + x + 1 m(x)=x^{8}+x^{4}+x^{3}+x+1 m(x)=x8+x4+x3+x+1如果乘完之后的多项式次数小于8,就不用模了,这就是上面说的首位为0的情况;如果乘完之后多项式次数等于8,就要模 m ( x ) m(x) m(x),但是稍加分析会发现此时的多项式一定是小于 2 m ( x ) 2m(x) 2m(x),所以模 m ( x ) m(x) m(x)的余式就相当于减 m ( x ) m(x) m(x)的结果,我们知道, G F ( 2 8 ) GF(2^{8}) GF(28)上的减就是异或, m ( x ) m(x) m(x)的后8位表示成16进制就是0x1b,所以异或0x1b,此时对应着上面的首位是1的情况

    乘03

    知道了01和02的乘法,03=01+02,可以利用分配律计算出03。

    例如: 03 × a 3 = ( 01 + 02 ) × a 3 = 01 × a 3 + 02 × a 3 = a 3 + 5 d = f e 03\times a3=(01+02)\times a3=01\times a3+02\times a3=a3+5d=fe 03×a3=(01+02)×a3=01×a3+02×a3=a3+5d=fe.

    在AES解密的时候,也可以通过这种方法计算。

    解密流程

    我们知道加密过程每一轮的轮函数包括:字节替换、行移位、列混合、轮密钥加,并且顺序是固定的。需要指出的是,解密时的轮函数的顺序是:逆行移位、逆字节替换、轮密钥加、逆列混合。如果不理解的看下图便很明白!
    在这里插入图片描述
    参考:
    AES加解密算法详解

    展开全文
  • AES算法列混合,用C语言的。需要的话来看看吧
  • #include <stdio.h> #include <stdlib.h> //函数声明 unsigned char xtime (unsigned char input; void mixcolum(unsigned char input[4][4], unsigned char output[4][4];版权文档请勿用做商业用途 void imixcolum...
  • 由于AES算法的硬件实现较为复杂,在此提出一种优化算法中S—box和列混合单元的方法。其中S—box通过组合和有限域映射的方法进行优化,列混合单元使用算式重组的方法进行优化。这些优化设计通过组合逻辑实现,经过...
  • 阐述了利用离子束刻蚀技术制作线长方状拱面石英微透镜阵列的工艺方法,对所制微光学元件的光学性能进行了...实验结果表明,混合型的石英微透镜/红外探测器结构显著改善了线YBCO高温超导薄膜红外探测器的光响应特性。
  • AES加密算法之列混合变换

    千次阅读 2017-11-13 23:38:36
    列混合即是用一个常矩阵乘以第二步变换后的矩阵,以达到矩阵中每一个元素都是该元素原所在列所有元素的加权和。 除去对角线的算一个其他的表格的数:原表中的 6E如何经过变换得到 37

    在AES算法中,需要模多项式m(x)=x^8+x^4+x^3+x+1。列混合即是用一个常矩阵乘以第二步变换后的矩阵,以达到矩阵中每一个元素都是该元素原所在列所有元素的加权和。




    除去对角线的算一个其他的表格的数:原表中的    6E如何经过变换得到 37




    展开全文
  • c#DataGridView数据绑定示例 多列混合排序,C#新建DataColumn类时Type类型参数的生成方式,获取当前编辑单元格的内容,以及当前编辑的单元格在哪一行哪一列。
  • AES混合列变换详细讲解

    千次阅读 2019-04-16 08:16:54
    混合列变换的详细讲解 AES的混合列变换是把矩阵C作用到中间块上。选取模m(x) = x4+1x^4+1x4+1构造有限域,在该域上计算出01*d4 + 02*bf + 03*5d+01*30的结果。 首先个表很有用 二进制 十六进制 0000 0 ...
  • 人教二年级数学下册混合运算看图式计算和应用题PPT课件.pptx
  • 100以内加减法混合列竖式运算练习.pdf
  • 加减混合看图式练习题.doc
  • 人教二年级数学下册混合运算看图式计算和应用题学习教案.pptx
  • 本文考察了一组混合排列向液晶盒的电光响应特性,重点研究了透射光强随外电压的变化及响应时间与外电场的关系,计算了作为外电压及开启时间函数的双折射。应用液晶的线性响应理论分析了实验结果,理论与实验基本相符...
  • 一年级数学上册连加连减、加减混合看图式题精选.doc
  • 分数混合运算(看图式)练习题.pdf
  • 强锚泊混合排列向相(HAN)液晶盒中,挠曲电效应会对液晶指向矢分布产生影响,这种变化可以通过改进的液晶全漏导模技术实验进行测量。基于液晶多层光学理论和液晶弹性理论,计算得到强锚泊混合排列向相全漏液晶...
  • Verilog入门——AES实现

    千次阅读 2021-02-06 13:09:52
    03 列混合与逆列混合 列混合通过矩阵相乘实现:新的状态矩阵=列混合矩阵×原本的状态矩阵。 逆列混合通过矩阵相乘实现:新的状态矩阵=逆列混合矩阵×原本的状态矩阵。 (其中逆列混合矩阵与列混合矩阵相乘恰好为...
  • 新人教二年级数学下册混合运算出综合算式练习PPT学习教案.pptx
  • 分数混合运算看图式练习题.doc
  • Bayes GMM:贝叶斯高斯混合模型 概述 有限贝叶斯高斯混合模型 (FBGMM) 和无限高斯混合模型 (IGMM) 都是使用折叠吉布斯采样实现的。 示例和测试代码 运行make test来运行单元测试。 运行make test_coverage以检查...
  • 客户端与服务器交互使用AES+RSA混合加密原理详解

    万次阅读 多人点赞 2017-09-28 10:45:20
    在轮函数的每一轮迭代中,包括四步变换,分别是字节代换运算(ByteSub())、行变换(ShiftRows())、列混合(MixColumns())以及轮密钥的添加变换AddRoundKey()[3],其作用就是通过重复简单的非线形变换、混合函数变换,将...
  • 二年级竖式加减混合计算题.doc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 159,493
精华内容 63,797
关键字:

列混合

友情链接: code.rar