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实现栈的方法
May 26 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
Python基于whois模块简单识别网站域名及所有者的方法
Apr 23 Python
Django model序列化为json的方法示例
Oct 16 Python
python找出完数的方法
Nov 12 Python
实时获取Python的print输出流方法
Jan 07 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
tensorflow 获取checkpoint中的变量列表实例
Feb 11 Python
tensorflow安装成功import tensorflow 出现问题
Apr 16 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
Jul 01 Python
Python基于pyjnius库实现访问java类
Jul 31 Python
Python函数__new__及__init__作用及区别解析
Aug 31 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生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
php启动时候提示PHP startup的解决方法
2013/05/07 PHP
php与flash as3 socket通信传送文件实现代码
2014/08/16 PHP
10个对初学者非常有用的PHP技巧
2016/04/06 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
JavaScript编程开发中的五个实用小技巧
2010/07/22 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
IE7浏览器窗口大小改变事件执行多次bug及IE6/IE7/IE8下resize问题
2015/08/21 Javascript
jQuery使用$.each遍历json数组的简单实现方法
2016/04/18 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
Bootstrap Table 搜索框和查询功能
2017/11/30 Javascript
jquery自定义显示消息数量
2017/12/19 jQuery
webpack打包js的方法
2018/03/12 Javascript
vue组件挂载到全局方法的示例代码
2018/08/02 Javascript
Vue组件间通信方法总结(父子组件、兄弟组件及祖先后代组件间)
2019/04/17 Javascript
vue添加锚点,实现滚动页面时锚点添加相应的class操作
2020/08/10 Javascript
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
Windows下安装Scrapy
2018/10/17 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
python中matplotlib条件背景颜色的实现
2019/09/02 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
廉政教育心得体会
2014/01/01 职场文书
剪枝的学问教学反思
2014/02/07 职场文书
公益广告语集锦
2014/03/13 职场文书
增员口号大全
2014/06/18 职场文书
高中社区服务活动报告
2015/02/05 职场文书
2015年银行员工工作总结
2015/04/24 职场文书
python数字转对应中文的方法总结
2021/08/02 Python
Python创建SQL数据库流程逐步讲解
2022/09/23 Python