pyDes 實現 Python 版的 DES 對稱加密/解密
阿新 • • 發佈:2022-04-28
手頭有個 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"