当前位置: 首页 > news >正文

密码学学习记录(三)

密码学学习记录(三)

《图解密码技术》[1]学习记录

密码算法可以分为分组密码(block cipher)和流密码

分组密码只能加密固定长度的明文,因为不知道明文的长度,所以一般需要对分组密码进行迭代,而迭代的方法就被称为分组密码的模式(mode),每一段固定长度称为分组(block),一个分组的比特数称为分组长度(block length),例如DES和三重DES的分组长度为64比特。

流密码则可以对数据流连续处理,一般以1比特、8比特或32比特为单位进行加密或解密

分组密码

分组密码的主要模式有:

  • ECB 模式:Electronic CodeBook mode(电子密码本模式 )
  • CBC 模式:Cipher Block Chainingmode(密码分组链接模式)
  • CFB 模式:Cipher FeedBack mode(密文反馈模式 )
  • OFB 模式:Output FeedBack mode(输出反馈模式)
  • CTR 模式:CounTeR mode(计数器模式)

在所有的分组密码工作模式中,ECB(电子密码本)模式是最直观的一种:当明文较长时,将其划分为多个等长的块,再对每个块分别进行加密。然而,ECB也是最不安全的一种模式,很容易导致一系列安全漏洞,因此在实践中应尽量避免使用。

ECB模式

明文和密文是一一对应的关系,因此很容易就能看出规律,将密文中的重复组合作为线索,就有可能破译出密码,因此ECB模式存在一定风险。

flowchart LR A[明文分组] --> B((加密)) --> C[密文分组]

对ECB模式的攻击

因为ECB模式是对明文分组后加密,而分组长度是固定的,因此攻击者甚至都不需要解密就可以改变解密后的明文,也就是调换分组顺序(或者删除和复制密文分组)就可以实现攻击。

CBC模式

加密方式

首先将明文分组与前一个密文分组进行XOR运算,然后再进行加密。

graph LR subgraph test[CBC模式] A[明文分组] --> B{XOR运算} B --> C((加密)) C --> D[密文分组] E[前一个密文分组] --> B end

由于第一个明文分组前面不存在密文分组,因此需要提供一个分组长度的比特序列来代替“前一个密文分组”,

称为初始化向量(initialization vector, IV), 一般来说,每次加密使用的初始化向量都是随机的。

因为CBC模式每个分组的加密都要依赖前一个密文分组,所以中间如果存在密文分组比特缺失,会导致密文分组长度发生变化,进而导致后面分组出现变化以至于无法解密。

对CBC模式的攻击

攻击者可以对初始化向量进行比特反转,也就是比特反转攻击,导致对应明文分组解密后的相应的比特也反转。

应用实例

通信协议之一IPsec,使用的CBC模式来确保通信机密性。

CFB模式

将前一个密文分组加密后再和明文分组进行XOR运算得到密文

flowchart TDsubgraph test[CFB模式]A[前一个密文分组] --> B((加密))C[明文分组] --> D{XOR}B --> DD --> E[密文分组]end

同理,和CBC模式一样,CFB模式也需要IV,也就是初始化向量

“前一个密文分组”使用密码算法进行加密后得到的比特序列称为 密钥流(key stream) 。

明文分组可以被逐比特加密,因此可以将CFB模式看作是一种使用分组密码来实现流密码的方式。

对CFB模式的攻击

可以使用 重放攻击(reply attack)

截获第一次的密文分组,当发送者再次发送消息的时候将密文分组替换成第一次的密文分组,接收到信息的人不知道是传输错误还是被修改,此时要做出正确判断需要用到消息认证码,

OFB模式

输出反馈模式,将初始化向量经过加密后与明文分组进行XOR运算得到密文分组

flowchart TBIV[初始化向量] --> ENC0[加密]ENC0 --> ENC1[加密]ENC1 --> ENC2[加密]ENC2 --> ENC3[加密]ENC0 --> XOR0[XOR]ENC1 --> XOR1[XOR]ENC2 --> XOR2[XOR]ENC3 --> XOR3[XOR]subgraph Plaintext[明文]P1[明文分组1]P2[明文分组2]P3[明文分组3]P4[明文分组4]endP1 --> XOR0P2 --> XOR1P3 --> XOR2P4 --> XOR3subgraph Ciphertext[密文]C1[密文分组1]C2[密文分组2]C3[密文分组3]C4[密文分组4]endXOR0 --> C1XOR1 --> C2XOR2 --> C3XOR3 --> C4

OFB和CFB的算法很相似,只是和明文分组进行XOR运算的输入不同

CTR模式

CTR模式是一种通过将逐次累加的计数器加密来生成密钥流的流密码

