﹎厡.唻

深度学习Deep Learning小白进阶

AES加密算法之列混合变换

在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;
}
编译结果如下:



阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012620515/article/details/49893905
文章标签: AES算法 列混合
个人分类: 分组密码
想对作者说点什么? 我来说一句

AES加密解密与代码实现详解

2016年08月09日 328KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