python实现S-DES加密算法
S-DES加密算法流程
加密算法涉及五个函数:
1、初始置换IP(initial permutation)
2、复合函数fk1,它是由密钥K1确定的,具有置换和替代的运算
3、转换函数SW
4、复合函数fk2,与fk1相同,所用的密钥是K2
5、初始置换IP的逆置换IP-1
一、S-DES子密钥生成:
置换P10:P10(k1,k2,…,k10)=(k3,k5,k2,k7,k4,k10,k1,k9,k8,k6)
SHIFT:第一个子密钥生成左移一位(LS-1);第二个子密钥生成左移两位(LS-2)
置换P8:P8(k1,k2,…,k10)=(k6,k3,k7,k4,k8,k5,k10,k9)
(置换就是位上的交换,如K=1010000010,置换P10后为:1000001100)
二、加密/解密(这里以加密为例子)
整体流程:
置换IP和IP的逆置换:
IP(k1,k2,…,k8)=(k2,k6,k3,k1,k4,k8,k5,k7)
IP逆(k1,k2,…,k8)=(k4,k1,k3,k5,k7,k2,k8,k6)
复合函数fk:
复合函数fk由以下操作组成:
1、扩展/置换(E/P)运算
E/P(n1,n2,n3,n4)=(n4,n1,n2,n3,n2,n3,n4,n1)
得到的结果用N表示。
如: E/P(1001)=11000011
2、与子密钥异或
子密钥为K1=(k11,k12,k13,k14,k15,k16,k17,k18)
或异N⊕K1=(n4⊕k11,n1⊕k12,…,n1⊕k18)
3、S盒
两个S盒子为:
前四个或异的结果输入S0盒,产生2bit的输出;后四个输入S1,产生2bit输出。
S盒子的规则:
1、将第1和第4的输入比特做为2 bits数,指定S盒的一个行
2、将第2和第3的输入比特做为2 bits数,指定S盒的一个列
3、 则S盒该行该列的值表示为2 bits数,即为输出
如或异的结果为01001001:
对应S0盒子的输入为0100,其(合并的两位看成二进制,注意转换为10进制)行为00(则为第0行),列为10(则为3)(熟悉编程的就知道数组第一个元素下标是0,可以这样来记;不行就记住S盒子第一行里面定义为第0行即可)
4、置换P4
P4(k1,k2,k3,k4)=(k2,k4,k3,k1)
5、再与左边4位异或
交换函数SW
对左边和右边的4个比特进行互换,以便第二个fk对另外4个比特进行处理
源代码
S盒子:
#S盒子
S0 = [[1, 0, 3, 2],
[3, 2, 1, 0],
[0, 2, 1, 3],
[3, 1, 3, 2]]
S1 = [[0, 1, 2, 3],
[2, 0, 1, 3],
[3, 0, 1, 0],
[2, 1, 0, 3]]
置换函数P10:
#置换P10
def P10(key):
return key[2]+key[4]+key[1]+key[6]+key[3]+key[9]+key[0]+key[8]+key[7]+key[5]
SHIFT:
#左移
def Shift(key,n):
key=key[n:].ljust(5,'0')
return key
置换P8:
#置换P8
def P8(key):
return key[5]+key[2]+key[6]+key[3]+key[7]+key[4]+key[9]+key[<