加密模式

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

电子密码本模式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模式;

 

转自http://blog.csdn.net/fw0124/article/details/8472560

加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption)。

对称加密又分为分组加密和序列密码。
分组密码,也叫块加密(block cyphers),一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。
序列密码,也叫流加密(stream cyphers),一次加密明文中的一个位。是指利用少量的密钥(制乱元素)通过某种复杂的运算(密码算法)产生大量的伪随机位流,用于对明文位流的加密。
解密是指用同样的密钥和密码算法及与加密相同的伪随机位流,用以还原明文位流。

在分组加密算法中,有ECB,CBC,CFB,OFB这几种算法模式。

1)ECB(Electronic Code Book)/电码本模式



1.简单,有利于并行计算,误差不会被传送;
2.不能隐藏明文的模式;
repetitions in message may show in cipher text/在密文中出现明文消息的重复 
3.可能对明文进行主动攻击;
加密消息块相互独立成为被攻击的弱点/weakness due to encrypted message blocks being independent 

2)CBC(Cipher Block Chaining)



这个词在分组密码中经常会用到,它是指一个明文分组在被加密之前要与前一个的密文分组进行异或运算。当加密算法用于此模式的时候除密钥外,还需协商一个初始化向量(IV),这个IV没有实际意义,只是在第一次计算的时候需要用到而已。采用这种模式的话安全性会有所提高。
1. 不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。
each ciphertext block depends on all message blocks/每个密文块依赖于所有的信息块
thus a change in the message affects all ciphertext blocks/明文消息中一个改变会影响所有密文块
2. need Initial Vector (IV) known to sender & receiver/发送方和接收方都需要知道初始化向量 
3.加密过程是串行的,无法被并行化(在解密时,从两个邻接的密文块中即可得到一个平文块。因此,解密过程可以被并行化);误差传递

3)Cipher Feedback (CFB)


密文反馈(CFB,Cipher feedback)模式类似于CBC,可以将块密码变为自同步的流密码;工作过程亦非常相似,CFB的解密过程几乎就是颠倒的CBC的加密过程:
需要使用一个与块的大小相同的移位寄存器,并用IV将寄存器初始化。然后,将寄存器内容使用块密码加密,然后将结果的最高x位与平文的x进行异或,以产生密文的x位。下一步将生成的x位密文移入寄存器中,并对下面的x位平文重复这一过程。解密过程与加密过程相似,以IV开始,对寄存器加密,将结果的高x与密文异或,产生x位平文,再将密文的下面x位移入寄存器。
与CBC相似,平文的改变会影响接下来所有的密文,因此加密过程不能并行化;而同样的,与CBC类似,解密过程是可以并行化的。

4)Output Feedback (OFB)


输出反馈模式(Output feedback, OFB)可以将块密码变成同步的流密码。它产生密钥流的块,然后将其与平文块进行异或,得到密文。与其它流密码一样,密文中一个位的翻转会使平文中同样位置的位也产生翻转。这种特性使得许多错误校正码,例如奇偶校验位,即使在加密前计算而在加密后进行校验也可以得出正确结果。
每个使用OFB的输出块与其前面所有的输出块相关,因此不能并行化处理。然而,由于平文和密文只在最终的异或过程中使用,因此可以事先对IV进行加密,最后并行的将平文或密文进行并行的异或处理。
可以利用输入全0的CBC模式产生OFB模式的密钥流。这种方法十分实用,因为可以利用快速的CBC硬件实现来加速OFB模式的加密过程。

 

posted @ 2015-10-15 10:15  LarryKnight  阅读(400)  评论(0编辑  收藏  举报