标题：ISO10116
标准信息
工作组：ISO/IEC JTC 1/SC 27 
采标情况：BS ISO/IEC 10116-2006,IDT 
中国标准分类：L80 
国际标准分类：35.040 
标准状态：替代ISO/IEC 10116-1997、ISO/IEC FDIS 10116-2005; 
文档页数：48 
加密模式
ISO10116用的算法是对称块加密算法加密模式。
在openssl或其他密码相关的资料中，我们经常看到对称加密算法有ECB、CBC之类加密模式的简称，到底这些加密模式是什么呢？它们之间有什么不同呢，今天就是为大家解开这个迷。
在现有的对称加密算法中，主要有4种加密处理模式，这4种加密处理模式一般是针对块加密算法而言的，如DES算法。这4种加密模式罗列如下：
模式中文描述             英文名称（Openssl缩写）
电子密码本模式        Electronic Code Book(ECB)
加密块链模式           Cipher Block Chaining(CBC)
加密反馈模式           Cipher Feedback Mode(CFB)
输出反馈模式           Output Feedback Mode(OFB)
下面我们分别介绍这4种加密模式。
电子密码本模式这种模式是最早采用和最简单的模式，它将加密的数据分成若干组，每组的大小跟加密密钥长度相同，然后每组都用相同的密钥进行加密。比如DES算法，一个64位的密钥，如果采用该模式加密，就是将要加密的数据分成每组64位的数据，如果最后一组不够64位，那么就补齐为64位,然后每组数据都采用DES算法的64位密钥进行加密。下图：
_______________________
My name |is Drago|nKing
-----------------------
上图“My name is DragonKing”这句话每8个字符(64位)作为一块，然后使用一个相同的64位的密钥对每个块进行加密，最后一块不足64位，就补齐后再进行加密。
可以看到，因为ECB方式每64位使用的密钥都是相同的，所以非常容易获得密文进行密码破解，此外，因为每64位是相互独立的，有时候甚至不用破解密码，只要简单的将其中一块替换就可以达到黑客目的。
加密块链模式该模式如下图所示:
P0            P1                               C0             C1
|                |                                    |               |
|                |                                    |----|         |--->...
IV--->XOR     |--->XOR   |--->...           Key Dec   |       Dec
|       |         |       |                            |       |        |
|       |         |       |                            |       |        |
Key Enc      |      Enc     |                IV--->XOR   |--->XOR    
| ----- |         |-----|                           |                |     
|                 |                                   |                |
C0            C1                                P1             P2
加密过程                                       解密过程
从这两个图中大家可以看到，CBC模式的加密首先也是将明文分成固定长度（64位）的块（P0，P1...），然后将前面一个加密块输出的密文与下一个要加密的明文块进行XOR（异或）操作计算，将计算结果再用密钥进行加密得到密文。第一明文块加密的时候，因为前面没有加密的密文，所以需要一个初始化向量（IV）。跟ECB方式不一样，通过连接关系，使得密文跟明文不再是一一对应的关系，破解起来更困难，而且克服了只要简单调换密文块可能达到目的的攻击。
但是该加密模式的缺点是不能实时解密，也就是说，必须等到每8个字节都接受到之后才能开始加密，否则就不能得到正确的结果。这在要求实时性比较高的时候就显得不合适了。所以才有了下面两种加密模式。加密反馈模式加密反馈模式为了克服必须等待8个字节全部得到才能进行解密的缺点，采用了一个64位（8个字节）的位移寄存器来获得密文，如下图所示：
C2|C3|C4|C5|C6|C7|C8|C9<---|        C2|C3|C4|C5|C6|C7|C8|C9<---|
-------------------------------     |            -------------------------------     |
|                         |                               |                        |
|                         |                               |                        |
Key--->Enc                      |C10            Key--->Enc                     |C10
|                         |                               |                        |
|                         |                               |                        |
取最左一个字节              |                 取最左一个字节               |
|                         |                               |                        |
|                         |                               |                        |
P10--->XOR----------------->C10          C10--->XOR----------------)--->P10
|______________| 
加密过程                                                解密过程
上面两个图中C2、C3以及P10等都是一个字节（8位）的数据，所以能够实现字符的实时加密和解密，不用再等到8个字节都接受到之后再进行解密。图示是在进行第10个字节数据的加密和解密过程，在该过程中，先从移位寄存器取8个字节的数据（C2到C9）用密钥进行加密，然后取加密数据最左边的一个字节跟输入的明文P10进行XOR（异或）操作，得到的值作为输出密文C10，同时将C10送入到移位寄存器中。
需要注意的是，如果其中有一个字节的密文在传输的时候发生错误（即使是其中的一位），那么它出现在移位寄存器期间解密的8个字节的数据都会得不到正确的解密结果，当然，这8个字节过去之后，依然可以得到正确的解密结果。但是一个比特错误就影响到8个字节（64个比特）的正确结果，导致鲁棒性太差，所以就又提出了下面的加密模式OFB。输出反馈模式输出反馈模式OFB跟CFB几乎是一样的，除了其以为寄存器的输入数据稍微有一点不同之外，如下图：
S2|S3|S4|S5|S6|S7|S8|S9<----|           S2|S3|S4|S5|S6|S7|S8|S9<------|
-------------------------------     |                -------------------------------     |
|                          |                                   |                        |
|                          |                                   |                        |
Key--->Enc                       |S10              Key--->Enc                     |S10
|                           |                                  |                        |
|                           |                                  |                        |
取最左一个字节                 |                   取最左一个字节               |
|______________|                               |_____________|
| |                       
P10--->XOR----------------->C10          C10--->XOR------------------->P10
加密过程                                                解密过程
可以看到，这种方法因为没有采用密文作为加密的数据，所以克服了由于传输过程中由于单个比特导致64个相关比特解密失败的情况，在本模式下，如果一个比特发生错误了，那么只会影响其本身对应的一个比特，而不会影响别的。但是相对于其它模式，因为数据之间相关性小，这种加密模式是比较不安全的，所以在应用的时候除非特别需要，一般不提倡应用OFB模式。