在工作中遇到的Des解密问题,第三方发来的数据需要我们进行des解密,但是解密的结果前几位始终是乱码。废了半天劲,终于找到了问题所在。

下面先介绍一下des,了解des的同学可以直接看下面的解决办法。

Des加密

DES全称为Data EncryptionStandard,即数据加密标准。Des加密算法是一种对称加密算法,所谓对称加密算法就是指对明文的加密以及对密文的解密用的是同一个密钥。

Des使用一个56位的密钥以及附加的8位奇偶校验位,产生最大64位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。

特点:数据加密标准,速度较快,适用于加密大量数据的场合。

Des算法的入口参数有三个:Key、Data、Mode。

  • Key: 为8个字节共64位,Des算法规定,其中第8、16、24、......64位是奇偶校验位,不参与Des运算,所以常说Des的密钥为56位。 在Des加密和解密的过程当中,密钥的长度都必须是8字节的倍数。

  • Data: 8个字节64位,是要被加密后解密的数据。

  • Mode: Des的工作方式:加密、解密。

Des加密模式

Des的加密模式主要有CBC模式,ECB模式,它们分别使用不同的加密方式加密。

ECB模式指的是电子密码本模式,是一种最古老,最简单的模式,将加密的数据分成若干组,每组的大小跟加密密钥长度相同;然后每组都用相同的密钥加密, 如果最后一个分组长度不够64位,要补齐64位。

ECB模式的特点是:

  1. 每次Key、明文、密文的长度都必须是64位;

  2. 数据块重复排序不需要检测;

  3. 相同的明文块(使用相同的密钥)产生相同的密文块,容易遭受字典攻击;

  4. 一个错误仅仅会对一个密文块产生影响;

CBC模式指的是加密块链模式,与ECB模式最大的不同是加入了初始向量。

CBC模式的特点是:

  1. 每次加密的密文长度为64位(8个字节);

  2. 当相同的明文使用相同的密钥和初始向量的时候CBC模式总是产生相同的密文;

  3. 密文块要依赖以前的操作结果,所以,密文块不能进行重新排列;

  4. 可以使用不同的初始化向量来避免相同的明文产生相同的密文,一定程度上抵抗字典攻击;

  5. 一个错误发生以后,当前和以后的密文都会被影响;

填充方式

常见的填充方式PKCS5Padding,PKCS5Padding表示当数据位数不足的时候要采用的数据补齐方式,也可以叫做数据填充方式。PKCS5Padding这种填充方式,具体来说就是“填充的数字代表所填字节的总数”

比如说,差两个字节,就是######22,差5个字节就是###55555,这样根据最后一个自己就可以知道填充的数字和数量。

保证加密解密的一致性 

在不同的平台上,只要能保证这几个参数的一致,就可以实现加密和解密的一致性。

  1. 加密和解密的密钥一致

  2. 采用CBC模式的时候,要保证初始向量一致

  3. 采用相同的填充模式

python中的des加密

在python中,我们使用pyDes对数据进行des加密:

# pyDes.des(key, [mode], [IV], [pad], [padmode])
  • key: des的加密解密密钥。

  • mode: 加密模式:支持CBC,ECB两种模式

  • IV: 初始化向量,这是CBC模式专有的,长度为8 bytes。使用不同的初始化向量加密避免产生相同的密文,一定程度上抵抗字典攻击。

  • pad: 当padmode设置为PAD_NORMAL时,用pad参数来指定填充方式。

  • padmode: 填充方式,默认为PAD_PKCS5填充模式。

      Example-------from pyDes import *data = "Please encrypt my data"k = des("DESCRYPT", CBC, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)# For Python3, you'll need to use bytes, i.e.:# data = b"Please encrypt my data"# k = des(b"DESCRYPT", CBC, b"\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)d = k.encrypt(data)print "Encrypted: %r" % dprint "Decrypted: %r" % k.decrypt(d)assert k.decrypt(d, padmode=PAD_PKCS5) == data

des加密后(CBC模式)使用相同的密钥,初始向量,填充模式解密,解密后的字符前几位是乱码,其他位正常的解决办法

des_key = 'ucgtchdp'IV = '12345678'k = des(des_key, mode=CBC, IV='12345678', padmode=PAD_PKCS5)

传递过来的加密数据: xUjw0iO7uhymZ+h/VB9kvhubiAEv4Kzz

通过k解密出来的数据:@IDX_^\x10Ys powerful

这种情况通常发生在不同语言(java加密、python解密)对初始向量的处理方式不同造成的解密不完全。

解决办法:检查初始向量的表现形式。

k1 = des(des_key, mode=CBC, IV='\1\2\3\4\5\6\7\x08', padmode=PAD_PKCS5)

通过k1解密出来的数据:python is powerful

OK!

转载请注明出处~

