Shinkai005

V1

2023/02/21阅读:21主题:极简黑

【CSF】安全第四节课-Cryptography 密码学上

【CSF】安全第四节课-Cryptography 密码学上

感恩我的老师们~

PPT- Cryptography 密码学

大纲

  • 密码学Cryptography

    • 上下文

    • 成分

    • 分类

    • 攻击

  • 对称加密:分组密码Symmetric Encryption: Block Cipher

    • DES/三重DES (Feistel密码结构)
      • AES
  • 对称加密:流密码•Symmetric Encryption: Stream Cipher

    • RC4
  • 操作的密码分组模式

加密:上下文

image-20230203233723259
image-20230203233723259
image-20230131110925969
image-20230131110925969

图一和图二交代了加密出现的环境context

Andy给Sam发送问候消息~ 被E窃取信息,窜改成借钱信息.

但是在加密情况下添加了key. 解密后报错~(解密不成E想表达的句子)

加密:原料

  • 明文Plaintext:原始消息
  • 加密算法Encryption algorithm: 对纯文本进行替换/变换
  • 密钥: 算法输入,替换/变换依赖于密钥
  • 暗文Ciphertext: :算法输出,依赖于明文和密钥
  • 解密算法Decryption :反向加密
image-20230203234224065
image-20230203234224065

这就是上面解释的情况, 1加密后, E更改了内容, 但是用户接收到后经过解密后 无法识别~(这里写的error)

加密分类

​ 用于将明文转换为密文的操作类型

  • 替换substitution:将明文中的每个元素映射到另一个元素中

  • 转置transposition:重新排列明文中的元素

处理明文的方式

  • 分组密码(Block cipher):一次处理一组元素的输入
  • 流密码(Stream cipher):连续处理输入元素

使用的密钥数量

  • 发送方和接收方密钥相同——对称加密

  • 发送方和接收方的密钥不同——非对称加密

处理明文方式要记一下.

对称加密 Symmetric Encryption

image-20230131111140665
image-20230131111140665
  • 通信开销主要在共享密钥

  • 两种方式 1. 一个密钥在多个发送方之间共享. 2. 生成多个一样的密钥给发送方

这里是加密的单密钥情况, 就是加密解密用相同的key, 但是会有安全问题.

对称加密

image-20230131111426518
image-20230131111426518
  • 任何作为发送者的人都可以免费获得公钥
  • 公钥加密只能用私钥解密
  • 如何使用密钥加密?

这里写的是如何加密...老师回答的是 整个过程是怎么样的~

密钥加密 公钥解密~(这句话没错哦~ 整个过程反过来)

对称加密

任何有公开密钥的人都可以解密(不要用秘密密钥加密消息);

加密消息的攻击类型

image-20230204000645642
image-20230204000645642

加密消息的攻击类型

Ciphertext only attack

COA是基于密码学的一个概念,即通过分析加密后的数据来确定原始数据的内容。

为了应对COA, 密码专家 主要分析加密算法和需要解码的密文

  • 如何解密?
  • 暴力方法: 查找所有可能的key,直到解密的内容可以阅读.

计算安全

  • 破解密码的开销超过了加密信息的价值

  • 破解密码所需的时间超过了信息的有效寿命

  • 不幸的是,很难估计成功分析密文所需的工作量。

对称加密:Feistel密码结构

  • 一种对称分组加密算法结构
  • 明文块分为L0和R0两部分
  • 数据的两部分经过n轮处理,然后结合起来生成密文块。
  • 子键Ki彼此不同
  • 对数据的右半部分应用一个舍入函数F,然后将F的输出与数据的左半部分进行异或运算(对左半部分进行替换);

这个要记一下, 对后文理解重要~

记得有道题, Feistel密码结构最主要的就是左半部分会影响右半部分. 如何是并行的不交换,就不是Feistel密码结构

Symmetric Encryption: Design Features 设计特征

  • 块大小:较大的块大小意味着更高的安全性,但会降低加密/解密速度。128位的分组长度是一种合理的折衷方案,在最近的分组密码设计中几乎是普遍的。

  • 密钥长度:与块长度类似,最常见的密钥长度为128位。

  • 轮数:单轮安全性不足,多轮安全性更高。典型的大小是16发。

  • 子密钥生成算法:该算法越复杂,密码分析的难度越大。

  • 圆函数:类似于子密钥的生成

  • 快速软件加密/解密:在许多情况下,加密嵌入到应用程序或实用函数中,以排除硬件实现。因此,算法的执行速度成为人们关注的问题。

  • 易于分析:如果能够简洁而清晰地解释算法,那么就更容易分析该算法的密码分析漏洞,从而提高对其强度的保证。

对称加密:DES

