(本文资料主要来自:http://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

目前流行的加密和数字认证算法,都是采用块加密(block cipher)方式(注:还有一种叫 stream cipher,流式加密)。就是将需要加密的明文分成固定大小的数据块,然后对其执行密码算法,得到密文。数据块的大小通常采用跟密钥一样的长度。

加密模式在加密算法的基础上发展出来,同时也可以独立于加密算法而存在。加密算法,如DES、AES等不多的几种,目前采用最多的是AES。而加密模式是定义怎样通过重复利用加密算法将大于一个数据块大小的明文转化为密文。目前利用较多的加密模式有以下几种:

• ECB:Electronic Code Book(电子码本模式)
• CBC:Cipher Block Chaining(密码块链模式)
• CTR:Counter(计数器模式)

此外,还有其他的一些模式,本文中将不做介绍。
• CFB:Cipher Feedback(密码反馈模式)
• OFB:Output Feedback(输出反馈模式)


电子码本模式(ECB)

这是一种最简单的加密模式,只是将明文分块,并将加密算法应用于数据块,没有任何其他的前后处理。加密和解密流程如下图所示:

在ECB加密模式下,各个数据块的加解密是完全独立的,因此各个数据块的处理可以完全平行地进行,易于用硬件实现,达到很高的处理性能。但ECB有一个致命的弱点,也即不能隐藏明文数据的特定模式。在数据模式中包含较多有用信息时,不用破解就可以发现很多信息。下面就是一个用ECB对一个图像文件加密的典型例子,主要信息实际上已经泄漏了。

另外,由于相同的明文总是得到相同的密文,因此不能抵挡回放攻击(Playback Attack)。比如说,可能不能窃取到你的密码信息,只要通过监视偷录到密码加密后的数据,就可以通过回放进入到你的网上账户。

为了解决以上两个问题,就需要对加密后的数据进行二次处理,以破坏其中的数据模式,同时达到相同的明文在不同时刻加密得到不同的密文,以有效阻止回放攻击。

密码块链模式(CBC)

CBC的基本思路是在明文的各个模块加密之前,与另一个选定的数据块执行一次异或操作,有效地破坏明文数据中的模式。为了保持所选的数据块的随机性,在CBC中选择了前一个数据块的密文。但是对第一个数据块,因为没有前一个数据块的加密结果,需要引入一个初始向量(Initialization Vector: IV)作为选定的数据块。加解密流程如下图所示:

从上述流程图可以看出,CBC的最大问题是各个数据块的加密必须按顺序进行,但解密是可以平行进行的。

CBC的还有一个有趣的特点是,即使中间有一个密文数据块丢失,这只影响它后面的一个数据块的解密,此后的数据块还是可以正确解密的。这个特点引入了一个解决IV选择的思路:Explicit Initialization Vector。在明文之前加一个随机数据块,然后用一个随机的IV对它加密。IV和这随机数据块并不通知到解密侧。在解密侧,第一个数据块由于缺少IV信息,不能正确解密,但其后的数据块都可以正确解密。由于第一个数据块是为了加密而引入的内容,因此可以得到完整的明文内容。

上述Linux企鹅用CBC加密后的数据就非常接近伪随机数。如下图所示:

计数器模式(CTR)

CTR模式的加解密流程如下图所示。

CTR模式解决问题的思路与CBC等不同,它是对一个构建成的数据块施行加密操作,然后再用生成的密文与明文进行异或操作,生成最后的密文。由于对于各个模块的加解密操作都是独立的,因此可以平行处理。

在CTR模式中,加密操作用的构建数据块由两部分构成:Nonce和Counter。为了保证安全性,通常要求Nonce在一个Key的使用周期内保持唯一。在能够保证时间同步的系统中,经常选择时间作为Nonce。

另外,在CTR处理中,不需要对明文进行pad补0操作。

CTR模式广泛用在各种系统中,在互联网和物联网中广泛使用的CCM模式的加解密部分用的就是CTR模式。

数据块加密模式以及IV的意思的更多相关文章

  1. openssl之aes加密(源码分析 AES_encrypt 与 AES_cbc_encrypt ,加密模式)

    首先要了解AES加密是什么,以及几种加密模式的区别.之后才是编程.具体的编程案例,在下面的链接. openssl之aes加密(AES_cbc_encrypt 与 AES_encrypt 的编程案例) ...

  2. 参考别人的代码写的aes加密,记录一下(AES,ECB模式,填充PKCS5Padding,数据块128位,偏移量无,以hex16进制输出)

    package org.jimmy.autosearch2019.test; import java.security.SecureRandom; import javax.crypto.Cipher ...

  3. DES加密模式详解

    DES加密模式详解 http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html http://www.blogjava.net/wayn ...

  4. AES块加密与解密

    AES块加密与解密 解密目标 在CBC和CTR两种模式下分别给出十篇加密的样例密文,求解密一篇特定的密文 解密前提 全部密文及其加密使用的key都已给出 加密的方法遵循AES的标准 解密过程分析 实验 ...

  5. 无线路由器的加密模式WEP,WPA-PSK(TKIP),WPA2-PSK(AES) WPA-PSK(TKIP)+WPA2-PSK(AES)。

    目前无线路由器里带有的加密模式主要有:WEP,WPA-PSK(TKIP),WPA2-PSK(AES)和WPA-PSK(TKIP)+WPA2-PSK(AES). WEP(有线等效加密)WEP是Wired ...

  6. Aes加密算法加密模式介绍

    本文转自:https://www.jianshu.com/p/582d3a47729a AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中 ...

  7. DES算法与四种加密模式的代码实现(C++语言)

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Love_Irelia97/article/ ...

  8. [编码解码] 关于AES加解密中CBC模式的IV初始化向量的安全性问题

    copy from : https://www.jianshu.com/p/45848dd484a9 前段时间,在研究HLS的AES加密,由于一个地方电视台的HLS流有AES加密,在查看了相关的加解密 ...

  9. AES加密模式

    https://baike.baidu.com/item/高级加密标准/468774 AES加密模式 对称/分组密码一般分为流加密(如OFB.CFB等)和块加密(如ECB.CBC等).对于流加密,需要 ...

随机推荐

  1. js表单计算金额问题

    <table width="600" border="1" align="center" style="text-align ...

  2. shell脚本中,将所有的参数值否赋给一个变量或者说将所有的参数合成一个字符串,获取所有参数

    需求描述: 在写脚本的过程中,遇到这样的一个需求,将脚本执行过程中,传递给 脚本的所有的参数,都赋值给一个变量然后在对这个变量进行处理. 测试过程: 通过以下的脚本将所有传递给脚本的变量都赋值一个变量 ...

  3. when an event of selector will be fired

    OP_READ Operation-set bit for read operations. Suppose that a selection key's interest set contains ...

  4. 关于 MVVMLight 设计模式系列

    MVVM设计模式你可以在WPF.Silverlight.Windows Phone开发中使用,我想至今已经有非常非常多的朋友正在使用MVVM设计模式,尤其是MVVMLight . 本系列文章以WPF举 ...

  5. 第四章 Spring.Net 如何管理您的类___对象的自动装配

    由于这几天都比较忙,所以对笔记暂时没有更新. Spring.NET具有自动装配的能力,也就是说,Spring.NET可以通过对象的定义自动分辨某个对象的协作对象.自动装配是针对单个对象(按:针对每个协 ...

  6. Effective C++ Item 14 Think carefully about copying behavior in resource-managing classe

    In C++, the only code that guaranteed to be executed after an exception is thrown are the destructor ...

  7. php和mySQL结合使用

    首先,我建立了一个名为class的表,里面有cid,cname,cnum,我想用php代码来实现这一效果,步骤如下: 1.链接数据库 mysqli_set_charset($coon,"ut ...

  8. 【mysql】mysql front 提示Access violation at address 010C9CD0 in module ‘mysql-front.exe’

    1 错误描述: 利用mysql-front 工具新建数据库.提示了一下错误 2 解决办法: 内存越界问题,最好重新注册下Windows的动态链接库 首先“开始”—“cmd” 在打开的dos窗口中运行

  9. JS-高程3(更新中...)

    附录A 名词解析: const:声明常量,常量的值不能通过重新赋值来改变,并且在初始赋值后,不能重新声明.重新赋值了. 即:同一作用域中,常量名不能与其他变量或函数名重名.值也不能修改了. “常量是块 ...

  10. FlipClock.js时钟,计数,3D翻转插件

    1.FlipClock.js能够自动定义计数,时钟的翻牌效果,调用简单,下面简单记录下用法 2.官网地址:http://www.flipclockjs.com/ 3.调用2个文件 <link h ...