精华内容
下载资源
问答
  • AES加密算法之列混合变换

    万次阅读 多人点赞 2015-11-17 22:22:53
    列混合即是用一个常矩阵乘以第二步变换后的矩阵,以达到矩阵中每一个元素都是该元素原所在列所有元素的加权和。 附上自己敲的C语言源码: #include using namespace std; void PrintfMatrix(unsigned char m[4]...

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


    例题:



    附上自己敲的C语言源码:

    #include <iostream>
    using namespace std;
    
    void PrintfMatrix(unsigned char m[4][4])
    {
    	for(int i=0;i<4;i++)
    	{
    		for(int j=0;j<4;j++)
    		{
    		printf("%4x",m[i][j]);
    		if(j%4==3)
    			puts("");
    		}
    		
    	}
    }
    unsigned char xtime(unsigned char st)
    {
    	return (st<<1)^((st&0x80)?0x1b:0x00);     //x乘法   二进制串左移一位,判断最高位是否溢出,溢出要异或0x1b
    }
    void mixcolumns(unsigned char state[4][4],unsigned char cipher[4][4])
    {
    	for(int j=0;j<4;j++)
    	{
    		for(int i=0;i<4;i++)
    		{
    			cipher[i][j]=xtime(state[i%4][j])      //0x02乘法
    				         ^(state[(i+1)%4][j])^xtime(state[(i+1)%4][j])//0x03乘法
    					  ^state[(i+2)%4][j]      //0x01乘法
                                              // ^state[(i+2)%4][j];     //0x01乘法   这句写错了,so结果不对,应该是i+3
    					   ^state[(i+3)%4][j];     //0x01乘法
    		}
    	}
    }
    int main()
    {
    	unsigned char state[4][4]={
    		/*0,4,8,12,
    		   1,5,9,13,
    		   2,6,10,14,
    		   3,7,11,15,*/
    		0x87,0xF2,0x4D,0x97,
    		   0x6E,0x4C,0x90,0xEC,
    		    0x46,0xE7,0x4A,0xC3,
    		    0xA6,0x8C,0xD8,0x95,
    	};
    	unsigned char cipher[4][4]; 
    	printf("明文为:\n");PrintfMatrix(state);
    	mixcolumns(state,cipher);
    	printf("列混合结果:\n");PrintfMatrix(cipher);
    	return 0;
    }
    编译结果如下:



    展开全文
  • 关于AES的列混合计算和解密流程问题 我们知道AES的加解密过程都可以用有限域中的计算表示出来。关于AES的加解密过程,很多教材资料都有详细描述,这里我想强调①关于AES加密过程中的MixColumn阶段是如何计算的;②...

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

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

    AES的列混合计算

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

    在这里插入图片描述

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

    从AES的列混合定义说起

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

    那问题来了,这个多项式相乘的计算怎么就成上述的矩阵形式?这就关乎x4+1x^{4}+1这个多项式了。对于任意xix^{i}ximod(x4+1)=xi(mod4)x^{i}mod(x^4+1)=x^{i\pmod{4}}。例如:x6x2(modx4+1)x^{6}\equiv x^{2}\pmod{x^{4}+1}。根据这个事实,我们可以计算多项式相乘再取模的结果(在计算时,x6x^{6}就等于x2x^{2}x5x^{5}就等于xxx4x^{4}就等于1):
    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_{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)
    把上述结果写成矩阵形式,不正是
    (b0b1b2b3)=(02030101010203010101020303010102)(a0a1a2a3) \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}
    所以现在你懂了这个矩阵式子表达的意思了吧。

    如何计算

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

    简化计算

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

    乘01

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

    乘02

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

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

    乘03

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

    例如:03×a3=(01+02)×a3=01×a3+02×a3=a3+5d=fe03\times a3=(01+02)\times a3=01\times a3+02\times a3=a3+5d=fe.

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

    解密流程

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

    展开全文
  • AES明文在加密过程中涉及到字节代换、行移位、列混合、轮密钥加等过程。这里对列混合的算法做出一些浅显的解释。 列混合其实就是对一个状态的每一列去乘一个矩阵,其中乘法是在有限域GF(2^8)内进行的,不可约多项式...

     AES明文在加密过程中涉及到字节代换、行移位、列混合、轮密钥加等过程。这里对列混合的算法做出一些浅显的解释。
    列混合其实就是对一个状态的每一列去乘一个矩阵,其中乘法是在有限域GF(2^8)内进行的,不可约多项式为x^8+x^4+x^2+x+1如图:

    先把算法代码列出来:

    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;
    }
    

     

    展开全文
  • 网站常见的布局方式主要有一布局,二布局,三布局和混合布局。 一布局 效果图: 代码: CSS: body{margin:0;padding: 0;} .top{height:100px;background: blue;} .main{width:800px;...

    常见网站布局

    网站常见的布局方式主要有一列布局,二列布局,三列布局和混合布局。

    一列布局

    效果图:

    一列布局

    代码:

    • CSS:
        body{margin:0;padding: 0;}
        .top{height:100px;background: blue;}
        .main{width:800px;height:300px;background: #ccc;margin:0 auto;}
        .foot{width: 800px;height:100px;background: red;margin: 0 auto;} 
    
    • HTML:
        <div class="top"></div>
        <div class="main"></div>
        <div class="foot"></div>
    
    • 说明:

    页面中有三块div,头底和中间内容部分,三部分都设置了固定的高度,顶部的宽度不设置,在实际开发中main部分一般不设置固定高度,而是可随着内容的多少而多高,可以参考新浪网

    二列布局

    效果图:

    二列布局

    代码:

    • CSS:
    body{margin:0;padding: 0;}
    .main{width:600px;margin:0 auto;}
    .left{width: 200px;height:300px;background: #ccc;float:left;}
    .right{width:400px;height:300px;background: #ddd;float:right;}
    
    
    • HTML:
    <div class="main">
        <div class="left"></div>    
        <div class="right"></div>
    </div>
    
    
    • 说明:

    二列布局的宽高一般是固定的,所以一般外面再套一层main,用这个main来固定宽高。

    三列布局

    效果图:

    三列布局

    代码:

    • CSS:
    body{margin:0;padding: 0;}
    .left{width: 200px;height:500px;background: #ccc;position:absolute;left: 0;top: 0;}
    .middle{background: blue; height: 500px;margin:0 200px 0 200px;}
    .right{width:200px;height:500px;background: red;position: absolute;right: 0;top: 0;}
    
    
    • HTML:
    <div class="left"></div>    
    <div class="middle">sdfsdfsdfsdfsdf</div>
    <div class="right"></div>
    
    
    • 说明:

    三列布局,让left绝定定位到左侧,right绝定定位到右侧,中间不设宽度,则可以随浏览器自适应,这里要用absolute的方式来定位,用float难以实现。

    混合布局

    效果图:

    混合布局

    代码:

    • CSS:
    body{margin:0;padding: 0;}
    .top{height:100px;background: blue;}
    .head{height: 100px;width: 800px;background: #f60;margin: 0 auto;}
    .main{width:800px;height:300px;background: #ccc;margin:0 auto;}
    .left{width:200px;height: 300px;background: #eee;float: left;}
    .right{width:600px;height: 300px;background: #369;float: right;}
    .foot{width: 800px;height:100px;background: red;margin: 0 auto;}
    
    
    • HTML:
    <div class="top">
        <div class="head"></div>
    </div>
    <div class="main">
        <div class="left"></div>
        <div class="right"></div>
    </div>
    <div class="foot"></div>
    
    
    • 说明:

    常见网站的布局都是混合布局,上面的混合布局例子在原先的一列布局上做了修改,在main下划分了左右块,top下加了head块。可以根据需要,在leftright块下再划分为其它块。

    展开全文
  • 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 ...
  • Exadata混合列压缩如何处理INSERT和UPDATE 2011/09/12 BY MACLEAN LIU 暂无评论 Hybrid Columnar Compression混合列压缩是Exadata数据库一体机的核心功能之一,与普通的高级压缩特性(advanced ...
  • 列级压缩数据(混合列式压缩)

    千次阅读 2016-09-20 10:12:03
    问题描述:oracle的exadata存储支持混合列式压缩,能够提高io性能,减少select读取的块数 解决方案:创建表时通过compress for query或compress for archive子句 create table f_regs(reg_id number,reg_desc ...
  • Oracle 发布了关于 Exadata 的混合列压缩(Hybrid Columnar Compression)功能的白皮书(refer)。到现在这方面中文资料还比较少,所以分享一下我读这篇白皮书的笔记。Oracle 在这个文档中也提出了 数据仓库压缩...
  • .NET读Excel的数字文本混合列

    千次阅读 2011-01-04 11:10:00
      ADO.NET读Excel时,会根据该的前n行数据(n个数来自注册表HKEY_LOCAL_MACHINE/Software/Microsoft/Jet/4.0/Engines/Excel/TypeGuessRows),根据这几行数据的内容来判断该的类型,这个类型跟Excel...
  • EXCEL里面的一,数字在先,文字在后,读不出文字,只能读出数字,怎么回事? 解决方案: 首先,把连接字符串改为: Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended ...
  • 数据导入excel时文本数字混合列问题

    千次阅读 2013-03-13 11:09:50
    如果您的中,含有数字和文本行的 ,您导入的数据往往默认为数字型,因此,您的解决方案有两个: 1、设置excel的格式 2、 连接字符串改为 string ConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Jet OLE...
  • 【问题描述】 Excell文件导入SQL Server时,某数据中即包含纯数字组合的串,也包含带有个别字母的串。导入数据库时,该的所有非纯数字串为null。例如: Excell文件: Sid Name Code 1 Jerry 1001 2 ...
  • http://niufc.iteye.com/blog/1729792 转载于:https://www.cnblogs.com/lx0551/p/3935164.html
  • 错误重现: ----------------------------------------------------------------------- 在导入Excel读取数据时,其中的一个字段保存的值有如下格式:...混合了 "字母/数字/中文"数据,在Excel表格中的前 8条 或
  •  从以上的分析中可以得知,当某数据中含有混合类型时,在.NET中使用Microsoft.Jet.OLEDB.4.0来读取Excel文件造成数据丢失是不可避免的,要解决这个问题只能考虑采用其它数据读取方法。  在.NET中读取Excel文件...
  • 文章目录前言文章中心思想全文概览系统模型大规模天线点对点MIMO...混合波束赋形专栏|基于坐标迭代更新法的混合波束赋形算法:整理2016年一篇JSAC高引论文中的混合波束赋形算法,一点拙见,如有偏颇,望不吝赐教,盼...
  • 使用Microsoft.Jet.OLEDB.4.0读取数据会出现当某一字段内分别含有文本和数字的混合数据时,某一类型的数据会产生丢失。 产生这种问题的根源与Excel ISAM[3](Indexed Sequential Access Method,即索引顺序存取方法...
  • 通过查询微软网站,发现MS大意如是说:SQL在导入Excel混合数据的时候,由于数据类型不唯一,导致SQL无法确定数据类型(看来SQL也有犯糊涂的时候)。SQL的应对之道就是统计该数据的前8行数据中出现最多的类型,...
  • 混合波束赋形专栏|基于正交匹配追踪(Orthogonal Matching Pursuit)法的混合波束赋形算法:整理一篇2014年IEEE TWC高引论文,一点拙见,如有偏颇,望不吝赐教,盼即赐复。 文章中心思想 本文利用mmWava信道的稀疏...
  • 混合密码系统

    千次阅读 2018-09-22 11:06:50
    一 对称密码与公钥密码 通过使用对称密码,就能够在通信中确保机密性。然而要在实际中运用对称密码,就必须解决密钥配送问题。 ... ...混合密码系统可以解决公钥密码的处理速度远远低于对称密码问题。...二 混合密...
  • 混合推荐策略

    千次阅读 2015-04-12 21:35:10
    推荐系统中所使用的混合技术介绍 2013年10月25日 ⁄ 字号 小 中 大   在推荐系统实际运用中,各种混合技术是其中一项极为重要的核心技术。在工程实践中我们发现,混合技术对提升推荐效果、改进推荐系统的...
  • 高斯混合模型

    千次阅读 2014-05-09 14:59:28
    本文就高斯混合模型(GMM,Gaussian Mixture Model)参数如何确立这个问题,详细讲解期望最大化(EM,Expectation Maximization)算法的实施过程。 单高斯分布模型GSM 多维变量X服从高斯分布时,它的概率密度函数PDF...
  • 混合引用:

    2018-08-13 18:04:30
    在复制公式时,如果要求行不变单列可变或者不变而行可变,那么就用到了混合引用。例如,$A1表示对A的绝对引用和对第一行的相对引用,而A$1则表示对第一行的绝对引用和对A的相对引; 更多内容请前往如下视频...
  • 饲料混合加工问题——问题2的混合方案

    万次阅读 多人点赞 2020-05-11 00:57:06
    图3 情况3的分配示例 到这里,有人就想,是不是把上述所有情况全部出来,然后按题目要求,挨个计算,不就可以得到最优解了吗。不然,如果按上述情况排列,解的候选个数非常非常大。重要的事说三遍,是非常、非常...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 139,200
精华内容 55,680
关键字:

列混合