Data Encryption Standard 标准数据加密

  • 对称分组密码
  • 明文64位,较长的明文以64位块的形式处理
  • 密钥56位
  • 16轮处理
  • 根据原始密钥生成16个子密钥

解密DES

  • 将密文作为DES算法的输入

  • 以相反的顺序使用子键Ki

一个简化的DES示例

  • 明文8位
  • 加密8位
  • 密钥10位
  • 一共两轮
  • 使用 排列 左移生成的子键
  • 加密:初始置换、轮函数、半开关
  • 解密:与加密相同,只是轮密钥的使用顺序相反

开始!!!!!!!!!!!!!!

image-20230204104323567
image-20230204104323567

开始计算

image-20230204104516237
image-20230204104516237

密钥也是生成的, 子密钥是根据密钥生成的.

上面会是已知条件.

初始: 1010 0000 10

P10 :1000 0011 00 // 说一个简单的方法, 只找1的位置就好

L5: 10000 R5: 01100 // 分割五位

LS1-> L5: 00001 R5: 11000

P8的输入: 0000 1110 00

K1(p8输出): 10100100(上面是567的位置是1, 看P8输出,不是567直接写0即可.)

接下来算K2:

LS1-> L5: 00001 R5: 11000

LS2-> 00100 00011

P8 输入-> 0010 0000 11

K2 -> 01000011

image-20230204130019096
image-20230204130019096

得到K之后就要开始加密明文了plaintext

明文: 0 1 1 1 0 0 1 0

首先经过IP转换: 1010 1001

分开左右进入加密函数: 1010 1001

image-20230204130901980
image-20230204130901980

右侧进入EP(扩展和改变次序permutate) : 1100 0011

EP和K1 异或: 0110 0111

S0(输入): 0110 S1(输入):0111

image-20230204110528104
image-20230204110528104

S-box决定输出

1,4位行, 2,3位列

S0: 00行,11列. 换成二进制 0行, 3列 -> 10

S1: 01行, 11列 换成二进制 1行, 3列 -> 11

接下来P4输入(1011)

image-20230204110806607
image-20230204110806607

P4输出: 0111

接下来和最初的左边4个进行异或: 0111 和1010 -> 1101

经过第一轮: 左侧变成1101 右侧不变: 1001//这里可以看到, 右侧参与左侧的生成,但是右侧不变化, 之后发生交换

SWAP: 左侧1001, 右侧1101

带入K2 0 1 0 0 0 0 1 1 计算

1101 -> EP -> 1110 1011

1110 1011 -> xor(k2:0100 0011) -> 1010 1000

1010->s0 ->10 01(行列) ->2,1-> 10

1000->s1 -> 10 00 -> 2,0 ->11

image-20230204111715529
image-20230204111715529

1011 -> p4 ->0111

1001 xor 0111 -> 1110

左侧 1110 右侧 1101

输出: 1110 1101

1110 1101 -> 取逆 IP -> 0111 0111

这个取逆 直接在 1110 1101 头上标记上 output 也就是 26314857, 然后12345678顺序写出来即可.

就是1->0 2->1 3->1 4->1 5->0 6->1 7->1 8->1

01110111

还有个简单方法...直接找0即可1和5是0其他直接补1

image-20230204112115840
image-20230204112115840

拿下面这个做一下练习

image-20230204115142604
image-20230204115142604

对称加密:三重DES

  • DES使用3个密钥和DES算法的3次执行。

  • 该函数遵循加密-解密-加密(EDE)的顺序。

  • 解密只需将密钥反转即可

image-20230204115326242
image-20230204115326242

如何把三重变成一重?

3DES加密的第二阶段对解密的使用没有密码学意义。它唯一的优点是允许3DES用户解密由旧的单一DES用户加密的数据

这里的解密不是真正的变回明文, 只是单纯的使用一次最初的密钥进行一次解密.

image-20230204115612734
image-20230204115612734

对称加密: AES

  • 高级加密标准(AES)[更安全、更高效]
  • 块长度128位
  • 密钥长度可以为128、192或256位
  • 非Feistel结构,在每一轮中使用替换和置换并行处理整个数据块。[Feistel结构:数据块的一半用来修改另一半,然后交换这两半。]
  • 键操作:替换字节、移位行、混合列、添加轮键。
  • 所有操作都是可逆的:对于替换字节、移位行、混合列,在解密时使用了逆函数;对于添加轮密钥,则通过异或与block -相同的轮密钥来实现逆操作
  • 很容易验证解密是否通过可逆操作恢复了明文。

AES支持三种长度的密钥:128位,192位,256位

平时大家所说的AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。

区别在于处理数据的round, 所以 AE256的安全性最高, 128的性能最高

填充:

假如一段明文长度是196bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有64bit,不足128bit。这时候怎么办呢?就需要对明文块进行填充(Padding)。

