E(k,m) = m ⊕ k , D(k,c) = c ⊕ k
Given a message (m) and its OTP encryption ( c),可 compute the OTP key from m and c. k = m ⊕ c. OTP has perfect secrecy (i.e. no CT only attacks). Bad news: perfect-secrecy ⇒ key-len ≥ msg-len OTP可防止密文攻击,且key的长度需大于等于明文的长度,不实用。
2、流加密(Stream Ciphers)(making OTP practical)Making OTP practical using a PRG: G: K ⟶ {0,1}n
Stream cipher: E(k,m) = m ⊕ G(k) , D(k,c) = c ⊕ G(k)
Security: PRG must be unpredictable
流加密,是对称加密算法的一种,加密和解密双方使用相同伪随机加密数据流(pseudo-randomstream)作为密钥,明文数据每次与密钥数据流顺次对应加密,得到密文数据流。实践中数据通常是一个位(bit)并用异或(xor)操作加密。 流加密不具有perfect secrecy,因为the key is shorter than the message。 其安全性取决于特定的PRG伪随机数生成算法, PRG为随机数生成算法必须为不可预测的,即已知1 ~ i位,无法预测i+1 ~ n位的具体值。
在密码学中,永远不要用random()函数来生成随机数。 如libc中的random()实现为:(为Weak PRG)
r[i] ← ( r[i-3] + r[i-31] ) % 2^32
output r[i] >> 1
Never use stream cipher key more than once !! 一次性密码本的基本原则就是只使用一次,然后必须抛弃,这样才会提供足够的安全性和不可破译性。(维诺那计划 Venona project)
• Network traffic: negotiate new key for every session (e.g. TLS)
• Disk encryption: typically do not use a stream cipher
3 Modern stream ciphers: eStream
增加nonce,且The pair (k,r) is never used more than once. Nonce是或Number once的缩写,在密码学中Nonce是一个只被使用一次的任意或非重复的随机数值。在加密技术中的初始向量和加密散列函数都发挥着重要作用,在各类验证协议的通信应用中确保验证信息不被重复使用以对抗重放攻击(Replay Attack)。