DES算法是一种典型的Feistel结构的分组密码算法,它的明文分组长度为64bit,密钥分组长度为64bit,其中有8bit是奇偶校验,所以有效密钥长度为56bit。DES算法的加密和解密采用同一过程,安全性依赖有效密钥。
DES算法加密过程
大致过程 : IP初始置换——16轮迭代变换——IP逆置换
1.需要输入的数据:
KEY:8字节密钥(64bit)
MIN:8字节明文(64bit)
相关介绍:
字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位。
字符是指计算机中使用的文字和符号,比如1 2 3 A B C a b c ~ ! · # 等等。
在不同编码中字符和字节的对应关系不同,
ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。
在加密过程中,是以64bit的形式进行变换的,即64位的二进制序列,所以要将输入的密钥和明文转化为64位二进制序列的形式
如:'a' 的ASCII值为97,将97转变为8位的二进制序列为 01100001
2 . IP初始置换:
将64位明文序列按下表进行置换(位置变换)
int IP_T[64] = //IP置换矩阵
{
58, 50, 42, 34, 26, 18, 10, 2,
60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6,
64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1,
59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5,
63, 55, 47, 39, 31, 23, 15, 7
};
将置换后的数据 分成 L0(32bit),R0(32bit)两部分
3 . 16轮迭代变换
迭代过程:
如图所示: 下一轮的左半部分就是上一轮的右半部分,下一轮的右半部分 先由 上一轮右半部分与轮密钥Ki进行F函数变换,再与上一轮的左半部分异或得到,即如下列公式:
Li = Ri-1
Ri = Li-1 ⊕ F(Ri-1 , Ki)
3.1 轮密钥生成
1 . 64位秘钥降至56位秘钥,将密钥排成 8*8 的矩阵,每一行的第八位将作为奇偶校验位被忽略,于是形成了初始的56位的密钥
再通过置换表置换 PC-1(表中不含8,16,24,32,40,48,56,64这八个数),如下:
57,49,41,33,25,17,9,1,
58,50,42,34,26,18,10,2,
59,51,43,35,27,19,11,3,
60,52,44,36,63,55,47,39,
31,23,15,7,62,54,46,38,
30,22,14,6,61,53,45,37,
29,21,13,5,28,20,12,4
2.再将得到的56位密钥分成C0和D0,前28位为C0,后28位为D0
按循环左移表循环左移:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1
将循环左移后的Ci,Di合并,得到56位,再通过置换表PC-2,变为48位,即为轮密钥Ki:
PC-2
void PC_2(int input[56], int output[48])//PC_2
{
for (int i = 0; i<48; i++)
output[i] = input[PC2_T[i] - 1];
}
3.2 E盒扩展置换
将原来的明文数据的右半部分R从32位扩展成为48位,在两边扩展了两列 如下表进行扩展置换:
int E_T[48] = //扩展矩阵
{
32, 1, 2, 3, 4, 5