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实现DNS正向查询、反向查询的例子
Apr 25 Python
Python heapq使用详解及实例代码
Jan 25 Python
如何使用Python实现自动化水军评论
Jun 26 Python
使用python实现ftp的文件读写方法
Jul 02 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
python 日志 logging模块详细解析
Mar 31 Python
Python并发concurrent.futures和asyncio实例
May 04 Python
详解pandas.DataFrame.plot() 画图函数
Jun 14 Python
Python爬虫与反爬虫大战
Jul 30 Python
python利用proxybroker构建爬虫免费IP代理池的实现
Feb 21 Python
基于PyTorch中view的用法说明
Mar 03 Python
解决Python中的modf()函数取小数部分不准确问题
May 28 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中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
php绘图之生成饼状图的方法
2015/01/24 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
PHP开发中常用的十个代码样例
2016/02/02 PHP
PHP实现的文件操作类及文件下载功能示例
2016/12/24 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
jQuery实现图片文字淡入淡出效果
2015/12/21 Javascript
JS运动相关知识点小结(附弹性运动示例)
2016/01/08 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
微信小程序 获取微信OpenId详解及实例代码
2016/10/31 Javascript
JavaScript实现经典排序算法之冒泡排序
2016/12/28 Javascript
javascript基于牛顿迭代法实现求浮点数的平方根【递归原理】
2017/09/28 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
Python中asyncore的用法实例
2014/09/29 Python
python的多重继承的理解
2017/08/06 Python
django 2.0更新的10条注意事项总结
2018/01/05 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
MVC的各个部分都有那些技术来实现?如何实现?
2016/04/21 面试题
医学专业大学生求职的自我评价
2013/11/27 职场文书
高三语文教学反思
2014/01/15 职场文书
认购协议书范本
2014/04/22 职场文书
2014年乡镇安全生产工作总结
2014/12/02 职场文书
房屋维修申请报告
2015/05/18 职场文书
导游词之丹东鸭绿江
2019/10/24 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
MySQL去除重叠时间求时间差和的实现
2021/08/23 MySQL