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 相关文章推荐
Python3基础之函数用法
Aug 13 Python
Python单例模式实例详解
Mar 01 Python
python线程池threadpool实现篇
Apr 27 Python
Python实现判断一行代码是否为注释的方法
May 23 Python
对Python 语音识别框架详解
Dec 24 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
python如何保证输入键入数字的方法
Aug 23 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
pytorch中获取模型input/output shape实例
Dec 30 Python
Python网络爬虫四大选择器用法原理总结
Jun 01 Python
TensorFlow的环境配置与安装方法
Feb 20 Python
python状态机transitions库详解
Jun 02 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 CURL获取返回值的方法
2014/05/04 PHP
数组任意位置插入元素,删除特定元素的实例
2017/03/02 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP的PDO大对象(LOBs)
2019/01/27 PHP
PHP预定义接口――Iterator用法示例
2020/06/05 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
ie 处理 gif动画 的onload 事件的一个 bug
2007/04/12 Javascript
js 动态为textbox添加下拉框数据源的方法
2014/04/24 Javascript
浅析JavaScript动画
2015/06/10 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
JavaScript中push(),join() 函数 实例详解
2016/09/06 Javascript
基于js中document.cookie全面解析
2017/09/14 Javascript
写一个移动端惯性滑动&amp;回弹Vue导航栏组件 ly-tab
2018/03/06 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
微信小程序五子棋游戏AI实现方法【附demo源码下载】
2019/02/20 Javascript
浅谈vue权限管理实现及流程
2020/04/23 Javascript
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
用Python写的图片蜘蛛人代码
2012/08/27 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
基于TensorFlow常量、序列以及随机值生成实例
2020/01/04 Python
Python with标签使用方法解析
2020/01/17 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
CSS3让登陆面板3D旋转起来
2016/05/03 HTML / CSS
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
敏捷开发的主要原则都有哪些
2015/04/26 面试题
理工科学生的自我评价
2013/12/15 职场文书
空气的环保标语
2014/06/12 职场文书
单位单身证明样本
2014/10/11 职场文书
解除同居协议书
2015/01/29 职场文书
普宁寺导游词
2015/02/04 职场文书
工作岗位职责范本
2015/02/15 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
SQL CASE 表达式的具体使用
2022/03/21 SQL Server