flowchart TBsubgraph CTR_process[CTR模式]CTR0[计数器 CTR] --> ENC0[加密]CTR1[计数器 CTR+1] --> ENC1[加密]CTR2[计数器 CTR+2] --> ENC2[加密]CTR3[计数器 CTR+3] --> ENC3[加密]ENC0 --> XOR0[XOR]ENC1 --> XOR1[XOR]ENC2 --> XOR2[XOR]ENC3 --> XOR3[XOR]P1[明文分组1] --> XOR0P2[明文分组2] --> XOR1P3[明文分组3] --> XOR2P4[明文分组4] --> XOR3XOR0 --> C1[密文分组1]XOR1 --> C2[密文分组2]XOR2 --> C3[密文分组3]XOR3 --> C4[密文分组4]end

计数器的生成方法

每次加密都会生成不同的值(nonce),当分组长度为16字节时(128比特),计数器一般是下面这种形式。

flowchart LRsubgraph CTR[计数器结构]NONCE[66 1F 98 CD 37 A3 8B 4B<br/>nonce]COUNTER[00 00 00 00 00 00 00 01<br/>分组序号]endNONCE --- COUNTER

前8个字节为nonce,每次加密都不同,后八个字节为分组序号,会逐次累加。

分组密码模式比较表

模式 名称 优点 缺点 备注
ECB模式 Electronic CodeBook电子密码本模式 ·简单
·快速
·支持并行计算(加密、解密)
·明文中的重复排列会反映在密文中
·通过删除、替换密文分组可以对明文进行操作
·对包含某些比特错误的密文进行解密时,对应
的分组会出错
·不能抵御重放攻击
不应使用
CBC模式 Cipher Block Chaining
密文分组链接模式
·明文的重复排列不会反映在密文中
·支持并行计算(仅解密)
·能够解密任意密文分组
·对包含某些错误比特的密文进行解密时,第一
个分组的全部比特以及后一个分组的相应比特会出错
·加密不支持并行计算
推荐使用
CFB模式 Cipher-FeedBack
密文反馈模式
·不需要填充(padding)
·支持并行计算(仅解密)
·能够解密任意密文分组
·加密不支持并行计算
·对包含某些错误比特的密文进行解密时,第一个
分组的全部比特以及后一个分组的相应比特会出错
·不能抵御重放攻击
现在已不使用
推荐用CTR模式代替
OFB模式 Output- FeedBack
输出反馈模式
·不需要填充( padding )
·可事先进行加密、解密的准备
·加密、解密使用相同结构
·对包含某些错误比特的密文
进行解密时,只有明文中相
对应的比特会出错
·不支持并行计算
·主动攻击者反转密文分组中的某些比特时,明文分组中相对应的比特也会被反转
推荐用CTR模式代替
CTR模式 CountTeR
计数器模式
·不需要填充( padding )
·可事先进行加密、解密的准备
·加密、解密使用相同结构
·对包含某些错误比特的密文
进行解密时,只有明文中相
对应的比特会出错
·支持并行计算(加密、解密)
主动攻击者反转密文分组中的某些比特时,明文分组中相对应的比特也会被反转 推荐使用

参考文献


  1. 结城浩. 图解密码技术[M]. 周自恒,译. 第2版. 北京:人民邮电出版社, 2014. ↩︎

http://www.hskmm.com/?act=detail&tid=11756

相关文章:

  • 详解scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别
  • [题解]P11095 [ROI 2021] 旅行 (Day 2)
  • DDR5内存时序参数对照表
  • Linux CentOS 第三方扩展模块编译并安装
  • Java ArrayList中的常见删除操作及方法
  • ADC和GPIO的关系
  • 使用Docker Compose工具进行容器编排的教程
  • 模拟输入的过程
  • 基于Redisson和自定义注解的分布式锁实现策略
  • CCPC2025网络赛 游记
  • 知行合一
  • Manim实现水波纹特效
  • 深入解析:解锁AI智能体:上下文工程如何成为架构落地的“魔法钥匙”
  • JS之使用for...of赋值失败的原因分析
  • String
  • Linux /lib/modules/$(uname -r)/ 目录功能作用详解
  • 《建筑的永恒之道》第 27 章:道之核心
  • 软件工程第二次作业_个人项目
  • Linux命令大全(档案管理)
  • 小狼毫雾凇拼音安装部署
  • Chapter 3 Resize and Cropping
  • 详细介绍:java中常见的几种排序算法
  • 使用FFmpeg转换m4a
  • 提升多屏监控体验/新增辅屏预览功能/轻松实现跨屏实时监控/支持高达500路多个屏幕同时显示
  • [Java SE/文件系统/IO] 核心源码精讲:java.io.File
  • Linux 内核整体架构详解
  • atoi() - 字符串( ASCLL )转换为整数( int )
  • 02.Python:Flash初步使用
  • 解决Kubernetes集群中master节点无法与node节点通信的策略
  • 从高版本的sqlserver向低版本的sqlserver上复制表和数据的方法