在介绍流密码之前,我们先来弄明白一个基础前置知识点——异或运算。
一、异或运算(XOR)
运算规则:相同为0,不同为1
特点:一个比特进行两次异或运算,可以恢复成原来的比特。
明文:1100
密钥:0101(加密)
密文:1001
密钥:0101(解密)
明文:1100
优点:这种可逆性,使得异或运算既可以用于加密变换,也可以用于解密变换。
缺点:如果攻击者可以猜测或者捕获得到的密钥,那么也可以通过异或轻易解密。
异或运算之所以可以同时用于加密与解密,在于他的可逆性,但这也是他的缺点,安全性完全依赖于密钥隐藏。
二、一次一密算法(OTP)
(1)定义
一次一密(One-Time Pad,简称OTP)是一种流密码算法,它被认为是理论上最安全的加密方法之一,前提是其实施严格遵循几个关键原则:
1. 密钥必须与明文一样长:这意味着每次加密都使用一个与所要加密的信息长度完全相等的密钥。
2. 密钥必须是真正随机的:密钥的每一位都应该是随机产生的,不能有任何模式或可预测性。
3. 密钥必须只使用一次:同一密钥绝不能用于加密多条信息,否则密文之间的关联可以被用来推断信息内容。
4. 密钥必须保密:密钥的分发和存储必须极其安全,以防被第三方获取。
(2)优缺点
优点:
- 密钥随机产生,仅使用一次
- 无条件安全
- 加密和解密为加法运算,效率较高
缺点:
- 密钥长度至少与明文长度一样长,密钥共享困难,不太实用。
三、流密码的定义
人们在研究一次一密加密算法的时候,试图解决密钥管理和长度的问题。如果能有一种方式,只需要提供一小段密钥,就可以生成加密明文的所有密钥,于是流密码就在此思想上发展。
(1)流密码的基本思想
在流密码中,一个小的密钥(通常称为种子或初始向量)被用来通过一个伪随机数生成器(PRNG)产生一个与明文等长的伪随机密钥流。这个密钥流然后与明文进行异或操作,生成密文。同样,解密过程就是用相同的密钥流对密文进行异或,恢复出明文。
密钥 产生一个密钥流 并使用如下规则对明文串 进行加密:
一般使用线性反馈移位寄存器来实现伪随机密钥的生成。原理就不在此处展开说了。
(2)算法过程
加密和解密过程可以描述如下:
- 密钥流生成:加密和解密双方都使用相同的密钥和初始化向量(IV)来初始化一个伪随机数生成器(PRNG)。PRNG根据其内部状态生成一系列伪随机比特,构成密钥流。
- 加密过程:发送方将生成的密钥流与明文进行按位异或(XOR)操作,得到密文。由于异或操作的性质,相同的操作在不同的比特上是可逆的。
- 解密过程:接收方使用相同的密钥和IV重新初始化PRNG,并生成与加密时相同的密钥流。然后,接收方将密文与该密钥流进行异或操作,恢复出原始明文。
(3)流密码设计原则
流密码的设计原则确实聚焦于创建一个密钥流生成器,这个生成器能够产生具有特定安全属性的密钥流。密钥流序列应具有如下性质:
-
极大的周期:密钥流的周期应该足够长,以防止重复使用同一段密钥流,这会暴露加密数据的模式,使密码分析者能够通过比较不同消息的异同来进行攻击。理论上,对于一个n比特的密钥空间,理想的周期长度应该是2n−1。在实践中,周期越长意味着密钥流的重复频率越低,从而增加了密码系统的安全性。
-
良好的统计特性:密钥流应该看起来像真正的随机比特序列,这意味着它应该满足各种统计测试,例如均等的0和1分布,任意两个或多个连续比特之间的独立性,以及没有可预测的模式或周期性。良好的统计特性有助于确保密钥流的不可预测性,这是流密码安全性的重要组成部分。
-
抗线性分析:流密码应该能够抵抗线性分析,即密码分析者试图通过查找密钥流与明文或密文之间的线性相关性来恢复密钥或明文。这通常要求密钥流生成器的输出是非线性的,或者至少包含足够的非线性成分,以阻止简单的线性方程组求解方法来推断密钥流或密钥本身。