在工作中遇到的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" % d
    print "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!

转载请注明出处~

des解密不完整,前面几位是乱码的解决办法的更多相关文章

  1. Loadrunner11无法在win7 64位上启用ie解决办法

    Loadrunner11无法在win7 64位上启用ie解决办法 1.loadrunner11在win7 64位上默认启用的是32位的那个IE浏览器,路径:C:\Program Files (x86) ...

  2. 使用virtualbox安装centos虚拟机,以及VirtualBox无法安装64位Linux CentOS的解决办法

    之前一直用vmware的虚拟机,好吧,其实一直盗版挺不好的,然后想用centos搭点东西,结果在vmare上安装centos总是有些问题,看了人给的建议换用virtualbox,虽然virtualbo ...

  3. Ubuntu 13.10 64位 无法 安装 ia32-libs 解决办法

    安装新立德软件包管理器:打开终端,输入以下命令:sudo apt-get install synaptic 打开新立德软件包管理器,选择“设置>软件库” 选择“其他软件 > 添加” 在AP ...

  4. PLSQL Developer连接不上64位Oracle 10g的解决办法

    下载instantclient-basic-win32-10.2.0.4.zip 假设Oracle 10g的安装目录为D:\oracle\product\10.2.0\db1 首先,将instantc ...

  5. C#用DES加密JAVA用DES解密,JAVA用DES加密C#用DES解密的实现

    这里贴出来的是可通用的C#与jav的DES加密类,希望对大家管用直接复制即可用 C#DES加密解密类 ///<summary><![CDATA[加密解密帮助类]]></s ...

  6. 使用C# DES解密java DES加密的字符串

    转自 microAllen   最近需要使用C#的DES解密工具类解密字符串,但是要解密的字符串是使用java进行DES加密的,去网上查了关于C#和java关于DES加密解密的资料,发现可以相互加密解 ...

  7. 微信小程序des加密、PHP des解密

    最近在做对小程序传输数据进行加密,加密方法有很多,使用的是des对称加密 采用的是CBC模式, 引用的插件为tripledes.js,https://github.com/Favour1111in/h ...

  8. 微信 AES 解密报错 Illegal key size 三种解决办法

    微信 AES 解密报错 Illegal key size Java 环境 java version "1.8.0_151" Java(TM) SE Runtime Environm ...

  9. 64位Ubuntu运行32位程序时报文件不存在(No such file or Directory)的一种解决办法

    尝试在64位Ubuntu下面运行32位程序时, 一直说 文件不存在(No such file or directory), 我只想说++. 你tm说个文件格式不正确不就好了? 非得说个文件不存在! 真 ...

随机推荐

  1. spring mvc基础配置

    web.xml 配置: <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class> ...

  2. 如何从SharePoint Content DB中查询List数据

    SharePoint用来维护基础数据非常方便,只需要建立自定义列表,然后使用InfoPath自定义一下维护界面,就可以实现在线的增删改查,开发效率很高.如果维护的数据需要进行审批,还可以加入工作流功能 ...

  3. 基础篇之 Create Type

    Create Type 的话呢,是创建一个自定义的数据类型,等于说为常用的数据类型建造一个别名的样纸.然后就可以通用当前数据库的当前架构.(当然了,一般来说我们都是使用dbo架构,所以都会无事前面那个 ...

  4. 2. Docker - 安装

    一.Docker介绍 1. Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上, 也可以实现虚拟化. 容器时完全使用沙 ...

  5. [转]VS2010中如何创建一个WCF

    本文转自:http://www.cnblogs.com/zhangliangzlee/archive/2012/08/28/2659701.html 转载:http://www.cnblogs.com ...

  6. [Computer structure] Written Notes

    To some extent, taking notes using my pen and pencil is also an interesting thing! bingo! ~ 2016-03- ...

  7. 《2016ThoughtWorks技术雷达峰会----微服务架构》

    微服务架构   王键,ThoughtWorks, 首席咨询师 首先微服务架构的定义,thoughtWorks在2012年3月的技术雷达中这样定义: “微服务架构是一种架构,它提倡将单一应用程序划分为一 ...

  8. POJ 1696 Space Ant --枚举,模拟,贪心,几何

    题意: 有很多点,从最右下角的点开始走起,初始方向水平向右,然后以后每步只能向左边走,问最多能走多少个点. 解法: 贪心的搞的话,肯定每次选左边的与它夹角最小的点,然后走过去. 然后就是相当于模拟地去 ...

  9. java 24 - 7 GUI之 创建多级菜单窗体

    需求: 创建多级菜单 步骤: A:创建窗体对象(并设置属性和布局) B:创建菜单栏 C:创建菜单和子菜单 D:逐步添加菜单(子菜单添加到菜单中,菜单添加到菜单栏中) E:窗体中设置菜单栏(菜单栏并不是 ...

  10. Navigator 对象

    Navigator 对象 Navigator 对象包含有关浏览器的信息. 注意: 没有应用于 navigator 对象的公开标准,不过所有浏览器都支持该对象. Navigator 对象属性 属性 说明 ...