Python基于DES算法加密解密实例
发布时间:2020-05-24 05:21:42 所属栏目:Python 来源:互联网
导读:本文实例讲述了Python基于DES算法加密解密实现方法。分享给大家供大家参考。具体实现方法如下:
|
本文实例讲述了Python基于DES算法加密解密实现方法。分享给大家供大家参考。具体实现方法如下:
#coding=utf-8
from functools import partial
import base64
class DES(object):
"""
DES加密算法
interface: input_key(s,base=10),encode(s),decode(s)
"""
__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,]
__ip1 = [
40,58,]
__e = [
32,]
__p = [
16,]
__s = [
[
0xe,0x4,0xd,0x1,0x2,0xf,0xb,0x8,0x3,0xa,0x6,0xc,0x5,0x9,0x0,0x7,0xe,],[
0xf,[
0xa,[
0x7,[
0x2,[
0xc,[
0x4,[
0xd,]
__k1 = [
57,]
__k2 = [
14,]
__k0 = [
1,]
__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'
}
__re = lambda t,s: ''.join(s[i-1] for i in t)
__IP = partial(__re,__ip)
__IP1 = partial(__re,__ip1)
__E = partial(__re,__e)
__P = partial(__re,__p)
__K1 = partial(__re,__k1)
__K2 = partial(__re,__k2)
__B = partial( lambda hex_bin,s: ''.join(hex_bin[w]
for w in ''.join('%2x' % ord(w) for w in s)),__hex_bin)
__DB = partial( lambda s: ''.join(chr(int(s[i:i+8],2)) for i in range(0,len(s),8)))
__S = partial( lambda hex_bin,__s,s: ''.join(hex_bin['%x' % __s[i][
int(s[i*6]+s[i*6+5],2)*16 + int(s[i*6+1:i*6+5],2)]] for i in range(8)),__hex_bin,__s)
__F = partial( lambda s,k: ''.join('0' if s[i]==k[i] else '1' for i in range(len(s))))
__K0 = partial( lambda k0,K2,k: map(K2,(k[k0[i]:28]+k[0:k0[i]] + k[k0[i]+28:56]+k[28:k0[i]+28] for i in range(16))),__k0,__K2)
__K = partial( lambda K1,K0,k: K0(K1(k)),__K1,__K0)
def __init__(self):
pass
def input_key(self,key,base=10):
if base == 2:
pass
elif base == 16:
key = ''.join(self.__class__.__hex_bin[w] for w in key)
else:
key = self.__class__.__B(key)
self.__k = self.__class__.__K(key)
def __code(self,s,k):
s = self.__IP(s)
l,r = s[0:32],s[32:64]
for i in range(16):
r_t = r
r = self.__E(r)
r = self.__F(r,k[i])
r = self.__S(r)
r = self.__P(r)
r = self.__F(r,l)
l = r_t
return self.__class__.__IP1(r+l)
def encode(self,s):
a = ''
s += ' ' * ((8-len(s)%8)%8)
for i in range(0,8):
before = self.__class__.__B(s[i:i+8])
after = self.__code(before,self.__k)
a += '%16x' % int(after,2)
return ''.join(w if w!=' ' else '0' for w in a)
def decode(self,s):
a = ''
s.lower()
for i in range(0,16):
before = ''.join(self.__class__.__hex_bin[s[j]] for j in range(i,i+16))
after = self.__code(before,self.__k[::-1])
a += self.__class__.__DB(after)
return a.rstrip().decode('utf-8')
if __name__ == '__main__':
d = DES()
d.input_key('123456789')
s = '再来一段中文'
a = d.encode(s)
print a
b = d.decode(a)
print b
希望本文所述对大家的Python程序设计有所帮助。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
