《图解密码技术》读书笔记
2020-04-13 14:48:44 3 举报
AI智能生成
《图解密码技术》读书笔记
作者其他创作
大纲/内容
第二章《历史上的密码》
历史上著名的几个密码
凯撒密码
传说是凯撒使用过的密码算法
算法
通过字母表平移实现
密钥
平移的位数
简单替换密码
算法
字母对应替换
密钥
替换表
Enigma(德语:迷)
算法
Enigma机器的各种运算
消息组成:加密的密钥+加密的内容
密钥
每日密钥
KEK:密钥加密密钥,用于加密密钥
通信密钥
CEK:内容加密密钥,用于加密消息内容
密钥空间:keyspace
所有密钥的集合
密钥空间越大,暴力破解的难度越高
破解方法
暴力破解法
穷举密钥空间所有的密钥,一个个尝试
频率分析法
通过分析文字信息,提升破解概率
例如:字母表中每个字母使用的概率
为什么要将密码算法和密钥分开
密码算法是固定不变的,可以重复使用,方便人类研究与提升
密钥是可变的
第四章《分组密码的模式》
概念
分组密码(block cipher)
每次只能处理特定长度的一块数据的一类密码算法
不需要记录内部状态
特定长度 -> 分组长度(block length)
AES密码算法的分组长度:16字节
DES密码算法的分组长度:8字节
流密码(stream cipher)
对数据流进行连续处理的一类密码算法
需要记录内部状态(依赖密钥流)
一次性密码本
模式(mode)
明文长度超过分组密码的长度,需要迭代加密明文分组,这个迭代方法就是模式
ECB模式
属于分组密码
需要填充(padding)
电子密码本模式(Electronic CodeBook mode)
加解密过程
优点
简单
快速
支持并行计算(加密、解密)
缺点
明文中的重复排列会反映在密文中
通过删除、替换密文分组可以对明文进行操作
对包含某些比特错误的密文进行解密时,对应的分组会出错
不能抵御重放攻击
不应该使用
CBC模式
属于分组密码
需要填充(padding)
密码分组链接模式(Cipher Block Chaining mode)
加解密过程
优点
明文的重复排列不会反映在密文中
支持并行计算(仅解密)
能够解密任意密文分组
缺点
对包含某些错误比特的密文进行解密时,第一个分组的全部比特以及后一个分组的相应比特会出错
加密不支持并行计算
推荐使用
CFB模式
属于流密码
不需要填充(padding)
密文反馈模式(Cipher FeedBack mode)
加解密过程
优点
不需要填充(padding)
支持并行计算(仅解密)
能够解密任意密文分组
缺点
加密不支持并行计算
对包含某些错误比特的密文进行解密时,第一个分组的相应比特以及后一个分组的全部比特会出错
不能抵御重放攻击
推荐使用
OFB模式
属于流密码
不需要填充(padding)
输出反馈模式(Output FeedBack mode)
加解密过程
优点
不需要填充(padding)
可事先进行加密、解密的准备
加密、解密使用相同结构
对包含某些错误比特的密文进行解密时,只有明文中相应的比特会出错
缺点
不支持并行计算
主动攻击者反转密文分组中的某些比特时,明文分组中相应的比特也会被反转
推荐使用
CTR模式
属于流密码
不需要填充(padding)
计数器模式(CountTeR mode)
加解密过程
GCM模式(Galois/Counter Mode):在CTR模式的基础上,增加了认证功能
优点
不需要填充(padding)
可事先进行加密、解密的准备
加密、解密使用相同结构
对包含某些错误比特的密文进行解密时,只有明文中相应的比特会出错
支持并行计算(加密、解密)
缺点
主动攻击者反转密文分组中的某些比特时,明文分组中相应的比特也会被反转
推荐使用
模式加密过程对比
填充方式(Padding):只有分组加密算法才需要考虑
NoPadding
若数据已对齐:不填充
若数据未对齐:加解密出问题
Zeros
若数据已对齐:不填充
若数据未对齐:使用0填充
PKCS7Padding
若数据已对齐:填充一个长度为blockSize且每个字节均为blockSize的数据
若数据未对齐:需要补充的字节个数为n,则填充一个长度为n且每个字节均为n的数据
PKCS5Padding
与PKCS7Padding一致,唯一的区别是blockSize=8字节
第六章《混合密码系统》
概念
伪随机生成器
用于随机生成对称密码的密钥
对称密码算法
用于加解密通信的消息
公钥密码算法
加解密对称密码的密钥
加解密过程
加密过程
解密过程
第八章《消息认证码》
消息认证码
消息的认证(authenticatio):指的是“消息来自正确的发送者”这一性质
消息认证码的通信流程
实现方式
单向散列函数实现
存在共享密钥,加密方式是自定义的,单向散列函数用于计算MAC值
例如:HMAC
单向散列函数可以自主决定
HMAC流程图
使用分组密码实现
分组密码的密钥作为共享密钥,消息加密后的结果作为MAC值
例如:AES-CBC,采用最后一个分组的密文作为MAC值
密钥配送问题:与对称密码算法的解决方案一致
公钥密码算法
Diffie-Hellman密钥交换算法
......
应用实例
IPsec:对IP协议增加安全性的一种方式
SSL/TLS
消息认证码与单向散列函数的对比
认证加密
对称密码
对消息进行加密
满足机密性
消息认证码
满足完整性、认证
对称密码和消息认证码的密钥可以是相同的,也可以是不同的
认证加密方式例子
Encrypt-then-MAC
用对称密码将明文加密,然后计算密文的MAC值
Encrypt-and-MAC
用对称密码将明文加密,然后计算明文的MAC值
MAC-then-Encrypt
计算明文的MAC值,然后用对称密码对明文和MAC值加密
GCM(Galois/Counter Mode)
对称密码算法:AES-CTR
消息认证码:自有的单向散列函数
对称密码和消息认证码的密钥是相同的
对消息认证码的攻击
重放攻击(replay attack)
不破解消息认证码,而是将消息认证码保存下来重复发送
解决方案:消息中增加内容,使得相同的消息在每次发送时计算的MAC值不一样
序号
发送的消息总包含一个递增的序号
时间戳
发送的消息中包含当前时间
nonce
发送的消息中包含一个随机数
破解消息认证码的密钥
暴力破解
生日攻击
无法解决的问题
防止否认
第十章《证书》
公钥证书:PKC(Public-Key Certificate),简称证书
记录个人信息+个人公钥,并且由认证机构签名认证的
认证机构:CA(Certification Authority),必须具有公信力
认证机构证明:该公钥是此人的公钥
证书的使用例子
X.509
使用的最广泛的一种证书标准规范,由ITU(国际电信联盟)和IOS(国际标准化组织)共同制定
X.509证书包含的主要信息
证书颁发者:CA
公钥所有者
证书有效期
公钥基础设施:PKI(Public-Key Infrastructure)
为了能够有效地运用公钥而制定对的一系列规范和规格的总称
组成要素
用户:使用PKI的人
认证机构:颁发证书的人
仓库:保存证书的数据库
主要工作
生成密钥对
用户自己生成密钥对
用户委托认证机构生成密钥对
注册证书
生成证书,证书格式:X.509
作废证书
用户丢失私钥,认证机构对证书作废
证书作废清单:CRL(Certificate Revocation List)
即使有合法认证机构签名的证书,并且在有效期内,但是还需要查看该证书是否已经作废
证书的层级结构
一般的认证机构也存在公信力的问题,需要更高级别的认证机构认证,从而形成了层级结构
根CA(Root CA):最高层的认证机构,采用自签名认证
层级结构的例子
对证书的攻击
在公钥注册之前进行攻击
注册相似人名进行攻击
攻击者伪装成认证机构进行攻击
利用CRL发布的时间差进行攻击
第十二章《随机数》
随机数的用处
生成密钥
生成密钥对
生成初始化向量(IV)
生成nonce
生成盐
随机数的性质
随机性
不存在统计学偏差,是完全杂乱无章的数列
不可预测性
不能从过去的数列推测出下一个出现的数
不可重现性
除非将数列本身保存下来,否则不能出现相同的数列
随机数分类
弱伪随机数
强伪随机数
真随机数
伪随机数生成器
随机数生成器RNG(Random Number Generator)
传感器收集的热量、声音的变化等事实上无法预测和重现的自然现象信息
依靠硬件设备生成的随机数列
真随机数
伪随机数生成器PRNG(Pseudo Random Number Generator)
依靠软件生成的随机数列
仅仅依靠软件是无法生成真随机数的
伪随机数生成器的结构
种子(seed)
用来对伪随机数生成器的内部状态进行初始化的
类似密码算法的密钥
伪随机数生成器的一些具体例子
线性同余法
将当前的伪随机数值乘以A在加上C,然后除以M得到的余数作为下一个伪随机数
不具备不可预测性
特定的A、C和M值,会导致出现重复数列
采用该方式的库
c语言的rand库
java.util.Random库
采用线性同余法的伪随机数生成器
不可用于密码技术
单向散列函数法
可以编写出具备不可预测性的伪随机数列
单向散列函数的单向性是支撑伪随机数不可预测性的基础
密码法
可以使用密码算法来实现具备不可预测性的伪随机数列
具体方法
ANSI X9.17
ANSI X9.31
密码的机密性是支撑伪随机数不可预测性的基础
第十四章《SSL/TLS》
概念
SSL(Secure Socket Layer)
已经被破解
TLS(Transport Layer Security)
SSL和TLS可以认为是继承关系
SSL最高就是3.0版本,之后就只有TLS
TLS1.0,可以认为就是SSL3.1版本
SSL/TLS主要解决的问题
机密性
完整性
认证
SSL/TLS协议是在HTTP之下,TCP之上,主要用于保护HTTP,但也可以保护其他协议
TLS1.2协议:有两层协议组成
TLS握手协议:协商确定密码算法、共享密钥等等加密之外的所有事情
TLS记录协议:使用对称密码对消息进行加密通信
第一章《环游密码世界》
主要角色
发送者(alice)
接收者(bob)
窃听者(Eve)
攻击者(Mallory)
可信第三方(Trent)
验证者(victor)
密码技术
密码算法
对称密码
公钥密码(非对称密码)
保证机密性
防止消息被窃听
单向散列函数(one-way hash function)
消息的散列值
保证完整性
防止消息被篡改
消息认证码(message authentication code)
保证完整性、提供认证
防止消息被篡改;认证消息来自正确的发送者
数字签名(digital signature)
保证完整性、提供认证、防止否认
防止消息被篡改;认证消息来自正确的发送者;防止发送者否认
伪随机数生成器
用于密钥生成
信息安全的威胁与应对威胁的密码技术
密码与信息安全常识
不要使用保密的密码算法
使用低强度的密码比不进行任何加密更危险
任何密码总有一天都会被破解
密码只是信息安全的一部分
攻破人比攻破密码要简单多得多
第三章《对称密码》
概念介绍
编码(encode)
现实世界里的文本内容 -> 计算机世界里的比特序列
解码(decode)
计算机世界里的比特序列 -> 现实世界里的文本内容
XOR(异或)
比特序列的异或运算
相同为0,不同为1
加密过程可以简单认为是
明文 XOR 密钥
解密过程可以简单认为是
密文 XOR 密钥
一次性密码本
密码算法
加密过程
明文 XOR 密钥
解密过程
密文 XOR 密钥
密钥
真随机比特序列
不是伪随机
每次加密都随机生成
长度=明文长度
无法破解
已通过数学方法证明
为什么无法破解?
- 每次加解密,密钥随机生成
- 暴力破解得到有意义的明文太多,无法确定哪个是正确的明文
- 下次加解密又换了密钥
现实世界无法使用的原因
密钥与明文是一样大小的
密钥配送悖论:若是配送密钥是安全的,为啥不用相同方法配送明文?
密钥保存悖论:若是秘钥能安全保存,为啥不用相同方法保存明文?
密钥无法重用
每次加解密的密钥是不一样的
密钥如何生成
真随机数
不是伪随机数
软件产生的都是伪随机数
传闻唯一的使用案例:大国之间的热线电话
密钥由特工来配送
DES(Data Encryption Standard)
密码算法
DES的结构:Feistel结构
分组密码方式:分组长度64比特(8字节)
轮密钥
由密钥变换得出
加密过程
明文分成一个个64比特的组,每组明文经过处理后, XOR 轮密钥
解密过程
密文分成一个个64比特的组,每组密文经过处理后, XOR 轮密钥
密钥
64比特(8字节)
真实有效密钥是56比特,剩余8比特是校验位
已经被破解
DES的变种算法
3DES
将DES重复3次,每次密钥可以变更
已经被破解
AES(Advanced Encryption Standard)
密码算法
采用Rijndael算法:SPN结构
分组密码方式:分组长度128比特(16字节)
轮密钥
由密钥变换得出
加密过程
明文分成一个个128比特的组,每组明文经过处理后, XOR 轮密钥
解密过程
密文分成一个个128比特的组,每组密文经过处理后, XOR 轮密钥
密钥
128比特(16字节),AES-128
192比特(24字节),AES-192
256比特(32字节),AES-256
密钥长度与分组长度不一致问题
加解密过程中每次使用的密钥被称为轮密钥
轮密钥是秘钥变换出来的,保证长度与分组一致
推荐使用
第五章《公钥密码》
密钥配送问题(key distribution problem)
对称密码中,发送者如何将密钥配送给接收者
解决方法
通过事先共享密钥来解决
例如:发送者和接收者面对面确定
通过密钥分配中心解决
存在一个中心机构来负责分配密钥
通过Diffie-Hellman密钥交换算法来解决
推荐
通过公钥密码算法来解决
推荐
公钥密码(public-key cryptography)
密钥对(key pair)
公钥(public key)
公开,任何人都可以拿到
私钥(private key)
不公开,只有接收者保存
发送者使用公钥加密,接收者使用私钥解密,公钥无法解密
公钥密码算法通信时序图
彻底解决密钥配送问题
常用公钥密钥
RSA
利用质因数分解的困难度
EIGamal
利用mod N下求离散对数的困难度
Rabin
利用mod N下求平方根的困难度
椭圆曲线密码ECC(Elliptic Curve Cryptography)
利用乘法运算的逆运算的困难度
公钥密码无法解决的问题
公钥认证问题
中间人攻击
处理速度慢
RSA密码算法
在RSA中,明文、密文和密钥都是数字,加解密过程是大数计算
公钥
公开发布,任何人都能获取,用于加密
私钥
只有接收者存储,保密,用于解密
RSA的加密和解密
加密
密文=明文^E mod N
公钥是(E, N)
E(Encryption):加密的数字
N(Number):数字
解密
明文=密文^D mod N
私钥(D, N)
D(Decryption):解密的数字
N(Number):数字
明文、密文、E、D、N都是数字
加解密过程
如何生成密钥对?
1. 求N
随机获取两个大质数:p、q
N = p * q
2. 求L(生成密钥对所需的临时参数)
lcm(least common multiple):最小公倍数
L = lcm(p - 1, q - 1)
3. 求E
E 满足条件
1 < E < L
gcd(E, L) = 1
gcd(greatest common divisor):最大公约数
满足该条件是为了保证一定存在解密所需的数字:D
通过伪随机数生成器来生成候选数,若满足条件,则可以作为E
4. 求D
D 满足条件
1 < D < L
E * D mod L = 1
密钥对生成过程
对RSA的攻击
通过密文来求明文
已知信息
密文 = 明文^E mod N
密文、E、N
未知信息
明文
求明文
mod N下求离散对数的问题
离散对数问题目前无解
通过暴力破解找出D
已知信息
明文 = 密文^D mod N
密文、N
未知信息
明文、D
找出D即可得到明文
暴力破解的难度 = D的密钥空间的大小
极其困难
RSA的D一般是2046位,密钥空间=2^2046
通过 E 和 N 求出 D
已知信息
RSA生产密钥对的过程:D 满足条件
1 < D < L
E * D mod L = 1
E、N
N = p * q
L = lcm(p - 1, q - 1)
未知信息
p、q
求D = N的质因数分解 -> p、q
质因数分解问题:目前极其困难
未发现高效分解算法
但数学上也未证明是否真的是非常困难
中间人攻击(man-in-the-middle attack)
中间人攻击时序图
公钥密码算法是无法防御中间人攻击
选择密文攻击(Chosen Ciphertext Attack)
攻击者不断的发送消息,获取服务器的解密提示,来尝试解密
解决方法:认证
RSA-OAEP(optimal Asymmetric Encryption Padding)
RSA的存在的问题
处理速度慢
1024比特的RSA
不推荐使用
2046比特的RSA
在2030年之前推荐
4096比特的RSA
推荐
公钥密码与对称密码的对比
具备同等抵御暴力破解强度的密钥长度比较
如何保证机密性
对称密码是通过将明文转换为复杂的形式来保证
公钥密码是基于数据上困难的问题来保证
在加解密速度上,对称密码明显快过公钥密码
对称密码无法解决密钥配送问题,公钥密码彻底解决密钥配送问题
第七章《单向散列函数》
单向散列函数(one-way hash function)
定义:可以根据输入的消息内容计算出散列值,而散列值可以用来监测消息的完整性
单向散列函数应具备的性质
输入:任意长度的消息 -> 输出:固定长度的散列值
能快速计算出散列值
消息不同散列值应该也不同
两个不同的消息可能产生同一个散列值,这种现象称为碰撞
单向散列函数需要保证在事实上不可能被人为地发现碰撞
单向性(one-way)
消息 -> 散列值
散列值 -> 消息
碰撞(collision)
定义:两个不同的消息产生同一个散列值
抗碰撞性(collision resistance)
是指难以发现碰撞的性质
弱抗碰撞性
找到和一条消息具有相同散列值的另外一条消息是非常困难的
强抗碰撞性
找到散列值相同的两条不同的消息是非常困难的
单向散列函数不是一种加密技术
一些常用的单向散列函数
MD4、MD5
都是产生128比特的散列值
MD -> Message Digest,消息摘要的缩写
不推荐
已经被攻破
SHA(Secure Hash Algorithm)
SHA-1
都是产生160比特的散列值
不推荐
已经被攻破
SHA2
SHA-256
都是产生256比特的散列值
SHA-512
都是产生512比特的散列值
推荐
暂未被攻破
SHA3
TODO
推荐
暂未被攻破
对单向散列函数的攻击
针对弱抗碰撞性的攻击
暴力破解
找到和一条消息具有相同散列值的另外一条消息
破解的难度是散列值的长度
SHA-512,就是2^512
针对强抗碰撞性的攻击
生日攻击
生日悖论:任意生日相同的概率比我们想象的要大
找到散列值相同的两条不同的消息
破解的难度
SHA-512,是2^256
比暴力破解尝试的次数要少很多
单向散列函数无法解决的问题
能识别出篡改,无法识别出伪装
第九章《数字签名》
作用:识别篡改、伪造,防止否认
使用私钥签名
使用公钥校验
与公钥密码的对比
数字签名的方法
直接对消息签名
对消息的散列值签名
数字签名是不能保证机密性的
各种密码技术的对比
数字签名不能解决的问题
如何确保公钥属于真正的发送者
需要依靠 PKI(Public Key Infrastructure)公钥基础设施
第十一章《密钥》
什么是密钥
密钥就是一个巨大的数字
密钥空间(key space)的大小,决定进行暴力破解的难度
密钥与明文是等价的
信息的机密性不应该依赖于密码算法,而是应该依赖于密钥空间的大小,密钥的妥善保管
各种不同的密钥类型划分
用于确保机密性的密钥
对称密码算法:共享密钥
公钥密码算法:密钥对(公钥+私钥)
用于认证的密钥
消息认证码:共享密钥
数字签名:密钥对(公钥+私钥)
针对通信过程中使用次数
会话密钥
每次通信只使用一次的密钥
优点:即使被破解,也就会影响本次通信
主密钥
每次通信过程中都一直被重复使用的密钥
针对加密对象
KEK(Key Encrypting Key):密钥加密密钥
用于加密密钥的密钥
主密钥一般作为KEK使用
CEK(Content Encrypting Key):内容加密密钥
用于加密内容的密钥
会话密钥一般作为CEK使用
密钥管理
生成密钥的方式
使用伪随机数生成器来生成密钥
只使用口令来生成密钥
不推荐
使用(口令+单向散列函数)来生成密钥
使用(口令+盐+单向散列函数)来生成密钥
密钥配送方式
事先共享密钥
使用密钥分配中心
不推荐
使用公钥密码
Diffie-Hellmain密钥交换
支撑数学理论:有限域的离散对数问题的复杂度
交换过程
更新密钥
一种提供通信机密性的技术
用当前密钥的散列值作为下一次通信的密钥
保存密钥
人类无法记住密钥
密钥太长并且毫无规则
对密钥进行加密保存
多个密钥采用一个KEK密钥进行加密
妥善保管好这一个KEK密钥
和认证机构的层级化非常相似
最后都集中在一个点上
作废密钥
基于口令的密钥PBE(Password Base Encryption)
PBE存在的意义
1. 想确保重要消息的机密性
2. 将消息直接保存在磁盘上,会被别人看到
3. 用密钥(CEK)对消息进行加密
4. 这就需要确保密钥(CEK)的机密性
5. 将密钥(CEK)直接保存在磁盘上很危险
6. 用另一个密钥(KEK)对密钥(CEK)进行加密
7. 但又要确保密钥(CEK)的机密性,进入了死循环
8. 既然如此,用口令来生成密钥(KEK)
9. 口令容易遭受字典攻击
10. 用口令+盐共同生成密钥(KEK)
11. 盐和加密后的密钥(CEK)一起保存在磁盘上,而密钥(KEK)直接丢弃
12. 口令就记在脑子里吧
本来要记忆复杂的密钥(CEK)
变成只要记住对个人来说简单多了的口令
PBE的加密过程
PBE的解密过程
盐的作用
用来防御字段攻击
第十三章《PGP》
PGP(Pretty Good Privacy)是一款Philip Zimmenrmann个人编写的密码软件
OpenPGP是一个对密文和数字签名格式进行定义的标准规格(RFC1991、RFC2440、RFC4880、RFC5581、RFC6637)
GnuPG(GNU Privacy Guard)是一款基于OpenPGP标准规格实现的开源密码库
第十五章《密码技术与现实社会》
密钥学家的工具箱
追寻完美的密码技术
量子密码:密码学家的终极武器,最强之盾
量子计算机:密码破译者的终极武器,最强之矛
只有完美的密码,没有完美的人
人的漏洞比密码算法对的漏洞大得多
社会工程学
0 条评论
下一页