首页
社区
课程
招聘
6
[原创]AES加密中列混合的具体算法
发表于: 2012-3-1 10:28 6193

[原创]AES加密中列混合的具体算法

2012-3-1 10:28
6193

AES明文在加密过程中涉及到字节代换、行移位、列混合、轮密钥加等过程。这里对列混合的算法做出一些浅显的解释。


列混合其实就是对一个状态的每一列去乘一个矩阵,其中乘法是在有限域GF(2^8)内进行的,不可约多项式为x^8+x^4+x^2+x+1如图:



先把算法代码列出来:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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都不变



[注意]看雪招聘,专注安全领域的专业人才平台!

收藏
免费 6
支持
分享
赞赏记录
参与人
雪币
留言
时间
伟叔叔
为你点赞~
2024-5-31 04:01
心游尘世外
为你点赞~
2024-3-31 00:35
飘零丶
为你点赞~
2024-3-23 00:23
QinBeast
为你点赞~
2024-3-7 00:41
shinratensei
为你点赞~
2024-1-27 05:29
PLEBFE
为你点赞~
2023-3-7 00:46
最新回复 (6)
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
内容不错,学习了
2012-3-1 10:32
0
雪    币: 437
活跃值: (130)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
全部代码呢?
2012-3-1 10:43
0
雪    币: 244
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
不错不错,学习了
2012-3-1 10:52
0
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
5
原来列混合算法是楼主原创,以前确实不知道!
2012-3-1 11:01
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
内容不错,学习了,谢谢
2012-3-9 13:59
0
雪    币: 30
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
这样算的话速度会很慢。一般都是用查表来实现aes。
2012-3-10 16:59
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册