AES加密算法之列混合变换
2015-11-17 22:22
309 查看
在AES算法中,需要模多项式m(x)=x^8+x^4+x^3+x+1。列混合即是用一个常矩阵乘以第二步变换后的矩阵,以达到矩阵中每一个元素都是该元素原所在列所有元素的加权和。
例题:
附上自己敲的C语言源码:
例题:
附上自己敲的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算法
- linux C 学习 简单字符串逆序输出
- 数组
- AH协议为什么和NAT协议冲突。
- Dark Spots in Avocado
- **PHP分步表单提交思路(分页表单提交)
- css 简析folat
- Java dbf文件写入远程服务器
- 操作系统实验三 进程调度
- 安装nagios4.0.8
- 输入变量相同情况下,结果不正确
- 蒟蒻的trie树专题
- 张国祥老师在宁波恒周贸易公司指导M购岗位工作标准优化
- iOS做项目常用的第三方类
- 《剑指offer》——第一个只出现一次的字符位置
- 1117整理
- 流控制、FlowControl
- 张国祥老师应邀参加联创世纪系统的力量(上海)活动