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计算程序运行时间的方法
Dec 13 Python
python使用matplotlib绘制折线图教程
Feb 08 Python
Python中偏函数用法示例
Jun 07 Python
python远程连接服务器MySQL数据库
Jul 02 Python
python3 面向对象__类的内置属性与方法的实例代码
Nov 09 Python
python判断输入日期为第几天的实例
Nov 13 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
Python根据字典的值查询出对应的键的方法
Sep 30 Python
Python读取ini配置文件传参的简单示例
Jan 05 Python
pycharm 配置svn的图文教程(手把手教你)
Jan 15 Python
Keras多线程机制与flask多线程冲突的解决方案
May 28 Python
python 中yaml文件用法大全
Jul 04 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 数字左侧自动补0
2008/03/31 PHP
php中定义网站根目录的常用方法
2010/08/08 PHP
php根据指定位置和长度获得子字符串的方法
2015/03/17 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
JQuery优缺点分析说明
2010/06/09 Javascript
用JQuery调用Session的实现代码
2010/10/29 Javascript
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
javascript中声明函数的方法及调用函数的返回值
2014/07/22 Javascript
js判断一个字符串是否包含一个子串的方法
2015/01/26 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
AngularJS 仿微信图片手势缩放的实例
2017/09/28 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
[02:07]DOTA2新英雄展现中国元素,完美“圣典”亮相央视
2016/12/19 DOTA
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
基于python实现聊天室程序
2018/07/27 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
Python爬虫之UserAgent的使用实例
2019/02/21 Python
Django使用中间键实现csrf认证详解
2019/07/22 Python
python求一个字符串的所有排列的实现方法
2020/02/04 Python
HTML5: Web 标准最巨大的飞跃
2008/10/17 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
技校生自我鉴定范文
2013/09/26 职场文书
目标管理责任书
2014/04/15 职场文书
文明演讲稿范文
2014/05/12 职场文书
假释思想汇报范文
2014/10/11 职场文书
信访工作汇报材料
2014/10/27 职场文书
2014年学校工作总结
2014/11/20 职场文书