pyDes 实现 Python 版的 DES 对称加密/解密--转
https://my.oschina.net/leejun2005/blog/586451
手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓了两下 pyDes 貌似很方便,不过据网上其他同学测试说 PyCrypto 性能要比 pyDes 高一个数量级,这里我没有做具体性能测试,也没有选用 PyCrypto 主要原因有三:
(1)PyCrypto 在 windows 下依赖 VC++9.0,安装麻烦
(2)PyCrypto 默认不支持 padmode,且对秘钥以及偏转向量长度有严格要求,扩展性很差
(3)不是用来搞暴力破解,性能要求不高,所以就不关注性能了,能用就行 ^ _ ^
下面直接上代码吧~
1、Java 版
public class EncryptHelper {
private static String strKey = "test_KEY", strParam = "test__IV";
public static String desEncrypt(String source) throws Exception {
if (source == null || source.length() == 0)
return null;
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
DESKeySpec desKeySpec = new DESKeySpec(strKey.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(strParam.getBytes("UTF-8"));
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
return StringHelper.toHexString(
cipher.doFinal(source.getBytes("UTF-8"))).toUpperCase();
}
public static String desDecrypt(String source) throws Exception {
if (source == null || source.length() == 0)
return null;
byte[] src = StringHelper.fromHexString(source);
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
DESKeySpec desKeySpec = new DESKeySpec(strKey.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(strParam.getBytes("UTF-8"));
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
byte[] retByte = cipher.doFinal(src);
return new String(retByte);
}
public static void main(String[] args) throws Exception {
System.out
.println(EncryptHelper
.desDecrypt("886f930f65f29132f6ace2683c448b5580d681a1fec3fc91cf3161f074b53b935d1c8fe80f99201077b36f923a42ac0e05cabe579308fda08d8ff463ad334677"));
System.out.println(EncryptHelper.desEncrypt("https://mail.google.com/mail/u/0/#inbox/a1ed0e2f6f28e06b4361"));
}
}
//结果:
//https://mail.google.com/mail/u/0/#inbox/a1ed0e2f6f28e06b4361
//886F930F65F29132F6ACE2683C448B5580D681A1FEC3FC91CF3161F074B53B935D1C8FE80F99201077B36F923A42AC0E05CABE579308FDA08D8FF463AD334677
2、Python 版
# -*- coding:utf-8 -*-
import sys reload(sys)
sys.setdefaultencoding('utf-8')
from pyDes import *
from binascii import b2a_hex, a2b_hex # For Python3, you'll need to use bytes, i.e.:
# data = b"Please encrypt my data"
# k = des(b"DESCRYPT", CBC, b"\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5) data = 'https://mail.google.com/mail/u/0/#inbox/a1ed0e2f6f28e06b4361'
KEY = "test_KEY" #密钥
IV = "test__IV" #偏转向量
# 使用DES对称加密算法的CBC模式加密
k = des(KEY, CBC, IV, pad=None, padmode=PAD_PKCS5)
d = k.encrypt(data)
print b2a_hex(d)
print "Decrypted: %r" % k.decrypt(d) #结果:
#886f930f65f29132f6ace2683c448b5580d681a1fec3fc91cf3161f074b53b935d1c8fe80f99201077b36f923a42ac0e05cabe579308fda08d8ff463ad334677
#Decrypted: ' #或者单行命令如下:
python -c 'from pyDes import *;from binascii import a2b_hex;import sys;print des("test_KEY", CBC, "test__IV", pad=None, padmode=PAD_PKCS5).decrypt(a2b_hex(sys.stdin.readlines()[0].strip()))' <<<886f930f65f29132f6ace2683c448b5580d681a1fec3fc91cf3161f074b53b935d1c8fe80f99201077b36f923a42ac0e05cabe579308fda08d8ff463ad334677
#https://mail.google.com/mail/u/0/#inbox/a1ed0e2f6f28e06b4361
3、Refer
[1] pyDes库 实现python的des加密
http://www.cnblogs.com/SunboyL/p/pyDes.html
[2] Cryptography and Python
http://lenciel.cn/2013/07/cryptography-and-python/
[3] 加密解密工具类 EncryptUtil
http://uule.iteye.com/blog/1925046
[4] implementing DES-X (mode CBC) using PyCrypto
https://gist.github.com/doublereedkurt/3921909
[5] python 对字符串的加密解密
http://www.simonzhang.net/?p=1903
[6] 数据加密算法
http://baike.baidu.com/view/878529.htm
[7] 非对称加密算法
http://baike.baidu.com/view/1490349.htm
[8] Pycrypto与RSA密码技术笔记
http://python.jobbole.com/84094/
pyDes 实现 Python 版的 DES 对称加密/解密--转的更多相关文章
- C# DES对称加密解密
/// <summary> /// 加密 /// </summary> /// <param name="str"></param> ...
- Java和.NET使用DES对称加密的区别
Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Ja ...
- Asp.Net Core 2.0 项目实战(7)MD5加密、AES&DES对称加解密
本文目录 1. 摘要 2. MD5加密封装 3. AES的加密.解密 4. DES加密/解密 5. 总结 1. 摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等, ...
- PHP使用DES进行加密解密
DES是一种对称加密算法,也就是通过密文和合法的密钥能够将明文还原出来,在程序开发过程中有些 接口可能需要获取原始数据,而发送的数据又比较敏感(比如用户的密码等信息),这时可以选择DES加密算法,DE ...
- DESEncrypt对称加密解密
分享一个很好用的DESEncrypt对称加密解密的类 using System; using System.Security.Cryptography; using System.Text; usin ...
- php des 对称加解密类
<?php header("Content-Type: text/html;charset=utf-8"); /** * des 对称加解密 */ class des { p ...
- AES对称加密解密类
import java.io.UnsupportedEncodingException; import javax.crypto.Cipher; import javax.crypto.spec.Se ...
- .NET中的DES对称加密
DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中56位加密密钥, ...
- python AES 双向对称加密解密
高级加密标准(Advanced Encryption Standard,AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分 ...
随机推荐
- ***mysql 用一个表的一列,去更新另一表的一列
需求: 老板给了一个EXCEL数据,是本人提供的一个模板,含ID,现在相当于要导入这新增的一列数据到数据库中的某一个表. 方法一:用navicat,在excel中复制一列,再粘贴到navicat中的一 ...
- Servlet开发(2)
Jsp&Servlet用户登录功能实现(采用MVC模式) 我们使用Jsp&Servlet开发一个用户登录功能的小项目(麻雀大小,但是五脏俱全呦,关键是技术问题!). 数据库:mysql ...
- MongoDB小结25 - 复合唯一索引
只要满足索引的其中之一不同即可 db.blog.ensureIndex({"username":1,"blogname":1}) 作者和作品名其中之一不同即可创 ...
- 用pc构建DIY计算集群
-----------------------------------------------------------------用pc构建DIY计算集群目录/构建计算集群|-- /0前言|-- /1 ...
- 网页页面NULL值对浏览器兼容性的影响
网页页面NULL值对浏览器兼容性的影响 近期做项目中一个页面中的input radio出现浏览器兼容性问题. 主要问题: 在谷歌浏览器,360急速模式和搜狗急速模式中给radio初始动态赋 ...
- AutoCAD如何添加网络打印机 添加公司打印机
1 请确认你已经连接了这台网络打印机,你没法打AutoCAD图纸,但是应该能打Word文档.能打Word文档说明你驱动装好了,通信也没问题,只是AutoCAD的配置不对导致的. 2 点击打印,打印 ...
- android的ndk学习(1)
android的ndk学习(1) 之前学了一段时间ndk,总认为要总结一下.ndk使得很方便地实现java和C与C++代码的相互沟通.合理地掌握使用ndk能够提高应用程序的运行效率.所以对于学习a ...
- HDU 4869 Turn the pokers (2014多校联合训练第一场1009) 解题报告(维护区间 + 组合数)
Turn the pokers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 安装ubuntu后启动黑屏
我是在windows7上的一个空暇盘上安装ubuntu 14.安装后重新启动没有ubuntu的启动项,然后用easybcd生成启动项,重新启动发现果然有,可是选择之后黑屏. 百度半天无果.后来无意发现 ...
- 进程间通信之-共享内存Shared Memory--linux内核剖析(十一)
共享内存 共享内存是进程间通信中最简单的方式之中的一个. 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区. 共享内存同意两个或很多其他进程訪问同一块内存,就如同 malloc() 函数 ...