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通过floor函数舍弃小数位的方法
Mar 17 Python
浅谈python字符串方法的简单使用
Jul 18 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
Oct 17 Python
python实现浪漫的烟花秀
Jan 30 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
selenium获取当前页面的url、源码、title的方法
Jun 12 Python
python调用动态链接库的基本过程详解
Jun 19 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
May 09 Python
Python logging模块异步线程写日志实现过程解析
Jun 30 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 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 时间转换Unix时间戳代码
2010/01/22 PHP
PHP中Session引起的脚本阻塞问题解决办法
2014/04/08 PHP
Yii调试SQL的常用方法
2014/07/09 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
PHPstorm快捷键(分享)
2017/07/17 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
onpropertypchange
2006/07/01 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
Vue.js 踩坑记之双向绑定
2018/05/03 Javascript
详解vue 兼容IE报错解决方案
2018/12/29 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
2019/07/26 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
python集合常见运算案例解析
2019/10/17 Python
Python-Flask:动态创建表的示例详解
2019/11/22 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
使用css3做0.5px的细线的示例代码
2018/01/18 HTML / CSS
文化活动实施方案
2014/03/28 职场文书
培训协议书范本
2014/04/22 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
教师个人发展总结
2015/02/11 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
旅行社计调工作总结
2015/08/12 职场文书
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