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连接MySQL并使用fetchall()方法过滤特殊字符
Mar 13 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
python处理csv数据动态显示曲线实例代码
Jan 23 Python
Python之循环结构
Jan 15 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
python安装numpy和pandas的方法步骤
May 27 Python
softmax及python实现过程解析
Sep 30 Python
Python模块_PyLibTiff读取tif文件的实例
Jan 13 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
python 中 .py文件 转 .pyd文件的操作
Mar 04 Python
pytorch常用数据类型所占字节数对照表一览
May 17 Python
Python装饰器详细介绍
Mar 25 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
比特率,大家看看这个就不用收音机音质去比MP3音质了
2021/03/01 无线电
PHP5/ZendEngine2的改进
2006/10/09 PHP
php adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
番茄的表单验证类代码修改版
2008/07/18 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
Vue过滤器的用法和自定义过滤器使用
2017/02/08 Javascript
详解如何使用koa实现socket.io官网的例子
2018/11/04 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
Python简单计算文件夹大小的方法
2015/07/14 Python
Python实现基于二叉树存储结构的堆排序算法示例
2017/12/08 Python
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
2020/09/17 Python
一个入门级python爬虫教程详解
2021/01/27 Python
python模块内置属性概念及实例
2021/02/18 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
美国在线工具商店:Acme Tools
2018/06/26 全球购物
师范毕业生自荐信
2013/10/17 职场文书
毕业生自我鉴定
2013/12/04 职场文书
资源工程专业毕业生求职信
2014/02/27 职场文书
2014两会优秀的心得体会范文
2014/03/17 职场文书
百年校庆节目主持词
2014/03/27 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
导游词之江西赣州
2019/10/15 职场文书
使用redis生成唯一编号及原理示例详解
2021/09/15 Redis
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技