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实现的归并排序算法示例
Nov 21 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
Aug 07 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
Mar 05 Python
Windows下pycharm安装第三方库失败(通用解决方案)
Sep 17 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
Jan 05 Python
教你怎么用Python实现多路径迷宫
Apr 29 Python
Python绘制散乱的点构成的图的方法
Apr 21 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/04/11 PHP
php实现文件下载功能的几个代码分享
2014/05/10 PHP
PHP实现支付宝即时到账功能
2016/12/21 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
ext实现完整的登录代码
2008/08/08 Javascript
javascript闭包的高级使用方法实例
2013/07/04 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
学习JavaScript正则表达式
2015/11/13 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
2018/05/03 Javascript
微信小程序购物车、父子组件传值及calc的注意事项总结
2018/11/14 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
node后端服务保活的实现
2019/11/10 Javascript
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
pyqt5移动鼠标显示坐标的方法
2019/06/21 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
Python新建项目自动添加介绍和utf-8编码的方法
2020/12/26 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
哈曼俄罗斯官方网上商店:Harman.club
2020/07/24 全球购物
社团活动策划书范文
2014/01/09 职场文书
网络研修随笔感言
2014/02/17 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/10/28 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
小学四年级作文之写景
2019/08/23 职场文书
深入理解Pytorch微调torchvision模型
2021/11/11 Python