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

转载请注明出处~

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加密解密类 ///

使用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说个文件格式不正确不就好了? 非得说个文件不存在! 真 ...

随机推荐

前端使用js读取文件

最近同时问我js能不能读取本地文件: 想起以前看到js读取本地文件的文章,然后自己写了个demo. ps:这有点想Java的IO流,但是又有差别. 首先我们定义一个input标签type=" ...

***Linux文件夹文件创建、删除、改名

Linux删除文件夹命令 linux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可.直接rm就可以了,不过要加两个参数-rf 即:rm ...

MyISAM 和InnoDB区别

MyISAM 和InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理 ...

【转】System.DateTime.Now.ToString()的一些用法

C#中的日期处理函数     //2007年4月24日     this.TextBox6.Text = System.DateTime.Now.ToString("D");    ...

Hibernate 环境搭建

Hibernate 工作流程 1.创建工程并导包 2.在src根目录下创建配置文件:hibernate.cfg.xml(也可以创建在src其他文件夹下,但是在后面的配置中,需要指明路径) <?x ...

Python网络编程篇之socket

1 socket 插座?呵呵,想多了,翻译过来意思是套接字! A network socket is an internal endpoint for sending or receiving dat ...

wget命令行本地克隆一个网站

命令: wget -k -p -nH -N http://www.baidu.com -k 把已下载文件中的所有链接都转换为本地引用,不在依赖原始或在线内容 -p  下载所有必要文件,确保离线可用,包 ...

北京大学冯哲清北学堂讲课day1

贪心方案: 答案是第三个策略 二分的一个重点是有顺序性,只有满足这个件才可以二分判断区间,否则你得自己构造顺序. 洛谷跳石头同题: 首先,我们要最小化最大跳远距离 代码如下(此题) #include& ...

archlinux下我的软件列表

编辑器:leafpad,gvim 终端:zsh,xfce4-terminal 音乐:网易云音乐(良心),DeadBeef(和win的foobar2000差不多) 视频播放:mpv PDF:Acrore ...

学习笔记TF047&colon;PlayGround、TensorBoard

PlayGround.http://playground.tensorflow.org .教学目的简单神经网络在线演示.实验图形化平台.可视化神经网络训练过程.在浏览器训练神经网络.界面,数据(DAT ...

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

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

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

  2. java cookie 取不到_java中Servlet Cookie取不到值原因解决办法

    java中Servlet Cookie取不到值原因解决办法 现象: 在测试带Cookie的HTTP请求时发现,服务端用request.getHeader("cookie")可以去到 ...

  3. 405错误,java.io.IOException: The temporary upload location [/tmp/tomcat.22.83/work/Tomcat/localhos解决办法

    系统使用springboot框架开发的,部署在linux系统上.使用的时候前端页面显示405错误. 查看日志,发现 1.request method 'post' not support 2.java ...

  4. Cannot lock Java compile cache (xxx)as it has already been locked by this process 解决办法

    做单元测试运行的时候,遇到报错,报错信息如下: Execution failed for task ':compileJava'. '> Could not create service of ...

  5. java des ecb_DES ECB加解密的Java实现

    package com.trq.nengyuan; import java.security.SecureRandom; import javax.crypto.spec.DESKeySpec; im ...

  6. java des加密与js解密

    java代码:import java.io.IOException; import java.security.SecureRandom;import javax.crypto.Cipher; imp ...

  7. java程序中没有错,但是项目上面显示一个红叉的解决办法

    错误信息: 报Description  Resource Path Location Type Java compiler level does not match the version of th ...

  8. java 数据库查询Date类型字段 没有了时分秒 全为 00 的解决办法

    当取出这个值的时候只能用java.sql.Date而且只能显示年月日,我想知道如何才能显示时分秒   PS:不改变用getdate()存入的前提下! 解决方法:将getDate()方法改为getTim ...

  9. java 程序在Eclipse 或者 Linux 运行报 Unsupported major.minor version 51.0解决办法

    解决Unsupported major.minor version 51.0错误 这个问题主要是由于你的jdk 版本不同导致的 例如 用jdk7编译的class文件放到基于jdk6运行在tomcat之 ...

最新文章

  1. 关系抽取论文总结(relation extraction)不断更新
  2. 科达正式发布PPP业务支持计划
  3. 【Ubuntu入门到精通系列讲解】Linux 终端命令格式
  4. 在studio中使用libsdl2.so,编译SDL Demo
  5. NuGet社区使用体验调查
  6. DataDirectory是什么?
  7. (Incomplete) Codeforces #395 (Div 1 + Div 2)
  8. ActiveMQ常见配置
  9. 【企业架构】2022年TOGAF认证是否仍然值得
  10. BPSK调制解调链路实现
  11. 计算机技术一直在变吗,计算机软考分数线一直是45吗
  12. 竹子的故事:送给那些坚持了很久却准备放弃的人 --- 厚积方能薄发
  13. 【架构干货】京东是如何抗住今年春晚百亿次互动的?
  14. js Qrcode.js实现文字内容通过二维码展示
  15. 测试如何快速了解一个产品、需求、任务(海盗派测试分析,KYM)
  16. node restify框架使用openai(chatgpt)接口
  17. lower_bound 和 upper_bound的区别
  18. 网管软件有什么?网管软件推荐
  19. 用html5如何编写星球运动,HTML5---Canvas-模拟地球-星球运行轨道
  20. 财务生成报表软件只需要一个就够了

热门文章

  1. 你真的了解分类模型评估指标都有哪些吗?【附Python代码实现】
  2. python与分形0021 - 【教程】奥林匹克五环
  3. 公交IC卡读写器设计指南
  4. 基于vs实现的socket—udp图片传送实例详解
  5. 算法-时间复杂度和空间复杂度
  6. mysql 修改 root 密码
  7. 网络攻击与防御技术期中习题
  8. PV、UV、VV、IP及其关系与计算
  9. 如何用c++发出音乐
  10. GPA Involution