【转】对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)

版权声明:本文为作者原创,如需转载,请注明出处
https://blog.csdn.net/weixin_42940826
注:以下图片来自于《图解密码学》,这本书讲的更全面细致,建议阅读,在我资源库中有此书,还有使用go语言具体实现和解释此书中的各种加密算法的文档,有需要的可以自习前往免费下载

Q:为什么需要分组模式?
A:明文的长度不固定,而分组密码只能处理特定长度的一块数据,这就需要对分组密码的算法进行迭代,以便将一段很长的明文全部加密,而迭代的方法就是分组的模式。

一图全览五种分组模式

常用分组模式全览

五种模式详解

1. ECB - Electronic Code Book, 电子密码本模式

  • 特点: 简单, 效率高, 密文有规律, 容易被破解
  • 最后一个明文分组必须要填充
    • des/3des -> 最后一个分组填充满8字节
    • aes -> 最后一个分组填充满16字节
  • 不需要初始化向量

ECB模式图解


2. CBC - Cipher Block Chaining, 密码块链模式(推荐使用)

  • 特点: 密文没有规律, 经常使用的加密方式
  • 最后一个明文分组需要填充
    • des/3des -> 最后一个分组填充满8字节
    • aes -> 最后一个分组填充满16字节
  • 需要一个初始化向量 - 一个数组
    • 数组的长度: 与明文分组相等
    • 数据来源: 负责加密的人的提供的
    • 加解密使用的初始化向量值必须相同
      CBC模式的加密

3. CFB - Cipher FeedBack, 密文反馈模式

  • 特点: 密文没有规律, 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文
  • 需要一个初始化向量 - 一个数组
    • 数组的长度: 与明文分组相等
    • 数据来源: 负责加密的人的提供的
    • 加解密使用的初始化向量值必须相同
  • 不需要填充
    CFB模式加密

4. OFB - Output-Feedback, 输出反馈模式

  • 特点: 密文没有规律, 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文
  • 需要一个初始化向量 - 一个数组
    • 数组的长度: 与明文分组相等
    • 数据来源: 负责加密的人的提供的
    • 加解密使用的初始化向量值必须相同
  • 不需要填充
    OFB分组模式

5. CTR - CounTeR, 计数器模式(重点,推荐使用)

  • 特点: 密文没有规律, 明文分组是和一个数据流进行的按位异或操作, 最终生成了密文
  • 不需要初始化向量
    • go接口中的iv可以理解为随机数种子, iv的长度 == 明文分组的长度
  • 不需要填充
    这里我们有必要给出CTR模式额解密流程,因为CTR模式的解密和加密是一模一样的过程,在程序实现中也是可逆的,具体程序在文章实现底部有链接
    CTR分组模式
    CTR解密流程
    通过对比发现CTR加密即解密,解密即加密,且各分组之间是独立的,可以并发完成,效率高。

总结

以上五种分组模式中,ECB模式很容易被破解,如今已经很少再使用,其余四种分组模式各有千秋。
但极力推荐CBC模式和CTR模式,尤其是CTR模式,不需要填充,代码实现起来很方便。而且加密和解密的方法是一样的,并且可以实现并发分组,效率高,安全性也有保障

Q:何时需要填充,何时不需要填充?
A:观察分组模式的图示可以看出,加密后再进行异或操作的不需要填充,而先进行异或操作再加密的则需要填充,这是因为异或操作需要两个相同长度的数据,一一对比计算!


代码实现

篇幅有限,我在这篇帖子用以上分组模式实现了AES、DES、3DES的加密解密(go语言),轻戳了解。
CBC模式实现DES和3DES加密解密
CTR模式实现AES加密解密

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中发生数据丢失_如何防止Redis脑裂导致数据丢失?

所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话&a…

【转】TransactionScope事务简介

