Python基于DES算法加密解密实例


Posted in Python onJune 03, 2015

本文实例讲述了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,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,  
    38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,  
    36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27,  
    34,2,42,10,50,18,58,26,33,1,41, 9,49,17,57,25,  
  ]  
  __e = [  
    32, 1, 2, 3, 4, 5,  
    4 , 5, 6, 7, 8, 9,  
    8 , 9,10,11,12,13,  
    12,13,14,15,16,17,  
    16,17,18,19,20,21,  
    20,21,22,23,24,25,  
    24,25,26,27,28,29,  
    28,29,30,31,32, 1,  
  ]  
  __p = [  
    16, 7,20,21,29,12,28,17,  
    1 ,15,23,26, 5,18,31,10,  
    2 ,8 ,24,14,32,27, 3, 9,  
    19,13,30, 6,22,11, 4,25,  
  ]  
  __s = [  
    [  
    0xe,0x4,0xd,0x1,0x2,0xf,0xb,0x8,0x3,0xa,0x6,0xc,0x5,0x9,0x0,0x7,
    0x0,0xf,0x7,0x4,0xe,0x2,0xd,0x1,0xa,0x6,0xc,0xb,0x9,0x5,0x3,0x8,
    0x4,0x1,0xe,0x8,0xd,0x6,0x2,0xb,0xf,0xc,0x9,0x7,0x3,0xa,0x5,0x0,
    0xf,0xc,0x8,0x2,0x4,0x9,0x1,0x7,0x5,0xb,0x3,0xe,0xa,0x0,0x6,0xd,
    ],  
    [  
    0xf,0x1,0x8,0xe,0x6,0xb,0x3,0x4,0x9,0x7,0x2,0xd,0xc,0x0,0x5,0xa,
    0x3,0xd,0x4,0x7,0xf,0x2,0x8,0xe,0xc,0x0,0x1,0xa,0x6,0x9,0xb,0x5,
    0x0,0xe,0x7,0xb,0xa,0x4,0xd,0x1,0x5,0x8,0xc,0x6,0x9,0x3,0x2,0xf,
    0xd,0x8,0xa,0x1,0x3,0xf,0x4,0x2,0xb,0x6,0x7,0xc,0x0,0x5,0xe,0x9,
    ],  
    [  
    0xa,0x0,0x9,0xe,0x6,0x3,0xf,0x5,0x1,0xd,0xc,0x7,0xb,0x4,0x2,0x8,
    0xd,0x7,0x0,0x9,0x3,0x4,0x6,0xa,0x2,0x8,0x5,0xe,0xc,0xb,0xf,0x1,
    0xd,0x6,0x4,0x9,0x8,0xf,0x3,0x0,0xb,0x1,0x2,0xc,0x5,0xa,0xe,0x7,
    0x1,0xa,0xd,0x0,0x6,0x9,0x8,0x7,0x4,0xf,0xe,0x3,0xb,0x5,0x2,0xc,
    ],  
    [  
    0x7,0xd,0xe,0x3,0x0,0x6,0x9,0xa,0x1,0x2,0x8,0x5,0xb,0xc,0x4,0xf,
    0xd,0x8,0xb,0x5,0x6,0xf,0x0,0x3,0x4,0x7,0x2,0xc,0x1,0xa,0xe,0x9,
    0xa,0x6,0x9,0x0,0xc,0xb,0x7,0xd,0xf,0x1,0x3,0xe,0x5,0x2,0x8,0x4,
    0x3,0xf,0x0,0x6,0xa,0x1,0xd,0x8,0x9,0x4,0x5,0xb,0xc,0x7,0x2,0xe,
    ],  
    [  
    0x2,0xc,0x4,0x1,0x7,0xa,0xb,0x6,0x8,0x5,0x3,0xf,0xd,0x0,0xe,0x9,
    0xe,0xb,0x2,0xc,0x4,0x7,0xd,0x1,0x5,0x0,0xf,0xa,0x3,0x9,0x8,0x6,
    0x4,0x2,0x1,0xb,0xa,0xd,0x7,0x8,0xf,0x9,0xc,0x5,0x6,0x3,0x0,0xe,
    0xb,0x8,0xc,0x7,0x1,0xe,0x2,0xd,0x6,0xf,0x0,0x9,0xa,0x4,0x5,0x3,
    ],  
    [  
    0xc,0x1,0xa,0xf,0x9,0x2,0x6,0x8,0x0,0xd,0x3,0x4,0xe,0x7,0x5,0xb,
    0xa,0xf,0x4,0x2,0x7,0xc,0x9,0x5,0x6,0x1,0xd,0xe,0x0,0xb,0x3,0x8,
    0x9,0xe,0xf,0x5,0x2,0x8,0xc,0x3,0x7,0x0,0x4,0xa,0x1,0xd,0xb,0x6,
    0x4,0x3,0x2,0xc,0x9,0x5,0xf,0xa,0xb,0xe,0x1,0x7,0x6,0x0,0x8,0xd,
    ],  
    [  
    0x4,0xb,0x2,0xe,0xf,0x0,0x8,0xd,0x3,0xc,0x9,0x7,0x5,0xa,0x6,0x1,
    0xd,0x0,0xb,0x7,0x4,0x9,0x1,0xa,0xe,0x3,0x5,0xc,0x2,0xf,0x8,0x6,
    0x1,0x4,0xb,0xd,0xc,0x3,0x7,0xe,0xa,0xf,0x6,0x8,0x0,0x5,0x9,0x2,
    0x6,0xb,0xd,0x8,0x1,0x4,0xa,0x7,0x9,0x5,0x0,0xf,0xe,0x2,0x3,0xc,
    ],  
    [  
    0xd,0x2,0x8,0x4,0x6,0xf,0xb,0x1,0xa,0x9,0x3,0xe,0x5,0x0,0xc,0x7,
    0x1,0xf,0xd,0x8,0xa,0x3,0x7,0x4,0xc,0x5,0x6,0xb,0x0,0xe,0x9,0x2,
    0x7,0xb,0x4,0x1,0x9,0xc,0xe,0x2,0x0,0x6,0xa,0xd,0xf,0x3,0x5,0x8,
    0x2,0x1,0xe,0x7,0x4,0xa,0x8,0xd,0xf,0xc,0x9,0x0,0x3,0x5,0x6,0xb,
    ],  
  ]  
  __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,  
  ]  
  __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,  
  ]  
  __k0 = [  
    1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,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, len(s), 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, len(s), 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程序设计有所帮助。

Python 相关文章推荐
python基于socket实现网络广播的方法
Apr 29 Python
Python数据分析之真实IP请求Pandas详解
Nov 18 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
numpy.transpose对三维数组的转置方法
Apr 17 Python
一看就懂得Python的math模块
Oct 21 Python
python导入坐标点的具体操作
May 10 Python
python进程的状态、创建及使用方法详解
Dec 06 Python
Python综合应用名片管理系统案例详解
Jan 03 Python
Python class的继承方法代码实例
Feb 14 Python
Anconda环境下Vscode安装Python的方法详解
Mar 29 Python
使用pyplot.matshow()函数添加绘图标题
Jun 16 Python
Idea安装python显示无SDK问题解决方案
Aug 12 Python
Python使用minidom读写xml的方法
Jun 03 #Python
Python实现程序的单一实例用法分析
Jun 03 #Python
python简单获取本机计算机名和IP地址的方法
Jun 03 #Python
Python自动调用IE打开某个网站的方法
Jun 03 #Python
Python找出文件中使用率最高的汉字实例详解
Jun 03 #Python
Python实现Windows上气泡提醒效果的方法
Jun 03 #Python
Python捕捉和模拟鼠标事件的方法
Jun 03 #Python
You might like
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
有关PHP中MVC的开发经验分享
2012/05/17 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
js中的布尔运算符使用介绍
2013/11/20 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
js脚本实现数据去重
2014/11/27 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
jQuery实现内容定时切换效果完整实例
2016/04/06 Javascript
JavaScript函数柯里化原理与用法分析
2017/03/31 Javascript
JS闭包的几种常见形式实例详解
2017/09/16 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
使用Vue.js 和Chart.js制作绚丽多彩的图表
2019/06/15 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
JS原形与原型链深入详解
2020/05/09 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
2020/07/21 Javascript
用Python的urllib库提交WEB表单
2009/02/24 Python
用python实现百度翻译的示例代码
2018/03/09 Python
详解python3中的真值测试
2018/08/13 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
2019/01/23 Python
python装饰器相当于函数的调用方式
2019/12/27 Python
keras中的backend.clip用法
2020/05/22 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
Python爬取梨视频的示例
2021/01/29 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
介绍下Java的输入输出流
2014/01/22 面试题
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
春季运动会广播稿大全
2014/02/19 职场文书
2014党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
2014年政风行风工作总结
2014/11/22 职场文书
小学教学工作总结2015
2015/05/13 职场文书
辞职信怎么写?
2019/05/21 职场文书
JavaScript数组reduce()方法的语法与实例解析
2021/07/07 Javascript