Title: Chaotic Collage
Creator Lifespan: 1914 - 2002
Creator Nationality: Czech
Creator Gender: male
Creator Death Place: Prague
Creator Birth Place: Protivín
Date: 1970 - 1971
author: Jiří Kolář
Physical Dimensions: w46 x h27 cm
Type: collage
前言
说来惭愧,研究生师从密码学教授之手,但是实际上都在做项目,对于密码学一直都似懂非懂,充其量只探进去了一只脚。如今毕业多年,终于在web3领域真正用到了密码学。于是,旧书新读,从头开始再把密码学研究一遍,在此记录下学习心得。
既然要从头好好学起,那”图解”系列自然是极好的,更何况有现成的书——《图解密码技术》
翻开书的第一页,看到了18年的签名,还是有些许感慨
笔者本科计算机科学与技术出身,毕业后就去干了Java后台开发,无奈一年后觉得开发太过无趣,对信息安全的兴趣却越发浓厚,也幻想着如同那些传奇黑客一般驰骋Cyber空间。
于是,便辞去了工作,去了HUST的信息安全与保密实验室,自此,安全之路正式起航
如今这么多年过去,笔者也在安全的多个细分行业里不断学习和尝试,回首来看,安全行业虽不如开发意气风发,但如若真心喜欢,也着实会觉得有趣。所幸,坚持如初
概述
回到《图解密码技术》,这本书个人觉得是很好的基础入门书籍(“图解”系列好像都是不错的入门书,比如《图解TCP/IP》),生动形象的阐述密码学的基本框架和部分技术细节
全书(第三版)分为三部分共15章:
第一部分密码
,包括古典密码
、对称密码
、分组密码
、公钥密码
和混合密码
系统;
第二部分认证
,包括单向散列函数
、消息认证码
、数字签名
和证书
;
第三部分密钥、随机数和应用技术
,包括密钥
、随机数
、PGP
、SSL/TLS
、比特币
、量子密码
等。
密码学家的工具箱
- 对称密码
- 公钥密码(Public-key Cryptography)
- 单向散列函数(One-way Hash Function)
- 消息认证码(Message Authentication Code, MAC)
- 数字签名(Digital Signature)
- 伪随机数生成器(Pseudo Random Number Generator, PRNG)
将信息安全面临的主要威胁(窃听、篡改、伪装和否认)、安全要素和上面的密码技术来做一个对应:
其他概念
-
隐写术(Steganography)
CTF 中也是常见的一种题目类型,隐写术的目的是隐藏消息本身,而加密则隐藏的是真实内容 -
数字水印(Digital watermarking)
数字水印使用了隐写术技术,将著作权或者签名信息嵌入到文件中
古典密码
凯撒密码
凯撒密码 (Caesar Cipher)是通过将明文中所使用的字母表按照一定的字数(密钥)进行平移来实现加密的方法
比如,假设我们设置凯撒密码密钥为5,即每个字母往后移动5位,遇到最后一个字母时,循环到第一位,此时对helloworld
进行加密:
此时得到的密文mjqqtbtwqi
已经时人类无法直接理解和读取的意思,这就实现了对内容进行了加密
解密方法:反向移动即可
破解方法:暴力破解
在线破解工具:凯撒破解
简单替换密码
凯撒密码的破解非常容易,简单的暴力破解(简称暴破)即可。为了防止暴力破解,可以将每个字母按相同的顺序移位升级成每个字母无规则的对应另一个字母,这就是简单替换密码 (Simple Substitution Cipher)
简单替换密码需要一个密码本记录替换的对应关系:
解密方法:按密码本反向替换即可
破解方式:获取到足够多的密文后,进行频率分析
在线频率分析工具:quipqiup
Enigma
二战德国使用的密码机
- 国防军密码本:密钥
- 每日密码:密钥加密密钥
- 通信密码:通信密钥
- 密码机:密码算法
对称密码
异或运算
异或运算 XOR(exclusive or),其有2个关键特性:
- 0与任何数异或都为它们本身
- 两个相同的数异或为0
所以,可以得出 A ⊕ B ⊕ B = A
发散一下,应用到密码学中,是不是可以简化出:
明文 ⊕ 密钥 = 密文
密文 ⊕ 密钥 = 明文 ⊕ 密钥 ⊕ 密钥 = 明文
DES
注意:DES已经被破解,不要在实际应用中使用
DES(Data Encryption Standard)是一种将 64bit明文
加密成 64bit密文
的加密算法,密钥长度是 64bit,但是每7个bit后接1个校验位,所以实际有效密钥长度为56bit
DES 的结构
DES是一种 16
轮循环的Feistel 网络
这里,先来看看1轮 Feistel 网络,左边加密,右边不加密,子密钥是指本轮使用的密钥,每轮使用的子密钥都是不同的:
这里,轮函数根据右侧数据和子密钥,计算出一串随机比特串,然后与左侧数据进行异或,得到加密后的左侧数据
再来看看3轮 Feistel 网络,3轮加密时前2轮需要对调左右数据,最后1轮不需要对调:
接下来就是重点了,如何解密呢?
不妨结合上面XOR的结论:A ⊕ B ⊕ B = A
是的,这里使用加密后的数据,按原来的子密钥和轮函数重新运算一次,就能得到明文了!
因此,总结一下Feistel网络的一些特性:
- Feistel 的轮数可以任意增加
- 加密时无论使用任何函数作为轮函数都能正确解密
- 加密和解密可以用完全相同的结构来实现
3DES
注意:目前3DES算法已经被攻击者攻破,被认为不再安全,不要在实际中使用
3DES,Triple DES,三重DES
顾名思义,将DES重复3次得到的一种密码算法,其密钥长度实际是 56*3=168bit
:
这里我标红了第二次,第二次竟然是用的解密,目的是为了兼容DES,大家可以想想看为什么?
另外,3DES很重要的一点就是每次处理的密钥必须不同,否则就等同于DES了
3DES的解密过程同DES一样,只需要原路逆向操作即可
AES
AES,Advanced Encryption Standard,高级加密算法
由NIST公开选拔并经过全世界的专家和社区评选得出,最终由Daemen和Rijmen设计的Rijndael的算法力压群雄,成为了AES标准,下面都使用AES代表Rijndael
AES与DES一样也是分组密码算法,分组固定长度为128bit,密钥长度有 128bit,192bit 和 256bit
三种
AES也是由轮组成,但不同于 DES 的 Feistel 网络,AES 使用的时 SPN 结构
SPN 结构的加密过程分为SubBytes
、ShiftRows
、MixColumns
和AddRoundKey
4个步骤:
1)SubBytes
SubBytes 就是将输入分组的16字节(128bit),以每个字节的值(每个字节均在0~255之间)为索引,按照替换表进行替换(参考古典密码中的简单替换密码)
2)ShiftRows
顾名思义,ShiftRows就是对上述处理的结果按照行(16字节,分成4行,每行4字节)进行平移,每行平移的字节数不同
3)MixColumns
MixColumns就是对每一列的4个字节进行比特运算,将其变成另外4个字节
4)AddRoundKey
AddRoundKey则将上述处理的结果,与轮密钥进行 XOR 运算
至此,一轮加密运算完成,AES实际上要重复进行10~14轮计算
AES解密,按相反的顺序进行即可(Inv表示逆运算):
AddRoundKey -> InvMixColumns -> InvShiftRows -> InvSubBytes
分组密码
密码算法可以分为 流密码 和 分组密码 两种
-
流密码 指对数据流进行连续处理的一种加密算法,流密码一般以 1bit、8bit、32bit等为单位进行加解密
-
分组密码 指每次只能处理特定长度的一段数据的加密算法,这一段数据就成为一个分组,这段数据的长度就是分组长度
DES、3DES 和 AES 都属于分组密码,所以如果要加密任意长度的明文,就需要对分组密码进行迭代,而迭代方法就是分组密码的模式
分组密码的模式主要有5中:ECB、CBC、CFB、OFB、CTR
ECB
ECB(Electronic CodeBook),电子密码本模式,最简单和最能理解的模式,就是将明文按分组大小进行拆分,分别加密后得到密文分组,最后按顺序组合就得到最终的密文
如果最后一个分组不够分组长度时,按特定的数据进行填充即可
ECB 模式的解密,反向操作即可
ECB 模式的攻击:ECB模式最大的问题就在于,攻击者可以不需要破译密码就能进行攻击——通过改变密文顺序进行攻击
简单的例子,理解一下就行:
场景:A -> B 转账 1,000;假设明文分组:A,B,1000;密文分组:-+-1,-+-2,-+-3
攻击者此时只需要将获取到的密文顺序改成:-+-2,-+-1,-+-3,就能造成B -> A 转账 1,000的攻击效果
CBC
CBC(Cipher Block Chaining), 密文分组链接模式,该模式下 被加密的是XOR运算后的结果
1)每组密文分组,与下一个明文分组进行XOR运算后,使用密钥加密得到下一个密文分组
2)初始化向量IV与第一个明文分组进行XOR运算后,再经过加密得到第一个密文分组
CBC 模式的解密,整体顺序不变,单元内逆向操作
ECB 模式的攻击:初始化向量任意比特反转攻击、填充提示攻击、针对初始化向量的非真随机数攻击
CFB
CFB(Cipher FeedBack), 密文反馈模式,该模式下 被加密的是密文分组,所以叫密文反馈(Feedback)
1)每组密文分组,加密后与下一个明文分组进行XOR运算,得到下一个密文分组
2)初始化向量IV先进行加密,再与第一个明文分组进行XOR运算得到第一个密文分组
CFB 模式的解密,整体顺序不变,单元内逆向操作,且每次输入为当前的密文分组和上一个密文分组加密后的值
CFB 模式理解的时候,可以把“上一个密文分组加密后的值”理解为随机比特序列,即每次加密时明文分组和随机比特序列进行异或操作,解密时使用相同的随机比特序列反向操作即可
CFB 模式的攻击:重放攻击
OFB
OFB(Output FeedBack),输出反馈模式,该模式下 被加密的是IV(以及加密后的IV)
1)先对IV进行加密,将加密后的结果与明文分组进行XOR运算,得到密文分组
2)继续对IV加密后的结果进行加密,再将加密后的结果与明文分组进行XOR运算,得到密文分组
OFB 模式的解密,整体顺序不变,单元内逆向操作,且每次输入为当前的密文分组和IV加密后(或IV加密后再加密)的值
OFB 模式中可以事先通过密码算法对IV进行加密,计算出XOR所需要的比特序列,这里类比为密钥流,然后明文分组与密钥流进行XOR就可以了
CTR,CounTeR
CTR,Counter,计数器模式,该模式下 被加密的是计数器
1)先对CTR进行加密,将加密后的结果与明文分组进行XOR运算,得到密文分组
2)CTR+1,再对其进行加密,将加密后的结果与明文分组进行XOR运算,得到密文分组
OFB 模式的解密,整体顺序不变,单元内逆向操作,且每次输入为当前的密文分组和CTR加密后(或CTR+n后再加密)的值
CTR 和 OFB 模式一样,都属于流密码,原因同OFB
CTR 模式可以以任意顺序对分组进行加密和解密,因为加解密所用到的计数器可以直接由初始化的nonce和分组序号n直接计算出来,这是OFB不具备的
CTR 支持并行计算