数据块加密模式以及IV的意思
(本文资料主要来自: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的意思的更多相关文章
- openssl之aes加密(源码分析 AES_encrypt 与 AES_cbc_encrypt ,加密模式)
首先要了解AES加密是什么,以及几种加密模式的区别.之后才是编程.具体的编程案例,在下面的链接. openssl之aes加密(AES_cbc_encrypt 与 AES_encrypt 的编程案例) ...
- 参考别人的代码写的aes加密,记录一下(AES,ECB模式,填充PKCS5Padding,数据块128位,偏移量无,以hex16进制输出)
package org.jimmy.autosearch2019.test; import java.security.SecureRandom; import javax.crypto.Cipher ...
- DES加密模式详解
DES加密模式详解 http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html http://www.blogjava.net/wayn ...
- AES块加密与解密
AES块加密与解密 解密目标 在CBC和CTR两种模式下分别给出十篇加密的样例密文,求解密一篇特定的密文 解密前提 全部密文及其加密使用的key都已给出 加密的方法遵循AES的标准 解密过程分析 实验 ...
- 无线路由器的加密模式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 ...
- Aes加密算法加密模式介绍
本文转自:https://www.jianshu.com/p/582d3a47729a AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中 ...
- DES算法与四种加密模式的代码实现(C++语言)
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Love_Irelia97/article/ ...
- [编码解码] 关于AES加解密中CBC模式的IV初始化向量的安全性问题
copy from : https://www.jianshu.com/p/45848dd484a9 前段时间,在研究HLS的AES加密,由于一个地方电视台的HLS流有AES加密,在查看了相关的加解密 ...
- AES加密模式
https://baike.baidu.com/item/高级加密标准/468774 AES加密模式 对称/分组密码一般分为流加密(如OFB.CFB等)和块加密(如ECB.CBC等).对于流加密,需要 ...
随机推荐
- 设置div滚动条
这个是很常见的一个任务了,基本是通过CSS去实现滚动条. 滚动条 设置是否显示滚动条主要是在CSS中设置下列的属性: 代码如下: overflow:visible|auto|hidden|scroll ...
- Tomcat源码学习
Tomcat源码学习(一) 转自:http://carllgc.blog.ccidnet.com/blog-htm-do-showone-uid-4092-type-blog-itemid-26309 ...
- Unity文件操作路径
Unity3D中的资源路径: Application.dataPath:此属性用于返回程序的数据文件所在文件夹的路径.例如在Editor中就是Assets了. Application.streamin ...
- .NETFramework、C#、VisualStudio 这三者之间关系,你了解吗!
.NetFrameWork 是微软开发的以"虚拟机"运行,以通用语言运行库为基础,在其上面进行各种语言开发的一个开发平台. C# 是一个和平台更好交互,以托管在虚拟机上的一个语法糖 ...
- JAVA程序员应该看的15本书的电子版
转载▼ 转载自:http://blog.sina.com.cn/s/blog_8297f0d00100v5ew.html 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多, ...
- 第五章 面向方面编程___OOP和AOP随想
面向方面编程,又称面向切面编程(Aspect-Oriented-Programming),英文缩写 AOP,可以说是 OOP(Object-Oriented-Programming)面向对象编程的补充 ...
- Linux 任务计划:crontab
(1) 什么是任务计划:也就是设置服务器在某个指定的时间执行某个指定的任务,比如执行一个命令,或执行一个脚本(2) Linux 使用 cron 服务来制定任务计划,cron 是服务名称,crond 是 ...
- hex()
hex() 用于将十进制数字转换成十六进制 In [1]: hex(10) Out[1]: '0xa' In [2]: hex(11) Out[2]: '0xb'
- STM32总线结构和存储器
也就说我们所操作的就是别名区的位
- STM32学习之路之入门篇
2006年ARM公司推出了基于ARMV7架构的cortex系列的标准体系结构,以满足各种技术得不同性能要求,包含了A,R,M三个分工明确的系列 其中A系列面向复杂的尖端应用程序,用于运行开放式的复杂操 ...