des解密不完整,前面几位是乱码的解决办法
在工作中遇到的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模式的特点是:
每次Key、明文、密文的长度都必须是64位;
数据块重复排序不需要检测;
相同的明文块(使用相同的密钥)产生相同的密文块,容易遭受字典攻击;
一个错误仅仅会对一个密文块产生影响;
CBC模式指的是加密块链模式,与ECB模式最大的不同是加入了初始向量。
CBC模式的特点是:
每次加密的密文长度为64位(8个字节);
当相同的明文使用相同的密钥和初始向量的时候CBC模式总是产生相同的密文;
密文块要依赖以前的操作结果,所以,密文块不能进行重新排列;
可以使用不同的初始化向量来避免相同的明文产生相同的密文,一定程度上抵抗字典攻击;
一个错误发生以后,当前和以后的密文都会被影响;
填充方式
常见的填充方式PKCS5Padding,PKCS5Padding表示当数据位数不足的时候要采用的数据补齐方式,也可以叫做数据填充方式。PKCS5Padding这种填充方式,具体来说就是“填充的数字代表所填字节的总数”
比如说,差两个字节,就是######22,差5个字节就是###55555,这样根据最后一个自己就可以知道填充的数字和数量。
保证加密解密的一致性 ##
在不同的平台上,只要能保证这几个参数的一致,就可以实现加密和解密的一致性。
加密和解密的密钥一致
采用CBC模式的时候,要保证初始向量一致
采用相同的填充模式
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解密不完整,前面几位是乱码的解决办法的更多相关文章
- Loadrunner11无法在win7 64位上启用ie解决办法
Loadrunner11无法在win7 64位上启用ie解决办法 1.loadrunner11在win7 64位上默认启用的是32位的那个IE浏览器,路径:C:\Program Files (x86) ...
- 使用virtualbox安装centos虚拟机,以及VirtualBox无法安装64位Linux CentOS的解决办法
之前一直用vmware的虚拟机,好吧,其实一直盗版挺不好的,然后想用centos搭点东西,结果在vmare上安装centos总是有些问题,看了人给的建议换用virtualbox,虽然virtualbo ...
- Ubuntu 13.10 64位 无法 安装 ia32-libs 解决办法
安装新立德软件包管理器:打开终端,输入以下命令:sudo apt-get install synaptic 打开新立德软件包管理器,选择“设置>软件库” 选择“其他软件 > 添加” 在AP ...
- PLSQL Developer连接不上64位Oracle 10g的解决办法
下载instantclient-basic-win32-10.2.0.4.zip 假设Oracle 10g的安装目录为D:\oracle\product\10.2.0\db1 首先,将instantc ...
- C#用DES加密JAVA用DES解密,JAVA用DES加密C#用DES解密的实现
这里贴出来的是可通用的C#与jav的DES加密类,希望对大家管用直接复制即可用 C#DES加密解密类 ///<summary><![CDATA[加密解密帮助类]]></s ...
- 使用C# DES解密java DES加密的字符串
转自 microAllen 最近需要使用C#的DES解密工具类解密字符串,但是要解密的字符串是使用java进行DES加密的,去网上查了关于C#和java关于DES加密解密的资料,发现可以相互加密解 ...
- 微信小程序des加密、PHP des解密
最近在做对小程序传输数据进行加密,加密方法有很多,使用的是des对称加密 采用的是CBC模式, 引用的插件为tripledes.js,https://github.com/Favour1111in/h ...
- 微信 AES 解密报错 Illegal key size 三种解决办法
微信 AES 解密报错 Illegal key size Java 环境 java version "1.8.0_151" Java(TM) SE Runtime Environm ...
- 64位Ubuntu运行32位程序时报文件不存在(No such file or Directory)的一种解决办法
尝试在64位Ubuntu下面运行32位程序时, 一直说 文件不存在(No such file or directory), 我只想说++. 你tm说个文件格式不正确不就好了? 非得说个文件不存在! 真 ...
随机推荐
- Nginx 简单的负载均衡配置示例(转载)
原文地址:Nginx 简单的负载均衡配置示例(转载) 作者:水中游于 www.s135.com 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP. 用户访问http://www ...
- Hyper-V 上的android
为了各种实验环境,装了Hyper-V,然后ADT的android虚拟机就用不上Intel的HAXM了,慢得不行.只有想办法在Hyper-v上装android,还得要ADT能连上. 半天下来,终于搞定. ...
- ImitateLogin新增插件机制以及又一个社交网站的支持
我的文章里已经多次介绍 imitate-login ,这是我最近一直在维护的一个使用c#模拟社交网站登录的开源项目,现在新增了对插件的支持以及一个新的网站(由于某种原因,会在文章结束部分介绍:而且仅会 ...
- Open Auth辅助库(使用ImitateLogin实现登录)
网络上越来越多的公司进行着自己的平台化策略,其中绝大多数都已Web API的方式对外提供服务,为了方便的使用这些服务,你不得不引用许多相关的类库,但是API的本质其实仅仅是一些约定的网络请求,我们大多 ...
- android中的数据存取-方式一:preference(配置)
这种方式应该是用起来最简单的Android读写外部数据的方法了.他的用法基本上和J2SE(java.util.prefs.Preferences)中的用法一样,以一种简单. 透明的方式来保存一些用户个 ...
- FTP定时批量下载文件(SHELL脚本及使用方法 )
1. 脚本实例 将以下脚本保存为 getftp.sh #!/bin/bash datesign=`date -d -95day +%Y%m%d` ftp -nv 12.2.2.28 << ...
- Mysql数据库笔记
出错记录: 1.mysql服务启动不了,进程意外终止 1067 错误显示:can not connect to mysql server on local hosts(1061) 解决方法 ...
- STM32之USART库函数USART_SendData的bug
转载自:http://www.cnblogs.com/itloverhpu/p/3250537.html 1.最近在调试ATM32F103CB时发现,一串数据的最后一个字节总是发送不出去,用的是RS4 ...
- label与input间距的小问题
先码后文 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- HashMap的工作原理深入再深入
前言 首先再次强调hashcode (==)和equals的真正含义(我记得以前有人会说,equals是判断对象内容,hashcode是判断是否相等之类): equals:是否同一个对象实例.注意,是 ...