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



  • 19
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值