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解析XML的几种常见方法的介绍
Apr 09 Python
python实现批量下载新浪博客的方法
Jun 15 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
浅谈python对象数据的读写权限
Sep 12 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 Python
python批量复制图片到另一个文件夹
Sep 17 Python
在Python中分别打印列表中的每一个元素方法
Nov 07 Python
django rest framework vue 实现用户登录详解
Jul 29 Python
python 中的paramiko模块简介及安装过程
Feb 29 Python
Matlab中plot基本用法的具体使用
Jul 17 Python
python自动生成sql语句的脚本
Feb 24 Python
baselines示例程序train_cartpole.py的ImportError
May 20 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
解析linux下安装memcacheq(mcq)全过程笔记
2013/06/27 PHP
PHP错误Parse error: syntax error, unexpected end of file in test.php on line 12解决方法
2014/06/23 PHP
PHP生成唯一订单号
2015/07/05 PHP
php 中self,this的区别和操作方法实例分析
2019/11/04 PHP
这段js代码得节约你多少时间
2011/12/20 Javascript
javascript学习(一)构建自己的JS库
2013/01/02 Javascript
jsp网页搜索结果中实现选中一行使其高亮
2014/02/17 Javascript
jQuery中ScrollTo用法示例
2016/09/04 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
js实现悬浮窗效果(支持拖动)
2017/03/09 Javascript
解决vue多个路由共用一个页面的问题
2018/03/12 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
vue项目打包之后背景样式丢失的解决方案
2019/01/17 Javascript
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
Python操作json数据的一个简单例子
2014/04/17 Python
Python中unittest用法实例
2014/09/25 Python
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
Python 查看文件的编码格式方法
2017/12/21 Python
Scrapy框架基本命令与settings.py设置
2020/02/06 Python
浅谈Django中的QueryDict元素为数组的坑
2020/03/31 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
Python+unittest+DDT实现数据驱动测试
2020/11/30 Python
一款纯css3实现的鼠标经过按钮特效教程
2014/11/09 HTML / CSS
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
出纳员岗位职责风险
2014/03/06 职场文书
基层党支部公开承诺书
2014/05/29 职场文书
节能环保标语
2014/06/12 职场文书
贸易经济专业自荐书
2014/06/29 职场文书
趣味运动会广播稿
2014/09/13 职场文书
乡镇党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
晚会开幕词
2015/01/28 职场文书
主持人大赛开场白
2015/05/29 职场文书
MySQL InnoDB ReplicaSet(副本集)简单介绍
2021/04/24 MySQL