概率论前置技能
其实就三个公式
条件概率公式:
\(Pr[B|A]=\dfrac{Pr[A\wedge B]}{Pr[A]}\),这个是定义
贝叶斯公式
\(Pr[B|A]=\dfrac{Pr[A|B]\cdot Pr[B]}{Pr[A]}\),这个只需要按照上面的展开就可以证明
全概率公式
\(Pr[A]=Pr[A|B_1]\cdot Pr[B_1]+Pr[A|B_2]\cdot Pr[B_2]+\cdots +Pr[A|B_n]\cdot Pr[B_n]\),意思是把整个概率空间作划分,然后分别考虑这些划分内部事件 \(A\) 的那部分,最后合并在一起
获取随机数
注意到一套encryption scheme包括一个Gen()操作生成一个key,我们会需要一个随机生成数据的方法来产生密钥
首先我们需要收集若干high-entropy的数据,然后通过特殊的处理来生成nearly independent and unbiased bits
high-entropy意味着高不确定性,而nearly independent and unbiased则对最终产生的数据有一些要求
一个例子就是扔硬币。假设每次扔硬币事件独立,正反面概率分别为 \(p,1-p\),那么我们可以扔很多次,然后:
如果出现连续的"正反",就写下一个"1";如果出现连续的"反正",就写下一个"0"
注意到它们的概率都是 \(p(1-p)\),因此就得到了一个uniformly distributed output
通常用作cryptography的随机数算法有特殊的要求,因此不是所有的随机数生成器都可以用于特定的加密算法的,这一点需要注意(也即正确使用加密算法的注意事项)
一些定义
\(\mathcal {K,M,C}\) 分别表示密钥、消息、密文空间(即集合),\(\text{Gen,Dec,Enc}\) 分别表示密钥生成器、解密器、加密器三个算法/函数。通常我们规定 \(|\mathcal M|>1\),这是因为如果你要发送的信息永远只有一种,那就没有破译的必要而只存在是否发送这一区别了....即信息是不确定性的度量,因此消息空间必须具有不确定性(每次可能传送的消息不止一种)
\(\text{Gen}\) 会随机产生一个key,而 \(\Im \text{ Gen}=\mathcal K\)
\(\text{Enc}\) 会输入一个 \(m\in\mathcal M\),并根据key \(k\) 产生一个密文 \(c\in\mathcal C\)。我们允许 \(\text{Enc}\) 是probabilistic的,即每次都按照一定概率生成出不同的密文。通常写作 \(c\leftarrow \text{Enc}_k(m)\)。这是一个functionality
\(\text{Dec}\) 会将给定的密文 \(c\in\mathcal C\) 根据key \(k\) 产生对应的原文 \(m\),我们要求即使 \(\text{Enc}\) 并非是确定性的,也应该有 \(\text{Dec}(\text{Enc}_k(m))=m\) 成立
我们传统上认为一段原文应该是确定的,但事实并非如此。一个独特的视角是,原文 \(m\) 可以看成是对 \(\mathcal M\) 上具有特定概率分布的随机变量 \(M\) 进行采样得到的结果,这是站在攻击者的视角考虑的。 \(\mathcal M\) 上的概率分布与加密策略无关,而只由使用者决定。
我们通常假设 \(K\) 和 \(M\) 这两个随机变量是独立的,意思是发送消息的人的消息分布不应该受到他所使用的加密策略的影响。
如果我们确定了加密策略和发送消息的人(即 \(\mathcal M\) 上的概率分布),那么就确定了 \(\mathcal C\) 上的概率分布。
Perfect Secrecy
一些关于攻击者的假设:
攻击者可以窃听密文
攻击者可以知道所有可能发送消息的集合和消息空间的概率分布
同时这个攻击者也知道加密策略
但他仅仅只是不知道具体哪条消息被发送了而已
Perfect Secrecy的意思就是,攻击者无法通过密文来改变他对 \(\mathcal M\) 上的概率分布的认识
形式化写出来就是:
\(\forall m\in\mathcal M,c\in\mathcal C:Pr[M=m\;|\; C=c]=Pr[M=m]\)
这里要求 \(Pr[C=c]>0\)
用条件概率拆开就是 \(Pr[M=m\wedge C=c]=Pr[M=m]\times Pr[C=c]\)
另一种等价表述是这样的:
\(\forall m,m'\in\mathcal M, c\in\mathcal C:Pr[\text{Enc}(m)=c]=Pr[\text{Enc}(m')=c] \text{ (1)}\)
也就是说,对于给定的任意的密文 c,我们都无法区分是明文m加密成了它还是明文m'加密成了它
有引理:加密策略是perfectly secret的当且仅当它满足\((1)\) 式
\(\Rightarrow\)
需要注意到这样一个等式:\(Pr[C=c|M=m]=Pr[c=\text{Enc}_k(m)]\)
意思是说,如果我们已经知道了 \(M=m\) 的条件,那么 \(C=c\) 的概率就是 \(c=\text{Enc}_k(m)\) 的概率。因为原文已经作为条件给出,因此我们可以这么做
于是就有 \(Pr[c=\text{Enc}_k(m)]=Pr[C=c|M=m]=\frac{Pr[M=m|C=c]\times Pr[C=c]}{Pr[M=m]}\)
又根据perfectly secret的定义我们有 \(Pr[M=m|C=c]=Pr[M=m]\),因此带入上式就有 \(Pr[c=\text{Enc}_k(m)]=Pr[C=c]\)
注意到此处 \(m\) 是任意的,因此自然满足等式\((1)\),证毕。
反方向类似,贝叶斯公式拆开再用那个观察到的等式和全概率就可以啦
Perfect adversarial indistinguishability
好长的名字...
第三个等价的,用一个game表述的perfect secrecy是这样的:
有一个假设拥有任意算力的攻击者 \(\mathcal A\),他可以选择两个明文 \(m_0,m_1\in\mathcal M\),然后交给一个决策者
决策者会随机一个\(0/1\)比特 \(b\),然后把 \(c=\text{Enc}_k(m_b)\) 交给 \(\mathcal A\),由 \(\mathcal A\) 判断这是哪个明文加密形成的
对于一个加密策略,我们用三元组 \(\Pi=(\text{Gen, Enc, Dec} )\) 表示,并用 \(\text{PrivK}^{eav}_{\mathcal A,\Pi} =1\) 表示某一轮猜测的结果正确,用 \(0\) 表示猜测错误
一个很naive的策略就是一直猜\(0\),那么这样正确率就是\(\frac{1}{2}\)的,因为 \(b\) 是随机的。
若对于任意的 \(\mathcal A\),都有 \(Pr[\text{PrivK}^{eav}_{\mathcal A,\Pi}=1]=\frac{1}{2}\),那么我们称这个加密策略是perfectly adversarial indistinguishable的
可以证明这个定义和perfect secrecy的定义是等价的。因为是作业内容所以就不放证明了
这里的 \(\mathcal A\) 并不一定要是具体的人,当然也可以是某种算法、某段程序。
One Time Pad
这个策略的perfect secrecy是由大名鼎鼎的香农证明的。
给出构造如下:
对于一个固定的正整数 \(l\),我们规定 \(\mathcal M=\mathcal C=\mathcal K=\left\{\;0,1\;\right\}^l\)
\(\text{Gen}\) 等概率从 \(\mathcal K\) 中选取一个串,\(\text{Enc}\) 则输出key和m按位异或的结果,\(\text{Dec}=\text{Enc}\)
很显然这个策略满足我们对加密策略一般性的要求,也不难证明这是perfectly secret的
对于任意的 \(c\in\mathcal C,m\in\mathcal M\),我们固定这样的 \(c,m\),于是
\(Pr[C=c|M=m]=Pr[\text{Enc}_k(m)=c]=Pr[m\oplus K=c]=Pr[K=c\oplus m]\)
\(K\) 是key的随机变量,而 \(c,m\) 是任意定的串,于是这个式子就是从key space中取出一个特定串 \(c\oplus m\),概率即为 \(\frac{1}{2^l}\)
又 \(Pr[C=c]=\sum\limits_{m\in\mathcal M}Pr[C=c|M=m]\times Pr[M=m]=\frac{1}{2^l}\sum\limits_{m\in\mathcal M}Pr[M=m]=\frac{1}{2^l}\)
于是我们的老朋友贝叶斯公式又来了
\(Pr[M=m|C=c]=\frac{Pr[C=c|M=m]\cdot Pr[M=m]}{Pr[C=c]}=Pr[M=m]\),就证明完了
这个加密策略确实很牛逼,但是存在一些问题使得现在很少用它。
Key太长了,实际上必须和m等长。如果可以安全运输这么长的key,为啥不直接运输m呢?
Key必须是One-time的。假设一个攻击者连续获取到了两次用同样key的信息\(c_1,c_2\),那么根据\(\text{Enc}(x)=x\oplus k\),很容易就能得到 \(c_1\oplus c_2=m_1\oplus k\oplus m_2\oplus k=m_1\oplus m_2\),这就泄露了部分信息。结合1使得这个方法变得非常昂贵
Limitations
有如下定理:
给定perfectly secret scheme \(\Pi=(\text{Gen, Enc, Dec})\),则 \(|\mathcal K|\geqslant |\mathcal M|\)
由反证法,假设 \(|\mathcal K|<|\mathcal M|\),那么取如下集合: \(\mathcal M(c)=\left\{\;m\;|\;\text{Dec}_k(c)=m\text{ for some }k\in\mathcal K\;\right\}\)
注意到 \(\text{Dec}\) 是一个函数,因此 \(|\mathcal M(c)|\leqslant|\mathcal K|<|\mathcal M|\)
即 \(\mathcal M(c)\subseteq\mathcal M\)。取 \(m'\in\mathcal M\backslash\mathcal M(c)\),那么就有
\(Pr[M=m']\neq0\),但是 \(Pr[M=m'|C=c]=0\),因为 \(c\) 不可能被解密为 \(m'\)
这个结论很厉害,直接把这条路封死了。