AES加密时候有不同的填充方式: (解密加密要使用相同的填充方式)

NoPadding:不做任何填充,但是要求明文必须是16字节的整数倍。

PKCS5Padding(默认):如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}

ISO10126Padding:如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则可能补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}

DES和AES的一些区别:

  1. 密钥长度:DES使用56位密钥,而AES支持128位、192位和256位三种密钥长度。更长的密钥长度意味着更高的安全性,因此AES比DES更安全。
  2. 加密轮数:DES使用16轮加密,而AES使用10轮(对于128位密钥)、12轮(对于192位密钥)和14轮(对于256位密钥)加密。更多的加密轮数意味着更高的安全性,因此AES比DES更安全。
  3. 字节处理:DES使用64位块进行加密,而AES使用128位块进行加密。更大的块大小意味着更高的安全性,因此AES比DES更安全。
  4. 加密算法:DES使用Feistel网络结构实现加密,而AES使用更复杂的网络结构实现加密,包括SubBytes、ShiftRows、MixColumns和AddRoundKey四个步骤(如下图)。更复杂的加密算法意味着更高的安全性,因此AES比DES更安全

AES比DES更广泛一些.

AES加密解密
AES加密解密

AES算法主要有四种操作处理,分别是密钥加法层(也叫轮密钥加,英文Add Round Key)、字节代换层(SubByte)、行位移层(Shift Rows)、列混淆层(Mix Column)

秘钥加法层
秘钥加法层
字节代换层
字节代换层
正向行位移
正向行位移

行位移操作最为简单,它是用来将输入数据作为一个4·4的字节矩阵进行处理的,然后将这个矩阵的字节进行位置上的置换。ShiftRows子层属于AES手动的扩散层,目的是将单个位上的变换扩散到影响整个状态当,从而达到雪崩效应。在加密时行位移处理与解密时的处理相反,我们这里将解密时的处理称作逆行位移

AES-Advanced encryption standard高级加密标准(共4)

AES-1-Substitute Bytes Transformation 替换字节转换

  • AES定义了一个256矩阵~一般叫16*16矩阵,叫做S盒 s-box
  • 最左4位-行索引,最右4位-列索引,勾选Sbox为8位输出值
image-20230220221746877
image-20230220221746877

AES-2-反向代替字节转换

(这个不该写2懒得改序号了)

逆S盒

  • 输入位和输出位之间的相关性低
  • 输出不能被描述为输入的简单数学函数。

结果是一样的~ 都是分割输入的左右位, 然后在盒子里找(这里是逆S盒)

解释一下为什么上面有两个关于逆S盒的描述~ 结论是: 单纯知道S盒是无法简单推出逆S盒的~

原因: (看不懂不重要)

逆s盒是依赖s盒生成的, 因此知道s盒如何生成才能知道逆s盒如何生成.

简单来说, s盒通过固定的矩阵运算以及有限域上的计算来生成.但是这些运算需要一些参数和常数.

这些参数和常数是需要保密的内容, 知道了这个算法就不安全了

AES-3-行位移row shift转换

  • 第一行不变
  • 第二行左移1
  • 第三行左移2
  • ...

逆行位移

  • 右移
image-20230220222654042
image-20230220222654042

补充: .AES算法中最小数据单元是字节而不是位.因为每个矩阵元素里存储的是一个完整的字节.

为什么每个矩阵元素是8位, 一个字节.

一般是256字节的矩阵 分成了 16*16字节的矩阵. 就是44矩阵16个. 好了这里不重要~

我想表达的就是, 实际上你在S盒看到的AE这种,都是16进制的~ 转成2进制刚好分开后是4位.

标准写法是0xEA这样.

AES-4-列混淆column mix(比较难)

十进制转2进制就是 除2取模.

2进制转十进制是 加权求和

16和2进制是很简单的~ 可以分割

列混淆运算
列混淆运算
  • 这个运算规律记住就好~ 可以看到算哪一行就是哪一行前为2,下一行为3.

S0j 就是算new state arr的第一行, 第一行就是S0j前面全是2, S1j前面全是3, 其余为自身.

S1j 就是算new state arr的第二行, 第二行就是S1j前面全是2, S2j前面全是3, 其余为自身.

...

列混淆运算例子
列混淆运算例子
  • 看这里求第一行, 那么就是
  • 02运算分为两种, 将十六进制先改成2进制, 这个2进制的首位是0就向左移动一位(二进制乘法,进制为2,乘以2相当于进一位)
  • 02运算另一种就是,先左移一位,然后和1B进行异或
  • 03运算是02和x运算后的结果在和x运算.

其实蛮容易记住的. 最后结果就是老师划线的四个的异或

AES--5-秘钥加法层

  • state xor key (round key)(以元素为单位);
  • 逆状态 xor 轮键(不变--继续和key 异或就好)