在.NET 1.0/1.1 版本我们使用SqlTransaction.处理事务 string connString ConfigurationManager.ConnectionStrings["db"].ConnectionString; using (var conn new SqlConnection(connString)) { conn.Open(); using (IDbTransaction tran conn.BeginTransact…

网络通道数2的倍数_限流笔记-通道限流(二)

在工作中的时候,由于我负责的一个系统需要调用很多的第3方的系统,可是呢,这些个第3方的系统的性能完全不一致,有的好有的坏,还成本都不一样,当然了平时把,直接使用成本低的就行了,但…

mysql题目_MySQL练习题

创建下列表并创建相关约束问题1:查询出成绩表,而且student_id 后面要有对应的学生名,course_id 后面要有对应的课程名.1 SELECT2 score.sid,3 score.student_id,4 student.sname,5 score.course_id,6 course.cname,7 score.number8 FROM scor…

查看mysql数据库的死锁日志_【MySQL】mysql死锁以及死锁日志分析

1.死锁的概念死锁:死锁一般是事务相互等待对方资源,最后形成环路造成的。对于死锁,数据库处理方法:牺牲一个连接,保证另外一个连接成功执行。发生死锁会返回ERROR:1213 错误提示,大部分的死锁In…

【转】二进制文件和ASCII文件有何区别

二进制文件和ASCII文件(即文本文件)的区别,对于和计算机亲近时间尚短的同学是个难题。本文用简单的例子,试图展示其中的道道,希望能对菜鸟们有些帮助。 1、一个例子:两种100000 有程序: #includ…

【转】为什么不能使用字符流读取非文本的二进制文件?

读取文件 刚学Java的IO流部分时,书上说只能使用字节流去读取图片、视频等非文本二进制文件,不能使用字符流,否则文件会损坏。所以我就一直记住这一点了,但是为什么不能使用,这一直是我的一个疑惑。今天,我…

mysql更新一条语句_MySQL一条更新语句是如何执行的

一条查询语句是经过连接器 分析器 优化器 执行器等功能模块,最后到达存储引擎。image以下所说的都基于InnoDb引擎。当有一条记录需要更新的时候,InnoDB引擎会先把记录写到redo log里面,并更新内存,这个时候更新就算完成了。InnoDb…

cesium获取模型实时坐标_Cesium 顶点着色器中求解模型坐标

1. 由世界坐标转模型坐标顶点着色器:attribute vec3 position3DHigh;attribute vec3 position3DLow;attribute vec3 normal;attribute vec2 st;attribute float batchId;varying vec3 v_positionEC;varying vec3 v_normalEC;varying vec2 v_st;void main(){vec3 pos…

【转】关于CLR内存管理一些深层次的讨论[上篇]

半年之前,PM让我在部门内部进行一次关于“内存泄露”的专题分享,我为此准备了一份PPT。今天无意中将其翻出来,觉得里面提到的关于CLR下关于内存管理部分的内存还有点意思。为此,今天按照PPT的内容写了一篇文章。本篇文章不会再讨论…

【转】.NET Remoting

.Net Remoting提供了一种允许一个应用域中的对象与另一个应用域中的对象进行交互的框架。是.NET框架中的一个重要技术改进,它用于减轻运行应用程序的系统开销. 中文名 .Net Remoting 作 用 减轻运行应用程序的系统开销 目录 1 介绍2 .NET Remoting的原理 ▪ 1.NET Rem…

python多重赋值技巧_python教程12课:多元赋值、多重赋值、运算符以及判断字符串类型...

# 多元赋值:# x,y,z 和 1,2,‘String是两个元组,只不过元组的 () 被省略掉了x, y ,z 1, 2, Stringprint(x, y, z)(x, y ,z) (3, 4, String)print(x,y,z)# 一般用在交换变量值#交换变量值常规思路x 10,y 20z 30x ,y, z y,z,xprint(x,y,z)#使用多元赋值…

【转】关于CLR内存管理一些深层次的讨论[下篇]

《上篇》中我们主要讨论的是程序集(Assembly)和应用程序域(AppDomain)的话题,着重介绍了两个不同的程序集加载方式——独占方式和共享方式(中立域方式);以及基于进程范围内的字符串驻…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

理解堆与栈 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型 深入浅出图…

bi 存储过程方案_BI 系统中容易被忽视的数据源功能

BI 系统中容易被忽视的数据源功能用户在选购 BI 解决方案的时候,常常会更关注界面环节的功能指标,比如美观性、操作的流畅性、移动端支持等等。毕竟,BI 是要给业务人员使用的,这些看得见的内容一般不容易被遗漏。然而,…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

栈基本工作原理 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型 深入浅…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 本文将介绍值类型与引用类…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(一)

一、垃圾收集平台基本原理解析 在C#中程序访问一个资源需要以下步骤: 调用中间语言(IL)中的newobj指令,为表示某个特定资源的类型实例分配一定的内存空间。初始化上一步所得的内存,设置资源的初始状态,从而…

【转】.net框架读书笔记---CLR内存管理\垃圾收集(七)

编程控制垃圾收集器 System.GC类型为应用程序提供了直接控制垃圾收集器的一些方法,可以通过GC.MaxGeneration来查询托管堆支持的最大代龄,目前为2。 通过下面方法执行垃圾收集器 GC.Collect(int);传递代龄,传递0,收集0代&#xff…

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1

前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。 简介 这篇文章我们将介绍一些方…