python对称加密_pyDes 实现 Python 版的 DES 对称加密/解密--转

本文介绍了一个从Java版DES加密程序迁移到Python的过程,对比了pyDes和PyCrypto库,并提供了具体的代码示例。

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 classEncryptHelper {private static String strKey = "test_KEY", strParam = "test__IV";public static String desEncrypt(String source) throwsException {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);returnStringHelper.toHexString(

cipher.doFinal(source.getBytes("UTF-8"))).toUpperCase();

}public static String desDecrypt(String source) throwsException {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 newString(retByte);

}public static void main(String[] args) throwsException {

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 -*-

importsys

reload(sys)

sys.setdefaultencoding('utf-8')

from pyDesimport *from binasciiimportb2a_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加密

[2] Cryptography and Python

[3] 加密解密工具类 EncryptUtil

[4] implementing DES-X (mode CBC) using PyCrypto

[5] python 对字符串的加密解密

[6] 数据加密算法

[7] 非对称加密算法

[8] Pycrypto与RSA密码技术笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值