密码学关心的问题和应用
Secrecy,即信息是否泄露
Integrity,即信息是否被篡改
Oblivious Transfer(不经意传输)
Zero Knowledge Proof(零知识证明)
Secure Multi-party Computation(多方计算)
Digital Currency(数字货币)
如何定义安全?CPA-secure、CCA-secure....
观点一:
Only I know the encryption algorithm and keys, so it's safe.
观点二:
It would takes 100 years to break the system for an adversary with a currently most advanced computer using the best known method.
严格证明:
Computationally Security
Game-Based Proof
Simulation-Based Proof
如何取随机数?什么是伪随机序列?如何衡量伪随机序列的随机性?
Oblivious Transfer
你可以找女孩A和B中其中一个女孩的号码,但是不能让另一个人知道
一些概念
现代加密方法包括如下几个部分:
\(\mathcal M\) 表示信息空间,即所有可以加密的信息的集合
\(\mathcal K\) 表示密钥空间,即所有密钥组成的集合
\(\text{Enc,Dec}\) 表示加密、解密方法
\(\text{Gen}\) 表示密钥生成器
一个比较显然的要求是 \(Dec(Enc(M))=M\),即加密后解密的信息要保真
Classical Cipher
给了几个例子
凯撒密码(Caesar Cipher)
定义函数 \(next:\Sigma\mapsto\Sigma\) 为 按照某种顺序排列 \(\Sigma\) 的内容,某字符的下一个字符是什么
然后构造映射 \(f_k=next^k\),其中 \(k\) 是非 \(0\) 常正整数,那么 \(f_k\) 和 \({f_k}^{-1}\) 就是一对加密和解密算法了。
\(k=3\) 的情况就是经典凯撒密码
这个密码问题很大
首先这是一个固定的算法
其次 \(k\) 的值域很小,只需要做 \(26\) 次就可以得到所有情况
由此自然引出
Sufficient Key Space Principle(充分密钥空间原则)
任何加密算法必须有足够大的密钥空间,使得不会被暴力枚举破解。
一个原则是密钥要尽可能地长
但是足够大的密钥空间并不一定能保证安全,MAS加密是一个例子
ROT-13
取 \(k=13\) 的凯撒密码
这个密码的一个好处在于,\(f_{13}={f_{13} }^{-1}\),即加密和解密是一样的
Mono-alphabetic Substitution Cipher(单字母替换密码)
构造一个permutation \(\pi:\Sigma\mapsto\Sigma\)
那么 \(\pi\) 和 \({\pi}^{-1}\) 就是加密和解密。这里permutation 的意义在于,如果不是双射的话,就无法解密了
凯撒密码可以看成是这个的特例。这类密码的一大特色就是要有一个对应小本本
容易计算,MAS密码的密钥空间就是排列数量 \(\left|\Sigma\right|!\)。取小写字母表就是 \(26!\approx 2^{88}\)
MAS的最大缺点在于,它永远将相同字符加密成相同的字符(双射),即它完全保存了原文的所有信息。这使得第三方可以基于统计学原理来进行攻击。例如说"u常在q后,h很可能在t后"之类的统计学规律,常见的模式会被保留,甚至说直接用字母频率的相对大小进行匹配。
Poly-alphabetic Substitution Cipher(多字母替换密码)
考虑构造这样构造的排列 \(\pi:\Sigma\times\Sigma\mapsto \Sigma\times\Sigma\)
也就是我们把每两位字符映射为两位字符。这样可以部分解决相同字母映射下的象永远相同的问题
缺点也很明显,我们需要更大的空间储存映射表
Vigenere Cipher
这个密码首先需要一个catch phrase,例如说 \(phrase=cafe\)
然后构造 \(\pi:\Sigma\mapsto\Sigma\),规定 \(\pi(code_i)=f_{phrase_{i\pmod |phrase|} }(code_i)\)
可以发现这实际上就是一个特殊的PAS密码,即我们每 \(|phrase|\) 位造一个映射,并且每个映射都是相同的
VC的破解
分成几个步骤
求\(phrase\)的长度 \(m\)
把密文每 \(m\) 位分组,那么模 \(m\) 同余的位放在一起就是一个\(k\)未知的凯撒密码了
现在考虑怎么破译单次的凯撒密码
我们当然可以枚举\(26\)种可能的密钥,然后找到make sense的明文
但是由于判定明文是否make sense是不那么平凡的,因此书上给出了另一个可以自动化完成的做法
定义 \(p_i\) 表示第 \(i\) 个字符在英语中出现的频率,\(q_i\) 表示第 \(i\) 个字符在密文中出现的频率,假设密钥是 \(k\),那么有
\(\sum {p_i}^2\approx \sum{q_{i+k \text{ mod } 26} }^2\)
于是我们可以计算不同key对应的 \(\sum p_iq_{i+k\text{ mod } 26}\),然后按照和期望值的差来排序
那么就可以枚举 \(m\),然后对模 \(m\) 相同的位做凯撒的破译,最后合并就好了
有一个小小的优化,它源自如下观察:
若两个位置 \(i,j\) 满足 \(i\equiv j\pmod {m}\),且明文对应的第 \(i,j\) 位相同,那么密文的对应位置上的字符也相同
那么就可以寻找长度较短的、出现了多次的密文的子串,\(m\) 一定是用它们之间的距离的一个因数。还可以多次寻找重复的pattern,枚举这些距离的GCD的因数来求 \(m\)
Modern Cipher
古典密码更像是艺术,缺乏科学的分析
现代密码学的目标在于:给定一个密码构造,可以严格证明它是安全的
需要证明,首先要:
定义什么是"安全"
需要给出一些假设(可以是未被证明的猜想)
安全性取决于安全目标(security goal)和攻击模型(threat model),即不同的目标和不同水平的攻击,会使得安全性的定义发生变化。
security goal
这里用secure encryption举例
前几个要求相对而言比较基本,并且非常显然
攻击者无法通过密文获得密钥
攻击者无法通过密文获得明文
攻击者无法破译任意明文的任意字符
无论攻击者掌握了多少信息,密文不会泄露除此之外的任何信息
threat model
Cipher text-only attack: 攻击者只知道密文
Known-plain text attack: 即已知明文攻击,攻击者在攻击前可以知道若干明文到密文的单向映射(比如说加密文件有固定的格式,有已知的片段)
Chosen-plain text attack: 攻击者可以选择知道若干明文到密文的单向映射(比如说加密设施是公开的,那么攻击者就可以任意获得任意明文对应的密文,但反过来不行)
Chosen-cipher text attack: 攻击者可以选择知道若干密文到明文的映射(比如说解密设施是公开的)
assumptions
加密解密问题通常依赖于一些难以计算/不存在高效算法的问题
大数分解问题
SAT问题
选择假设的时候需要注意这几个点
选择虽未被证明,但是经过长时间检验的假设
选择更弱的假设。若存在两个假设A,B,其中A能推出B,那么选择A而不是B。这样在B被证伪后,A仍然坚挺。如果两个假设不可比较,那么选择被研究得更深入的假设
在假设被证伪后,需要针对性地研究它在证明一个加密方法时扮演的角色
provable security
基于我们的假设,针对特定的攻击者,达到了一些安全目标。这样的安全性被称为可证明的安全性
通常可证明的安全性是对现实中的安全性的一种建模,即仅针对重要部分形式化证明。
Kerckhoffs' Principle
古典密码的安全性很大程度上基于信息的不对称(即我用的什么加密方式,攻击者是不知道的)
柯克霍夫原则:
The cipher method must not be required to be secret, and it must
be able to fall into the hands of the enemy without inconvenience.
即现代密码的安全性仅依赖于密钥,而不是加密方式
这么要求的理由有以下几个:
相比起同时保密密钥和加密方法,只保存密钥要方便得多
相比起更改加密方法,定期更换密钥更容易保持安全
统一的加密方法更容易实现标准化
也就是说,尽量使用公开、经过验证的加密策略,配以定期更换的密钥,更能保护安全。所谓home-brewed算法很多其实经不起验证