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中的字典与成员运算符初步探究
Oct 13 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
Apr 28 Python
python 常用的基础函数
Jul 10 Python
python中cPickle类使用方法详解
Aug 27 Python
Python3内置模块之json编解码方法小结【推荐】
Dec 09 Python
Python3标准库之functools管理函数的工具详解
Feb 27 Python
利用python画出AUC曲线的实例
Feb 28 Python
Python Switch Case三种实现方法代码实例
Jun 18 Python
浅析Python 条件控制语句
Jul 15 Python
详解Pandas 处理缺失值指令大全
Jul 30 Python
python读取xml文件方法解析
Aug 04 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
自己前几天写的无限分类类
2007/02/14 PHP
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
基于jquery DOM写的类似微博发布的效果
2012/10/20 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
JS弹出新窗口被拦截的解决方法
2016/08/09 Javascript
简单实现js浮动框
2016/12/13 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
详解JavaScript作用域和作用域链
2019/03/19 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
Vue 中 filter 与 computed 的区别与用法解析
2019/11/21 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
Python文件及目录操作实例详解
2015/06/04 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
Python语言进阶知识点总结
2019/05/28 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
Python中的__init__作用是什么
2020/06/09 Python
Python偏函数实现原理及应用
2020/11/20 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
西班牙第一的网上药房:PromoFarma.com
2017/04/17 全球购物
init进程的作用
2015/08/20 面试题
教育专业个人求职信
2013/12/02 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
专家推荐信模板
2014/05/09 职场文书
慈善捐赠倡议书
2014/08/30 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
详解如何修改nginx的默认端口
2021/03/31 Servers