转载于:https://www.cnblogs.com/Lands-ljk/p/5888765.html

des解密不完整,前面几位是乱码的解决办法相关推荐

  1. java des解密乱码_des解密不完整,前面几位是乱码的解决办法

    在工作中遇到的Des解密问题,第三方发来的数据需要我们进行des解密,但是解密的结果前几位始终是乱码.废了半天劲,终于找到了问题所在. 下面先介绍一下des,了解des的同学可以直接看下面的解决办法. ...

  2. java安装出现向导中断,在Macromedia Dreamweaver 8 完整安装之前向导已中断的解决办法...

    乾元轩这篇文章介绍在在Macromedia Dreamweaver 8 完整安装之前向导已中断的解决办法,相信这个问题很多相关人士都会遇到过,方法来自网络搜索以及自己亲身验证所得. 在一台机子上安装M ...

  3. 打开Office安装包报错!提示“无法安装64位的office“的解决办法!

    一.故障现象 打开office安装程序时提示"无法安装64位版本的office,因为在您的PC上找到了以下32位程序" 二.原因分析 系统中已安装过32位的office程序,或者已 ...

  4. vmware workstation 9 安装Ubuntu 12.04 WIN7 64 位 出现问题及解决办法

    本人电脑:Thinkpad,64位 虚拟机下安装的时候出现vmware 弹出不支持 VT-X,当然也可能是ENABLE这个功能. 1.查看电脑是否支持VT-X,用cpu-z来查看,cpu-z下载链接h ...

  5. windows64位无法安装打印机解决办法。

    WIN7 64位无法安装打印机的原因有: 1.打印机不支持WIN7系统; 2.打印机的驱动不匹配; 3.打印机服务未开启. 解决方法: 1.确认打印机是否支持WIN7; 2.如果打印机支持WIN7系统 ...

  6. 关于WSL(Windows子系统)无法运行32位程序的初步解决办法

    为了偷懒,开始使用上了WSL,不得不说这是个很方便的东西,但是,WSL不具备linux的全部功能,这次遇到的一个对我影响比较大的,应该就是它无法运行32位程序.因为做pwn题需要不断调试程序已经本地运 ...

  7. python des解密_python实现DES加密解密方法实例详解

    本文实例讲述了python实现DES加密解密方法.分享给大家供大家参考.具体分析如下: 实现功能:加密中文等字符串 密钥与明文可以不等长 这里只贴代码,加密过程可以自己百度,此处python代码没有优 ...

  8. des加密+base64编码,base64解码+des解密

    des加密+base64编码,base64解码+des解密 des简单介绍 base64简单介绍 运行效果图 TestActivity.java DataEncryptionUtil.java des ...

  9. C# DES解密异常问题

    一.C#DES解密操作定义 private static string key = "ceshishiyong"; private static byte[] Keys = new ...

最新文章

  1. 注册不到两年半Github标星39k+,吴恩达、李航老师的作品的笔记和代码实现
  2. Maven+struts2+spring4+hibernate4的环境搭建
  3. CST光源控制卡简单操作C#程序
  4. Java 集合容器篇面试题(上)-王者笔记《收藏版》
  5. 重读《JAVA与模式》之二
  6. f5 系统损坏,重新安全系统
  7. IDEA 2017 破解教程(2018也可以)
  8. 使用GLAD加载OpenGL的库
  9. JavaSE StringBuffer StringBuilder 数组常见操作 Arrays 基本数据类型包装类
  10. Mybatis——注入执行sql查询、更新、新增以及建表语句
  11. 如何更改AD域安全策略-密码必须符合复杂性要求
  12. 使用Python异序词检测示例_清点法_排序法_蛮力法_计数法
  13. 企业公众号推送什么内容?企业公众号内容可以发哪些?
  14. linux can总线接收数据串口打包上传_SPI、I2C、UART、I2S、GPIO、SDIO、CAN,你能分清楚吗?...
  15. python 高斯函数拟合_在python中拟合任意高斯函数,消耗大量内存
  16. 聚类算法——OPTICS
  17. 加密锁(加密狗)使用技巧
  18. 云计算未来面临的挑战,主要包含哪几方面?
  19. 中级软件设计师知识点整理:法律法规与标准化
  20. 华为测试c语言面试题,硬件测试笔试题

热门文章

  1. 同一个页面两个aside标签ID重复问题导致的功能缺失
  2. Webstorm中提示Cannot find module 'webpack.dev.conf.js'
  3. Mac 配置支持 opengl 的 opencv 4.2
  4. 视频 + PPT | 企业服务如何破局增长?
  5. 重磅!一文解读神策智能推荐
  6. Java编程基础25——多线程上
  7. 模拟实现strstr
  8. Android ContentProvider的介绍
  9. Call 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。
  10. 初识 ASP.NET 3.5 MVC 开发