在工做中遇到的Des解密问题,第三方发来的数据须要咱们进行des解密,可是解密的结果前几位始终是乱码。废了半天劲,终于找到了问题所在。java
下面先介绍一下des,了解des的同窗能够直接看下面的解决办法。python
DES全称为Data EncryptionStandard,即数据加密标准。Des加密算法是一种对称加密算法,所谓对称加密算法就是指对明文的加密以及对密文的解密用的是同一个密钥。算法
Des使用一个56位的密钥以及附加的8位奇偶校验位,产生最大64位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分红两半。使用子密钥对其中一半应用循环功能,而后将输出与另外一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操做四种基本运算。加密
特色:数据加密标准,速度较快,适用于加密大量数据的场合。code
Des算法的入口参数有三个:Key、Data、Mode。排序
Key: 为8个字节共64位,Des算法规定,其中第八、1六、2四、......64位是奇偶校验位,不参与Des运算,因此常说Des的密钥为56位。 在Des加密和解密的过程中,密钥的长度都必须是8字节的倍数。io
Data: 8个字节64位,是要被加密后解密的数据。import
Mode: Des的工做方式:加密、解密。乱码
Des的加密模式主要有CBC模式,ECB模式,它们分别使用不一样的加密方式加密。循环
ECB模式指的是电子密码本模式,是一种最古老,最简单的模式,将加密的数据分红若干组,每组的大小跟加密密钥长度相同;而后每组都用相同的密钥加密, 若是最后一个分组长度不够64位,要补齐64位。
每次Key、明文、密文的长度都必须是64位;
数据块重复排序不须要检测;
相同的明文块(使用相同的密钥)产生相同的密文块,容易遭受字典攻击;
一个错误仅仅会对一个密文块产生影响;
CBC模式指的是加密块链模式,与ECB模式最大的不一样是加入了初始向量。
每次加密的密文长度为64位(8个字节);
当相同的明文使用相同的密钥和初始向量的时候CBC模式老是产生相同的密文;
密文块要依赖之前的操做结果,因此,密文块不能进行从新排列;
可使用不一样的初始化向量来避免相同的明文产生相同的密文,必定程度上抵抗字典攻击;
一个错误发生之后,当前和之后的密文都会被影响;
常见的填充方式PKCS5Padding,PKCS5Padding表示当数据位数不足的时候要采用的数据补齐方式,也能够叫作数据填充方式。PKCS5Padding这种填充方式,具体来讲就是“填充的数字表明所填字节的总数”
好比说,差两个字节,就是######22,差5个字节就是###55555,这样根据最后一个本身就能够知道填充的数字和数量。
在不一样的平台上,只要能保证这几个参数的一致,就能够实现加密和解密的一致性。
加密和解密的密钥一致
采用CBC模式的时候,要保证初始向量一致
采用相同的填充模式
在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_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!
转载请注明出处~