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中SOAP项目的介绍及其在web开发中的应用
Apr 14 Python
从零开始学Python第八周:详解网络编程基础(socket)
Dec 14 Python
pandas 选择某几列的方法
Jul 03 Python
基于python实现聊天室程序
Jul 27 Python
python实现定时压缩指定文件夹发送邮件
Dec 22 Python
python中的协程深入理解
Jun 10 Python
Python中list的交、并、差集获取方法示例
Aug 01 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
keras slice layer 层实现方式
Jun 11 Python
pandas实现导出数据的四种方式
Dec 13 Python
python实现会员管理系统
Mar 18 Python
Pygame游戏开发之太空射击实战敌人精灵篇
Aug 05 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
MySQL数据源表结构图示
2008/06/05 PHP
PHP项目开发中最常用的自定义函数整理
2010/12/02 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
JavaScript 学习笔记(十二) dom
2010/01/21 Javascript
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
javascript事件处理模型实例说明
2016/05/31 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
ES6概念 ymbol.for()方法
2016/12/25 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
fullCalendar中文API官方文档
2017/02/07 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
Vue实现按钮级权限方案
2019/11/21 Javascript
Python读写Excel文件的实例
2013/11/01 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
详解Python循环作用域与闭包
2019/03/21 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
python切割图片的示例
2020/11/12 Python
Python大批量搜索引擎图像爬虫工具详解
2020/11/16 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
Aveda美国官网:天然护发产品、洗发水、护发素和沙龙
2016/12/09 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
酒店led欢迎词
2014/01/09 职场文书
办公室主任职责范本
2014/03/07 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
党委班子纠正“四风”问题整改措施
2014/10/28 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
酒桌上的开场白
2015/06/01 职场文书
背起爸爸上学观后感
2015/06/08 职场文书