DES加密模式详解

DES加密模式详解

http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html

http://www.blogjava.net/wayne/archive/2011/05/23/350879.html

加密算法常见的有ECB模式和CBC模式:

ECB模式:电子密本方式,这是JAVA封装的DES算法的默认模式,就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,则补足8个字节(注意:这里就涉及到数据补位了)进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。

CBC模式:密文分组链接方式,这是.NET封装的DES算法的默认模式,它比较麻烦,加密步骤如下:

1、首先将数据按照8个字节一组进行分组得到D1D2......Dn(若数据不是8的整数倍,就涉及到数据补位了)

2、第一组数据D1与向量I异或后的结果进行DES加密得到第一组密文C1(注意:这里有向量I的说法,ECB模式下没有使用向量I)

3、第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2

4、之后的数据以此类推,得到Cn

5、按顺序连为C1C2C3......Cn即为加密结果。

数据补位一般有NoPadding和PKCS7Padding(JAVA中是PKCS5Padding)填充方式,PKCS7Padding和PKCS5Padding实际只是协议不一样,根据相关资料说明:PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是1-255之间。但是封装的DES算法默认都是8字节,所以可以认为他们一样。数据补位实际是在数据不满8字节的倍数,才补充到8字节的倍数的填充过程。

NoPadding填充方式:算法本身不填充,比如.NET的padding提供了有None,Zeros方式,分别为不填充和填充0的方式。

PKCS7Padding(PKCS5Padding)填充方式:为.NET和JAVA的默认填充方式,对加密数据字节长度对8取余为r,如r大于0,则补8-r个字节,字节为8-r的值;如果r等于0,则补8个字节8。比如:

加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888。

互联网的软件设计一定少不了加密算法,并且大量使用的都会是对称加密,比较常见的对称加密有:DES、3DES、RC4、AES等等;

加密算法都有几个共同的要点:

  1. 密钥长度;(关系到密钥的强度)
  2. 加密模式;(ecb、cbc等等)
  3. 块加密算法里的填充方式区分;

对于加密模式,很多同学还不清楚,比如DES,也会有ECB、CBC等不同的区分,它们都是标准的;

Windows加密库中,默认则是CBC模式,也可以手工设置;

Openssl库要更明显一点,它的函数名里面就写明了,比如:DES_ncbc_encrypt,一看就知道是cbc模式;

JAVA里面也比较清楚:Cipher c = Cipher.getInstance(”DES/CBC/PKCS5Padding”); 也可以看到是CBC模式

各种加密模式有什么不同呢:(为了方便,这里的加密key都取64位)

电子密码本模式ECB:

最古老,最简单的模式,将加密的数据分成若干组,每组的大小跟加密密钥长度相同

然后每组都用相同的密钥加密, 比如DES算法, 如果最后一个分组长度不够64位,要补齐64位;

定义:

Enc(X,Y)是加密函数

Dec(X,Y)是解密函数

Key是加密密钥;

Pi ( i = 0,1…n)是明文块,大小为64bit;

Ci ( i = 0,1…n)是密文块,大小为64bit;

ECB加密算法可表示为:

Ci = Enc(Key, Pi)

ECB解密算法可以表示为:

Pi = Dec(Key,Ci)

算法 特点:

  • 每次Key、明文、密文的长度都必须是64位;
  • 数据块重复排序不需要检测;
  • 相同的明文块(使用相同的密钥)产生相同的密文块,容易遭受字典攻击;
  • 一个错误仅仅会对一个密文块产生影响;

加密块链模式CBC:

与ECB模式最大的不同是加入了初始向量

定义:

Enc(X,Y)是加密函数

Dec(X,Y)是解密函数

Key是加密密钥;

Pi ( i = 0,1…n)是明文块,大小为64bit;

Ci ( i = 0,1…n)是密文块,大小为64bit;

XOR(X,Y)是异或运算;

IV是初始向量(一般为64位);

ECB加密算法可表示为:

