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 安装virtualenv和virtualenvwrapper的方法
Jan 13 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
Python爬虫常用库的安装及其环境配置
Sep 19 Python
Python中new方法的详解
Jan 15 Python
python爬虫 Pyppeteer使用方法解析
Sep 28 Python
Python tkinter布局与按钮间距设置方式
Mar 04 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
在django项目中导出数据到excel文件并实现下载的功能
Mar 13 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
python with语句的原理与用法详解
Mar 30 Python
基于python实现删除指定文件类型
Jul 21 Python
Python列表推导式实现代码实例
Sep 09 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
深入PHP数据加密详解
2013/06/18 PHP
CI框架中zip类应用示例
2014/06/17 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
动态加载JS文件的三种方法
2013/11/08 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
JS遍历数组及打印数组实例分析
2016/01/21 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
vue实现多条件和模糊搜索功能
2019/05/28 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
使用wxPython获取系统剪贴板中的数据的教程
2015/05/06 Python
Python scikit-learn 做线性回归的示例代码
2017/11/01 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
python使用RNN实现文本分类
2018/05/24 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
深入了解python中元类的相关知识
2019/08/29 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
学习Python需要哪些工具
2020/09/04 Python
小结Python的反射机制
2020/09/28 Python
Python爬虫之Selenium设置元素等待的方法
2020/12/04 Python
关于python中remove的一些坑小结
2021/01/04 Python
CSS3实现缺角矩形,折角矩形以及缺角边框
2019/12/20 HTML / CSS
香港百佳网上超级市场:PARKNSHOP.com
2020/06/10 全球购物
优秀技术工人先进材料
2014/02/17 职场文书
法人委托书的范本格式
2014/09/11 职场文书
四风对照检查材料思想汇报
2014/09/20 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
工程部主管岗位职责
2015/02/12 职场文书
担保书怎么写 ?
2019/04/22 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书