Python和Java进行DES加密和解密的实例


Posted in Python onJanuary 09, 2018

DES 为 Data Encryption Standard (数据加密标准)的缩写,是一种常见的对称加密算法。有关对称加密与非对称加密的特点及其应用场景,本文就不描述了,读者可以自行 google 。本文说明如何使用 Java 和 Python 两种语言来实现 DES 的加解密。

最近碰到的应用场景是这样的。我们需要对接一个系统 S,系统 S 已经对用户的身份进行了验证,新系统 N 也需要对用户的身份进行验证。采用的身份验证方法是由旧系统 S 对用户 ID 进行加密,然后新系统 N 对加密后的用户 ID 进行解密,从而获取用户 ID 并进行身份验证。

由于旧系统 S 是用 Java 实现的,新系统 N 使用 Python 实现。也就是说,需要使用 Python 语言来对 Java DES 加密的用户 ID 进行解密。

这里贴出 Java 实现的 DES 加密的代码。

import javax.crypto.spec.IvParameterSpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class Main {
 public static void main(String[] args) {
  String content = "zx";
  String key = "20171117";
  System.out.println("加密前:" + content);
  byte[] encrypted = DES_CBC_Encrypt(content.getBytes(), key.getBytes());
  System.out.println("加密后:" + byteToHexString(encrypted));
  byte[] decrypted = DES_CBC_Decrypt(encrypted, key.getBytes());
  System.out.println("解密后:" + new String(decrypted));
 }
 public static byte[] DES_CBC_Encrypt(byte[] content, byte[] keyBytes) {
  try {
   DESKeySpec keySpec = new DESKeySpec(keyBytes);
   SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
   SecretKey key = keyFactory.generateSecret(keySpec);
   Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
   cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(keySpec.getKey()));
   byte[] result = cipher.doFinal(content);
   return result;
  } catch (Exception e) {
   System.out.println("exception:" + e.toString());
  }
  return null;
 }
 private static byte[] DES_CBC_Decrypt(byte[] content, byte[] keyBytes) {
  try {
   DESKeySpec keySpec = new DESKeySpec(keyBytes);
   SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
   SecretKey key = keyFactory.generateSecret(keySpec);
   Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
   cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(keyBytes));
   byte[] result = cipher.doFinal(content);
   return result;
  } catch (Exception e) {
   System.out.println("exception:" + e.toString());
  }
  return null;
 }
 private static String byteToHexString(byte[] bytes) {
  StringBuffer sb = new StringBuffer(bytes.length);
  String sTemp;
  for (int i = 0; i < bytes.length; i++) {
   sTemp = Integer.toHexString(0xFF & bytes[i]);
   if (sTemp.length() < 2)
    sb.append(0);
   sb.append(sTemp.toUpperCase());
  }
  return sb.toString();
 }
}

Java 代码采用的 DES 加密采用 CBC 模式,采用 PKCS5Padding 的填充模式,使用的初始化向量是加密的密钥。

执行以上 Java 代码,输出:

加密前:zx
加密后:1DBBD4E9246EBFFA
解密后:zx

Python 利用 pyDes 对 Java 加密的字符串进行解密的代码如下所示。

import binascii
from pyDes import des, CBC, PAD_PKCS5

def des_encrypt(s):
 """
 DES 加密
 :param s: 原始字符串
 :return: 加密后字符串,16进制
 """
 secret_key = '20171117'
 iv = secret_key
 k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
 en = k.encrypt(s, padmode=PAD_PKCS5)
 return binascii.b2a_hex(en)

def des_descrypt(s):
 """
 DES 解密
 :param s: 加密后的字符串,16进制
 :return: 解密后的字符串
 """
 secret_key = '20171117'
 iv = secret_key
 k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
 de = k.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5)
 return de

str_en = des_encrypt('zx')
print(str_en)
str_de = des_descrypt(str_en)
print(str_de)

Python 语言采用 pyDes 作为 DES 加解密处理的包。DES 解密时采用 CBC 模式,并采用 PAD_PKCS5 作为填充模式,使用解密密钥作为初始化向量。这些加密的设置跟 Java 语言使用的是一致的。

执行以上 Python 代码,得到以下输出:

1dbbd4e9246ebffa
zx

可以看到,同对 Java 语言加密后的字符串,Python 语言可以正常解密。

以上这篇Python和Java进行DES加密和解密的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
Nov 05 Python
详解python的webrtc库实现语音端点检测
May 31 Python
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
Apr 19 Python
mac下如何将python2.7改为python3
Jul 13 Python
如何使用python操作vmware
Jul 27 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
python实现最大优先队列
Aug 29 Python
django中的图片验证码功能
Sep 18 Python
python线程信号量semaphore使用解析
Nov 30 Python
python基于TCP实现的文件下载器功能案例
Dec 10 Python
Python Tkinter图形工具使用方法及实例解析
Jun 15 Python
python实现PolynomialFeatures多项式的方法
Jan 06 Python
Python设计模式之中介模式简单示例
Jan 09 #Python
python+opencv实现动态物体追踪
Jan 09 #Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 #Python
Python设计模式之代理模式简单示例
Jan 09 #Python
基于python内置函数与匿名函数详解
Jan 09 #Python
Python设计模式之工厂模式简单示例
Jan 09 #Python
浅谈numpy库的常用基本操作方法
Jan 09 #Python
You might like
PHP闭包实例解析
2014/09/08 PHP
Yii2下点击验证码的切换实例代码
2017/03/14 PHP
使用ThinkPHP生成缩略图及显示
2017/04/27 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
2013/01/09 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
javascript中使用new与不使用实例化对象的区别
2015/06/22 Javascript
JS实现动态表格的添加,修改,删除功能(推荐)
2016/06/15 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
浅谈原型对象的常用开发模式
2017/07/22 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
微信小程序sessionid不一致问题解决
2019/08/30 Javascript
解决layer弹出层msg的文字不显示的问题
2019/09/11 Javascript
解决iView Table组件宽度只变大不变小的问题
2020/11/13 Javascript
Python中os和shutil模块实用方法集锦
2014/05/13 Python
wxpython 最小化到托盘与欢迎图片的实现方法
2014/06/09 Python
Python中优化NumPy包使用性能的教程
2015/04/23 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
python中p-value的实现方式
2019/12/16 Python
python turtle 绘制太极图的实例
2019/12/18 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
用Python开发app后端有优势吗
2020/06/29 Python
python 实用工具状态机transitions
2020/11/21 Python
CSS3实现10种Loading效果
2016/07/11 HTML / CSS
html5启动原生APP总结
2020/07/03 HTML / CSS
学习雷锋倡议书
2014/04/15 职场文书
2014世界杯球队球队口号
2014/06/05 职场文书
升职感谢信
2015/01/22 职场文书
五四青年节活动总结
2015/02/10 职场文书