DES算法详细实例与实现过程解析

本文通过Python详细解析了DES加密算法的步骤,包括原文转换为二进制、P-1重新排列、循环移位、F函数的E矩阵重排、S-BOX运算以及16轮迭代过程。通过实例展示了如何使用DES对16进制的原文和密钥进行加密,并给出了最终的加密结果。
摘要由CSDN通过智能技术生成

如有疑问欢迎留言

参考网络资源用PYTHON把DES的流程走了一遍,以下为代码与解析,更为具体的细节可参照http://orlingrabbe.com/des.htm或维基百科


假设要加密的原文为a406753854abcdef密钥为a34457799bbcdff1(16进制)

s = 'a406753854abcdef'
key = 'a34457799bbcdff1'

第一步 密钥的生成

1.将原文转为2进制

__hex_bin = {  
        '0':'0000','1':'0001','2':'0010','3':'0011',
        '4':'0100','5':'0101','6':'0110','7':'0111', 
        '8':'1000','9':'1001','a':'1010','b':'1011', 
        'c':'1100','d':'1101','e':'1110','f':'1111', 
        ' ':'0000'  
    }
key = ''.join(__hex_bin[i] for i in key) 

2.P-1重新排列

排列矩阵为P1

__re = lambda t, s: ''.join(s[i-1] for i in t) 

# PC-1
__k1 = [  
        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,  
]

密钥由64位变为56位

3.将其分为左右两组C0与D0,分别按照循环移位表移位,得到Cn Dn

移位表:

       
                      序数       左移位数

                          1          1
                          2          1
                          3          2
                          4          2
                          5          2
                          6          2
                          7          2
                          8          2
                          9          1
                         10          2
                         11          2
                         12          2
                         13          2
                         14          2
                         15          2
                         16          1
代码:

k0 = [  
        0,1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28,  
]
key = [key[k0[i]:28]+key[0:k0[i]] + key[k0[i]+28:56]+key[28:k0[i]+28] for i in range(17)]
4再次重排列

#PC-2
__k2 = [  
        14,17,11,24, 1, 5, 3,28,  
        15, 6,21,10,23,19,12, 4,  
        26, 8,16, 7,27,20,13, 2,  
        41,52,31,37,47,55,30,40,  
        51,45,33,48,44,49,39,56,  
        34,53,46,42,50,36,29,32,  
]
key = [__re(__k2,key[i]) for i in range(1,17)] 


运行结果:

key
a34457799bbcdff1
K
1010001101000100010101110111100110011011101111001101111111110001
K+
11110001110011101010100111110101010101100110011110001100
n       Cn                              Dn
0       1111000111001110101010011111    0101010101100110011110001100
1       1110001110011101010100111111    1010101011001100111100011000
2
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值