最近在完成电子商务安全的一个小作业,实现DES算法,经过一番查阅资料以及三个晚上的爆肝,终于完成了任务,下面用简单的文字描述一下这个过程。
1. 把明文按照一张表置换位置。
2. 把初始密钥按照一张表置换位置。
3. 进入16轮的迭代,每一轮迭代首先根据轮数与移动位数所对应的表生成子密钥。如果是加密的话,就是密
钥按照表左移指定位数,解密就是按照表右移指定位数。
4. 得到每一轮的子密钥过后,将要加密数据的右边按照一张表扩展成48位,然后把这个扩展的数据与该轮的
子密钥进行异或处理,再将结果输入S盒,由于6进4出,所以S盒过后得到32位的数据。
5. S盒过后得到的数据再进入P盒,按照一张表置换位置,再将结果与数据的左半部分异或,之后第一轮迭代
过后的数据就等于数据的右半部分加上异或结果
6. 在完成16次迭代过后再按照一张表进行逆置换,得到最终的结果(即加密或解密后的结果)
下面来介绍一下我的具体实现,代码使用python实现的:
Input:64位的二进制表示的明文和初始密钥以及模式,若为加密,则模式参数为E,解密为D。
Output:显示原文和加密结果。
在我的例子中,我的明文和初始密钥均为’0123456789ABCDEF’,加密过后的密文为’56cc09e7cfdc4cef’,在完成加密过后,再用加密过后的密文与初始密钥进行解密,得到的解密结果为’0123456789ABCDEF’,故验证了其正确性。
下面是代码:
# -*- coding: utf-8 -*-
"""
Created on Thu Apr 4 21:38:22 2019
@author: zhhandsome
"""
def hex2bin(text):
ret = ''
for i in text:
tmp = bin(int(i, 16))[2:]
ret += '0'*(4-len(tmp)) + tmp
return ret
def bin2hex(text):
ret = ''
for i in range(0, len(text), 4):
tmp = text[i:i+4]
ret += hex(int(tmp, 2))[2:]
return ret
class DES_ECB:
def __init__(self, text, key, mode):
self.original_text = text
self.text = text
self.key = key
self.mode = mode
self.ring_shift_left = [1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]
self.ring_shift_right = [0,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]
self.PC_2 = [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]
self.S_box = [[] for i in range(8)]
self.S