Shinkai005
2023/02/21阅读:21主题:极简黑
【CSF】安全第四节课-Cryptography 密码学上
【CSF】安全第四节课-Cryptography 密码学上
感恩我的老师们~
PPT- Cryptography 密码学
大纲
-
密码学Cryptography
-
上下文
-
成分
-
分类
-
攻击
-
-
对称加密:分组密码Symmetric Encryption: Block Cipher
-
DES/三重DES (Feistel密码结构) -
AES
-
-
-
对称加密:流密码•Symmetric Encryption: Stream Cipher
-
RC4
-
-
操作的密码分组模式
加密:上下文


图一和图二交代了加密出现的环境context
Andy给Sam发送问候消息~ 被E窃取信息,窜改成借钱信息.
但是在加密情况下添加了key. 解密后报错~(解密不成E想表达的句子)
加密:原料
-
明文Plaintext:原始消息 -
加密算法Encryption algorithm: 对纯文本进行替换/变换 -
密钥: 算法输入,替换/变换依赖于密钥 -
暗文Ciphertext: :算法输出,依赖于明文和密钥 -
解密算法Decryption :反向加密

这就是上面解释的情况, 1加密后, E更改了内容, 但是用户接收到后经过解密后 无法识别~(这里写的error)
加密分类
用于将明文转换为密文的操作类型
-
替换substitution:将明文中的每个元素映射到另一个元素中
-
转置transposition:重新排列明文中的元素
处理明文的方式
-
分组密码(Block cipher):一次处理一组元素的输入 -
流密码(Stream cipher):连续处理输入元素
使用的密钥数量
-
发送方和接收方密钥相同——对称加密
-
发送方和接收方的密钥不同——非对称加密
处理明文方式要记一下.
对称加密 Symmetric Encryption

-
通信开销主要在共享密钥
-
两种方式 1. 一个密钥在多个发送方之间共享. 2. 生成多个一样的密钥给发送方
这里是加密的单密钥情况, 就是加密解密用相同的key, 但是会有安全问题.
对称加密

-
任何作为发送者的人都可以免费获得公钥 -
公钥加密只能用私钥解密 -
如何使用密钥加密?
这里写的是如何加密...老师回答的是 整个过程是怎么样的~
密钥加密 公钥解密~(这句话没错哦~ 整个过程反过来)
对称加密
任何有公开密钥的人都可以解密(不要用秘密密钥加密消息);
加密消息的攻击类型

加密消息的攻击类型
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位 -
一共两轮 -
使用 排列
和左移
生成的子键 -
加密:初始置换、轮函数、半开关 -
解密:与加密相同,只是轮密钥的使用顺序相反
开始!!!!!!!!!!!!!!

开始计算

密钥也是生成的, 子密钥是根据密钥生成的.
上面会是已知条件.
初始: 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

得到K之后就要开始加密明文了plaintext
明文: 0 1 1 1 0 0 1 0
首先经过IP转换: 1010 1001
分开左右进入加密函数: 1010 1001

右侧进入EP(扩展和改变次序permutate) : 1100 0011
EP和K1 异或: 0110 0111
S0(输入): 0110 S1(输入):0111

S-box决定输出
1,4位行, 2,3位列
S0: 00行,11列. 换成二进制 0行, 3列 -> 10
S1: 01行, 11列 换成二进制 1行, 3列 -> 11
接下来P4输入(1011)

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

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

拿下面这个做一下练习

对称加密:三重DES
-
DES使用3个密钥和DES算法的3次执行。
-
该函数遵循加密-解密-加密(EDE)的顺序。
-
解密只需将密钥反转即可

如何把三重变成一重?
3DES加密的第二阶段对解密的使用没有密码学意义。它唯一的优点是允许3DES用户解密由旧的单一DES用户加密的数据
这里的解密不是真正的变回明文, 只是单纯的使用一次最初的密钥进行一次解密.

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

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位输出值

AES-2-反向代替字节转换
(这个不该写2懒得改序号了)
逆S盒
-
输入位和输出位之间的相关性低 -
输出不能被描述为输入的简单数学函数。
结果是一样的~ 都是分割输入的左右位, 然后在盒子里找(这里是逆S盒)
解释一下为什么上面有两个关于逆S盒的描述~ 结论是: 单纯知道S盒是无法简单推出逆S盒的~
原因: (看不懂不重要)
逆s盒是依赖s盒生成的, 因此知道s盒如何生成才能知道逆s盒如何生成.
简单来说, s盒通过固定的矩阵运算以及有限域上的计算来生成.但是这些运算需要一些参数和常数.
这些参数和常数是需要保密的内容, 知道了这个算法就不安全了
AES-3-行位移row shift转换
-
第一行不变 -
第二行左移1 -
第三行左移2 -
...
逆行位移
-
右移

补充: .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 异或就好)

对称加密: 流密码stream cipher
-
序列密码连续地处理输入元素,每次产生一个输出元素。 -
密钥被输入到一个伪随机位生成器,该生成器产生一个数字流——密钥流。 -
密钥流 or 明文流(按位)。 -
解密需要使用相同的伪随机序列
只要密钥流保持对应, 暗文明文 xor 密钥流即可解密加密
伪随机生成器PRNG Pseudo Random Number Generator, 这个东西算法一定输入一定得到的结果就一定~ 其实就是用这个生成器输入某个输生成的随机数是一样的~ 伪随机.

-
与密钥长度相当的分组密码一样安全
记住就行了~ 在我这里分组密码yyds...即使把密钥公开,也需要大量的密文数据才可以破解~
-
速度更快,代码更少
-
重用密钥导致安全问题(分组密码可以重用密钥);
重用密钥导致安全问题是因为, 如果大量使用同样密钥流解密加密, 就可以找到规律~
分组密码不怕是因为, 在分组密码中,密钥不是关键, 关键是加密解密的方式~ 会导致初始化矢量的随机性~所以知道密钥也无法破解.
-
示例:使用相同的密钥使用流密码对两个明文进行加密,两个密文的异或就是原始明文的异或
对称加密: 流密码RC4
-
流密码 -
可变长度密钥1 ~ 256字节 -
使用key初始化状态向量S(置换) -
一旦S向量初始化,就不再使用输入的键 -
密钥流由S(循环、交换……)和take生成 -
XOR与明文进行加密
提问
DES/3DES都是64位的, 那么如何应付更长的内容呢?
-
分成多个64位的~补全最后一个块到64位
操作的密码分组模式
电子密码本
-
描述:每个64位的明文块使用 相同的密钥
独立编码。 -
典型应用:安全传输单个值(例如加密密钥);
Cipher Block Chaining (CBC)密码分组链

密码分组链接(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
公众号:深海笔记Shinkai