void getkeys(BYTE key[8], BYTE key_final[16][6])
{
BYTE keys[7] = {};//存储经过PC1置换后的56位中间结果
for (int i = 0; i < 56; i++)
convert(key, keys, i, PC_1);//PC1置换
bitset<56> key_round[17];
//初始化全为0
for (int i = 0; i < 16; i++)key_round[i].reset();
//信息复制,将BYTE数组格式转为bitset格式,便于后续处理
for (int i = 0; i < 7; i++)
{
for (int j = 0; j < 8; j++)
{
if (getbit(keys[i], j) == 1)
key_round[0].set(i * 8 + j);//该位设为1
}
}
for (int i = 0; i < 16; i++)//28位一组循环移位操作
{
bitset<56> left_mov = key_round[i] >> MOV[i];//注意大小端序问题,实际是
左移
for (int j = 0; j < MOV[i]; j++)
{
left_mov.set(28 - MOV[i] + j, key_round[i][j]);
left_mov.set(56- MOV[i] + j, key_round[i][28 + j]);
}
key_round[i+1] = left_mov;
}
//PC_2置换,把bitset转会BYTE,便于观察中间结果
for(int i=0;i<16;i++)
for (int j = 0; j < 48; j++)
{
write(key_final[i][j/8], j%8, key_round[i + 1][PC_2[j] - 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