zoukankan      html  css  js  c++  java
  • 分组加密的四种模式(ECB、CBC、CFB、OFB)

    加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption)。
    对称加密又分为分组加密和序列password。
    分组password。也叫块加密(block cyphers)。一次加密明文中的一个块。是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运算),还原成明文组。


    序列password。也叫流加密(stream cyphers),一次加密明文中的一个位。是指利用少量的密钥(制乱元素)通过某种复杂的运算(password算法)产生大量的伪随机位流,用于对明文位流的加密。
    解密是指用相同的密钥和password算法及与加密相同的伪随机位流,用以还原明文位流。

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

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



    DES ECB(电子密本方式)事实上很easy。就是将数据依照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,依照需求补足8个字节进行计算,之后依照顺序将计算所得的数据连在一起就可以。各段数据之间互不影响。


    特点:

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

    2)CBC(Cipher Block Chaining)/密文分组链接方式


    DES CBC(密文分组链接方式)有点麻烦。它的实现机制使加密的各段数据之间有了联系。事实上现的机理例如以下:

    加密过程例如以下:

    1)首先将数据依照8个字节一组进行分组得到D1D2......Dn(若数据不是8的整数倍,用指定的PADDING数据补位)

    2)第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)

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

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

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

    解密是加密的逆过程。过程例如以下:

    1)首先将数据依照8个字节一组进行分组得到C1C2C3......Cn

    2)将第一组数据进行解密后与初始化向量I进行异或得到第一组明文D1(注意:一定是先解密再异或)

    3)将第二组数据C2进行解密后与第一组密文数据进行异或得到第二组数据D2

    4)之后依此类推。得到Dn

    5)按顺序连为D1D2D3......Dn即为解密结果。

    这里注意一点,解密的结果并不一定是我们原来的加密数据,可能还含有你补得位。一定要把补位去掉才是你的原来的数据。

    特点:
    1. 不easy主动攻击,安全性好于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。能够将块password变为自同步的流password;工作过程亦很相似,CFB的解密过程差点儿就是颠倒的CBC的加密过程:
    须要使用一个与块的大小同样的移位寄存器。并用IV将寄存器初始化。然后。将寄存器内容使用块password加密,然后将结果的最高x位与平文的x进行异或,以产生密文的x位。

    下一步将生成的x位密文移入寄存器中。并对以下的x位平文反复这一过程。

    解密过程与加密过程相似,以IV開始,对寄存器加密,将结果的高x与密文异或,产生x位平文。再将密文的以下x位移入寄存器。
    与CBC相似,平文的改变会影响接下来全部的密文,因此加密过程不能并行化;而相同的,与CBC类似,解密过程是能够并行化的。


    4)Output Feedback (OFB)/输出反馈模式


    输出反馈模式(Output feedback, OFB)能够将块password变成同步的流password。它产生密钥流的块,然后将其与平文块进行异或。得到密文。

    与其他流password一样,密文中一个位的翻转会使平文中相同位置的位也产生翻转。

    这样的特性使得很多错误校正码,比如奇偶校验位。即使在加密前计算而在加密后进行校验也能够得出正确结果。
    每一个使用OFB的输出块与其前面全部的输出块相关。因此不能并行化处理。

    然而,因为平文和密文仅仅在终于的异或过程中使用。因此能够事先对IV进行加密。最后并行的将平文或密文进行并行的异或处理。
    能够利用输入全0的CBC模式产生OFB模式的密钥流。这样的方法十分有用。由于能够利用高速的CBC硬件实现来加速OFB模式的加密过程。




  • 相关阅读:
    vue点击实现箭头的向上与向下
    ES6中箭头函数加不加大括号的区别
    angular图片的两种表达方式
    通过添加类名实现样式的变化
    angular中路由跳转并传值四种方式
    Sublime Text 3 设置文件详解(settings文件)
    Second:eclipse配置Tomcat
    First:安装配置JDK and 部署Tomcat
    本地环境代码一码云一服务器代码部署
    2.sublime设置本地远程代码同步
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7162334.html
Copyright © 2011-2022 走看看