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装饰器使用示例及实际应用例子
Mar 06 Python
python简单读取大文件的方法
Jul 01 Python
利用matplotlib实现根据实时数据动态更新图形
Dec 13 Python
Django 再谈一谈json序列化
Mar 16 Python
python实现超级马里奥
Mar 18 Python
Python读取JSON数据操作实例解析
May 18 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 Python
Python实现播放和录制声音的功能
Aug 12 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
Aug 17 Python
浅析python 字典嵌套
Sep 29 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 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学习资料汇总与网址
2007/03/16 PHP
非常实用的php弹出错误警告函数扩展性强
2014/01/17 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
thinkPHP多表查询及分页功能实现方法示例
2017/07/03 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
深入理解JavaScript系列(15) 函数(Functions)
2012/04/12 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
js表头排序实现方法
2015/01/16 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
2016/06/15 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
利用vue-router实现二级菜单内容转换
2016/11/30 Javascript
微信小程序组件 marquee实例详解
2017/06/23 Javascript
玩转vue的slot内容分发
2018/09/22 Javascript
js遍历详解(forEach, map, for, for...in, for...of)
2019/08/28 Javascript
浅析vue中的provide / inject 有什么用处
2019/11/10 Javascript
用js编写留言板
2020/03/17 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
python记录程序运行时间的三种方法
2017/07/14 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
python标准库os库的函数介绍
2020/02/12 Python
python对指定字符串逆序的6种方法(小结)
2020/04/02 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
通信工程专业女生个人求职信
2013/09/21 职场文书
后勤副校长自我鉴定
2013/10/13 职场文书
信息部岗位职责
2013/11/12 职场文书
广告学专业推荐信范文
2013/11/23 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
幼儿园见习报告
2014/10/30 职场文书
银行招聘自荐信
2015/03/06 职场文书