image-20230221011036956
image-20230221011036956

对称加密: 流密码stream cipher

  • 序列密码连续地处理输入元素,每次产生一个输出元素。
  • 密钥被输入到一个伪随机位生成器,该生成器产生一个数字流——密钥流。
  • 密钥流 or 明文流(按位)。
  • 解密需要使用相同的伪随机序列

只要密钥流保持对应, 暗文明文 xor 密钥流即可解密加密

伪随机生成器PRNG Pseudo Random Number Generator, 这个东西算法一定输入一定得到的结果就一定~ 其实就是用这个生成器输入某个输生成的随机数是一样的~ 伪随机.

image-20230221022735424
image-20230221022735424
  • 与密钥长度相当的分组密码一样安全

记住就行了~ 在我这里分组密码yyds...即使把密钥公开,也需要大量的密文数据才可以破解~

  • 速度更快,代码更少

  • 重用密钥导致安全问题(分组密码可以重用密钥);

重用密钥导致安全问题是因为, 如果大量使用同样密钥流解密加密, 就可以找到规律~

分组密码不怕是因为, 在分组密码中,密钥不是关键, 关键是加密解密的方式~ 会导致初始化矢量的随机性~所以知道密钥也无法破解.

  • 示例:使用相同的密钥使用流密码对两个明文进行加密,两个密文的异或就是原始明文的异或

对称加密: 流密码RC4

  • 流密码
  • 可变长度密钥1 ~ 256字节
  • 使用key初始化状态向量S(置换)
  • 一旦S向量初始化,就不再使用输入的键
  • 密钥流由S(循环、交换……)和take生成
  • XOR与明文进行加密

提问

DES/3DES都是64位的, 那么如何应付更长的内容呢?

  • 分成多个64位的~补全最后一个块到64位

操作的密码分组模式

电子密码本

  • 描述:每个64位的明文块使用相同的密钥 独立编码。
  • 典型应用:安全传输单个值(例如加密密钥);

Cipher Block Chaining (CBC)密码分组链

image-20230221024648182
image-20230221024648182

密码分组链接(CBC)

  • 发送方和接收方都必须知道初始化向量(IV)
  • IV作为密钥进行保护,例如,敌人更改IV中的比特位,则可以更改第1块中的明文。
  • 典型应用:通用面向块的传输;身份验证

初始的时候第一段明文和IV初始化矢量进行 xor

优点

加密过程具有随机性,即使相同的明文数据也会生成不同的密文数据。

攻击者无法轻易地对密文数据进行修改,因为修改一个密文数据将影响后续的数据块的解密。

可以使用块密码算法对明文数据进行加密,通常速度较快。

缺点

加密和解密的效率较低,因为每个数据块的加密和解密都需要依赖于前一个数据块。

如果IV被攻击者获取并篡改,那么整个加密系统的安全性将会受到威胁。因此,需要使用随机的IV,并且不应该重复使用相同的IV。

如果密钥泄露,攻击者可以轻易地获得明文数据

密码反馈(CFB)

  • 将分组密码转换为流密码
  • 解密也使用加密功能,但不使用解密功能

不想吐槽了, 这里意思是 加密解密不需要反向key~ 都用伪随机生成器重新生成密钥流解密就好

  • 典型应用:通用流式传输;身份验证

与CBC模式相比,CFB模式具有以下优点:

  • 可以加密单个比特,不需要将数据分块,因此可以适用于任意长度的明文数据。
  • 加密和解密的速度较快,因为不需要每次都加密和解密整个数据块。

CFB模式也存在一些缺点:

  • 加密过程具有延迟,需要等待一个密钥流生成周期才能得到第一个密文比特。
  • 攻击者可以通过篡改密文数据和掌握IV和密钥等手段,破坏加密算法的安全性。
  • 如果密钥被攻击者获取,可以轻易地破解所有的密文数据。

CTRcounter 计数器

  • 计数器大小=明文块大小
  • Counter初始化为某个值,对后续的每个块都加1

用伪随机数生成器, 输入0 生成一个伪随机key流, 下一个块+1在生成一个随机key流.

这样做下来每一个互相独立~ 加密解密非常快~

  • 无链,多个区块并行处理
  • 在计算前i-1个块之前,无法计算第i块的计数器
  • 只需要加密算法
  • 典型应用:通用面向块的传输;适用于高速要求

推荐阅读

https://gist.github.com/baymaxium/45f743f1a3914760205960ed07a03ab4 漫画:什么是AES算法

https://zhuanlan.zhihu.com/p/78913397 密码学基础:AES加密算法 by马克的学习笔记

- END -

分类:

后端

标签:

后端

作者介绍

Shinkai005
V1

公众号:深海笔记Shinkai