C0 = Enc(Key, XOR(IV, P0)

Ci = Enc(Key, XOR(Ci-1, Pi)

ECB解密算法可以表示为:

P0 = XOR(IV, Dec(Key, C0))

Pi = XOR(Ci-1, Dec(Key,Ci))

算法特点:

  • 每次加密的密文长度为64位(8个字节);
  • 当相同的明文使用相同的密钥和初始向量的时候CBC模式总是产生相同的密文;
  • 密文块要依赖以前的操作结果,所以,密文块不能进行重新排列;
  • 可以使用不同的初始化向量来避免相同的明文产生相同的密文,一定程度上抵抗字典攻击;
  • 一个错误发生以后,当前和以后的密文都会被影响;

加密反馈模式CFB:

加密反馈模式克服了需要等待8个字节才能加密的缺点,它采用了分组密码作为流密码的密钥流生成器;

定义:

Enc(X,Y)是加密函数

Dec(X,Y)是解密函数

Key是加密密钥;

Pi ( i = 0,1…n)是明文块,大小为64bit;

Ci ( i = 0,1…n)是密文块,大小为64bit;

Si ( i = 0,1…n),大小为8bit,n个连续的Si组成加密位移寄存器,一般n=8;

Oi = Enc(Key, Si);

Lef(x) 为取数据x的最左8个bit位;

A(x,y)为合并x左移8位,空位用y填充

CFB加密算法可表示为:

S0 = IV;

Oi = Enc(Key, Si);

Ci = XOR( Ci, Lef(Oi));

Si = A(Si-1, Ci);

CFB解密算法可表示为:

S0 = IV;

Oi = Enc(Key, Si);

Ci = XOR( Ci, Lef(Oi));

Si = A(Si-1, Ci);

图示:

特点:

  • 每次加密的Pi和Ci不大于64位;
  • 加密算法和解密算法相同,不能适用于公钥算法;
  • 使用相同的密钥和初始向量的时候,相同明文使用CFB模式加密输出相同的密文;
  • 可以使用不同的初始化变量使相同的明文产生不同的密文,防止字典攻击;
  • 加密强度依赖于密钥长度;
  • 加密块长度过小时,会增加循环的数量,导致开销增加;
  • 加密块长度应时8位的整数倍(即字节为单位);
  • 一旦某位数据出错,会影响目前和其后8个块的数据;

输出反馈模式OFB:

与CFB模式不同之处在于, 加密位移寄存器与密文无关了,仅与加密key和加密算法有关;

做法是不再把密文输入到加密移位寄存器,而是把输出的分组密文(Oi)输入到一位寄存器;

定义:

Enc(X,Y)是加密函数

Dec(X,Y)是解密函数

Key是加密密钥;

Pi ( i = 0,1…n)是明文块,大小为64bit;

Ci ( i = 0,1…n)是密文块,大小为64bit;

Si ( i = 0,1…n),大小为8bit,n个连续的Si组成加密位移寄存器,一般n=8;

Oi = Enc(Key, Si);

Lef(x) 为取数据x的最左8个bit位;

A(x,y)为合并x左移8位,空位用y填充

CFB加密算法可表示为:

S0 = IV;

Oi = Enc(Key, Si);

Ci = XOR( Ci, Lef(Oi));

Si = A(Si-1, Oi);          注意这里与CFB模式的不同

CFB解密算法可表示为:

S0 = IV;

Oi = Enc(Key, Si);

Ci = XOR( Ci, Lef(Oi));

Si = A(Si-1, Oi);

特点:

  • 与CFB类似,以下都是不同之处;
  • 因为密文没有参与链操作,所以使得OFB模式更容易受到攻击;
  • 不会进行错误传播,某位密文发生错误,只会影响该位对应的明文,而不会影响别的位;
  • 不是自同步的,如果加密和解密两个操作失去同步,那么系统需要重新初始化;
  • 每次重新同步时,应使用不同的初始向量。可以避免产生相同的比特流,避免”已知明文”攻击 ;

Windows API进行加密参数设置:

CryptGetKeyParam可以对HCRYPTKEY对象的各种参数进行查询,包括加密模式、padding方式等;但这个函数不能用于查询加密key的明文;

但如果需要看到真正加密的key是什么,则需要另外的API:CryptExportKey,选择PLAINTEXTKEYBLOB方式进行导出可以得到key的明文;

使用加密要注意的地方:

当两个封装好的加密算法对8byte数据进行DES加密时,如果加密出来的结果是一样的,千万不要认为这两个算法可以互换;

因为ECB模式,和向量全为0的CBC模式得到的密文前8byte,确实是一样,但后面的密文就不一样了;

使用加密以前确定你理解了它;

互联网程序中加密模式的使用:

ECB是不推荐的方式,Key相同时,相同的明文在不同的时候产生相同的明文,容易遭到字典攻击;

CBC由于加入了向量参数,一定程度上抵御了字典工具,但缺点也随之而来,一旦中间一个数据出错或丢失,后面的数据将受到影响;

CFB与CBC类似,好处是明文和密文不用是8bit的整数倍,中间一个数据出错,只影响后面的几个块的数据;

OFB比CFB方式,一旦一个数据出错,不会影响后面的数据,但安全性降低;

因此,推荐使用CFB方式,但每个数据包单独加密,否则一个数据包丢失,需要做很多容错处理;

当然,具体问题也要具体分析,对于只需要”特定安全性”①,不需要”计算安全性”以上的软件,也可以使用ECB模式;

分享:

时间: 2024-12-14 07:22:55

DES加密模式详解的相关文章

JAVA实现DES加密实现详解

package util; import java.security.SecureRandom;import javax.crypto.spec.DESKeySpec;import javax.crypto.SecretKeyFactory;import javax.crypto.SecretKey;import javax.crypto.Cipher; /** DES加密介绍DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法出自IBM的研究, 后来被美国

安全和加密技术详解

安全和加密技术详解  目录         前言         一.加密技术分类           1.对称机密算法           2.非对称加密           3.单向散列           4.安全通信模型   前  言 随着网络通信和互联网时代的到来,与之而来的互联网安全问题面临很大的威胁.网络的传输的信息随时有可能会被不法分子截获.篡改,对于互联网数据安全和加密技术显得尤为重要. 加密技术其实是一门古老的学科.长期以来一直被应用于军事.情报等部门,例如早期古罗马的凯撒移

Javascript 严格模式详解

Javascript 严格模式详解 作者: 阮一峰 日期: 2013年1月14日 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. 设立"严格模式"的目的,主要有以下几个: - 消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; - 消除代码运行的一些不安全之处,保证代码运行的安全: - 提高编译器效率,增加运行速度

Spartan6系列之芯片配置模式详解

1.   配置概述 Spartan6系列FPGA通过把应用程序数据导入芯片内部存储器完成芯片的配置.Spart-6 FPGA可以自己从外部非易失性存储器导入编程数据,或者通过外界的微处理器.DSP等对其进行编程.对以上任何一种情况,都有串行配置和并行配置之分,串行配置可以减少芯片对引脚的要求,并行配置对8bit/16bit Flash或者微处理器来说更合适. 因为Xilinx的FPGA器件的配置数据存储在CMOS 配置锁存器内(CCL),因此Spartan6 FPGA器件上电后必须重新配置.Sp

java 代理模式详解

java 动态代理(JDK和cglib) 设计模式这东东每次看到就明白可过段时间又不能很流利的说出来,今天就用详细的比喻和实例来加深自己的理解(小弟水平不高有不对的地方希望大家能指出来). (1)代理这个词生活中有很多比如在街边卖手机卡.充公交地铁卡的小商店他们都起了代理的作用,java中的代理跟这些小店商的作用是一样的.再比如我想在淘宝上开个服装店但又没有货源怎么办,这时候我就要跟淘宝上某一卖家联系做他的代理.我跟我的商家都要卖衣服(就好比我们都继承了卖衣服的接口sellClothesInte

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747 如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供

Javascript设计模式之装饰者模式详解篇

一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点:1. 在不改变原对象的原本结构的情况下进行功能添加.2. 装饰对象和原对象具有相同的接口,可以使客户以与原对象相同的方式使用装饰对象.3. 装饰对象中包含原对象的引用,即装饰对象是真正的原对象经过包装后的对象. 二.Javascript装饰者模式详解: 描述:装饰者模式中,可以在运行时动态添加附加功能到对象中.当

Extjs MVC开发模式详解

Extjs MVC开发模式详解 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式,开始将一个JS(Extjs)应用程序分割成Model-View-Controller三层,为JS应用程序的如何组织代码指明了方向,同时使得大规模JS代码变得更加易于重用和维护:这就是Extjs MVC开发模式的初衷. 在官方给出的MVC例子中,我们可以看到一个简单的列表编辑功能,这篇文章就围绕这个功能进

保护模式详解

在ia32下,cpu有两种工作模式:实模式和保护模式. 在实模式下,16位的寄存器用"段+偏移"的方法计算有效地址. 段寄存器始终是16位的.在实模式下,段值xxxxh表示的以xxxx0h开始的一段内存.但在保护模式下,段寄存器的值变成了一个索引(还有附加信息)这个索引指向了一个数据结构的表(gdt/ldt)项,表项(描述符)中详细定义了段的其实地址.界限.属性等内容. 保护模式需要理解:描述符,选择子 描述符包括,存储段描述符(代码段,数据段,堆栈段),系统描述符(任务状态段TSS,