02流密码
密码
由加密和解密两个算法E、D组成,也可以定义为一个三元组 ( K , M , C ) (\mathcal{K},\mathcal{M},\mathcal{C}) (K,M,C):(密钥空间,明文空间,密文空间)
E通常为一个随机算法,D是确定算法
有效
可以自己决定什么是有效,例如:多项式时间、特定时间
一次性密码本 The One Time Pad
明文空间 = 密文空间 = { 0 , 1 } n \{0,1\}^n { 0,1}n
c : = E ( k , m ) = k ⊕ m c:=E(k,m)=k \oplus m c:=E(k,m)=k⊕m
m = D ( k , c ) = k ⊕ c m=D(k,c)=k \oplus c m=D(k,c)=k⊕c
缺点:密钥需要与明文一样长,因此在实际中很难使用,如果Alice能够安全传输密钥给Bob,那她一定可以安全传输同样长度的明文给Bob
密码的安全性
密码无法揭露明文的任何信息,一个密文c,由明文 m 1 m_1 m1或 m 2 m_2 m2加密得来的概率是一样的,即无法由密文反推出明文
密钥在密文空间中均匀分布: k ⟵ R K k\stackrel{R}{\longleftarrow} \mathcal{K} k⟵RK(R表示Random、均匀分布)
证明:
对任意的 m , c m,c m,c, E ( k , m ) = c E(k,m)=c E(k,m)=c 的概率等于所有能够使其成立的 k k k,除以总的 k k k的个数,即:
P r [ E ( k , m ) = c ] = # k e y s , k ∈ K , s . t . E ( k , m ) = c ∣ K ∣ Pr[E(k,m)=c]=\tfrac{\#keys,k\in \mathcal{K}, s.t.E(k,m)=c}{|\mathcal{K}|} Pr[E(k,m)=c]=∣K∣#keys,k∈K,s.t.E(k,m)=c 可以看出只需要分子是一个常数,即为完美安全(key就是k)
在一次性密码本中,由于 c = k ⊕ m ⇒ k = c ⊕ m c=k \oplus m \Rightarrow k=c \oplus m c=k⊕m⇒k=c⊕m,k是唯一的
因此一次性密码本实际上是完美安全的,没有唯密文攻击
对于完美安全的密码,密钥空间的大小 ≥ \geq ≥ 明文空间的大小: ∣ K ∣ ≥ ∣ M ∣ |\mathcal{K}| \geq |\mathcal{M}| ∣K∣≥∣M∣
流密码
由于一次性密码本虽然是完美安全,但是不实用。于是基于一次性密码本的思想,改造出了流密码
idea:把随机的key替换成伪随机的。流密码不是完美安全的,因为密钥比明文短
PRG(伪随机数发生器):取一个随机种子s,把它映射成一个很长的比特序列,比如种子可能只有128位,但可以扩展成很长的字符串。
函数G本身没有随机性,它是一个可以有效计算的确定性函数,唯一有随机性的东西是随机种子s。输出应该是“看起来随机的”。
PRG的性质:
不可预测性:可预测指的是,给定一段序列,推算出后面一位的概率 > = 1 / 2 + ϵ , ϵ > = 1 / 2 30 >=1/2+\epsilon,\epsilon>=1/2^{30} >=1/2+ϵ,ϵ>=1/230
( ϵ < = 1 / 2 80 \epsilon <= 1/2^{80} ϵ<=1/280 时被认为是可忽略的)
可忽略和不可忽略
ϵ ( λ ) = 1 / 2 λ \epsilon(\lambda)=1/2^\lambda ϵ(λ)=1/2λ:negligible
ϵ ( λ ) = 1 / λ 1000