一次性密码具有非常好的安全性,这意味着手上只有密文的情况下,攻击者不可能进行破译。但是好的安全性基于长度大于等于原消息的私钥,这使得一次性密码并不实用,因为如果加解密双方有很好的方法来传递消息和私钥,他们直接传递消息就好,没必要进行加密。
为了让一次性密码更加实用,我们引入 “流密码” 的概念。流密码的核心思想是——以“伪随机”密钥替代一次性密码中的 “随机” 密钥,伪随机密钥产生自密码学安全伪随机数生成器(CSPRNG,Cryptographically Secure Pseudo-random number generator )。要注意的是,CSPRNG 不同于一般的伪随机数生成器,因为 CSPRNG 产生的数据必须和真实随机数看起来没有区别才行。CSPRNG 是一种算法(或函数),能产生一长串数字,类似于随机数的性质。因为随机数很难生成,所以 CSPRNG 要依靠种子(seed)来决定初始状态及将来产生的数;CSPRNG 从相对较小的起始种子生成海量的随机数(例如从 128 bit 的种子生成几 GB 的随机数)。如果起始种子是已知的,则随后产生的所有数都是已知的,也就是说 CSPRNG 具有确定性;这也导致CSPRNG 产生的数,其随机程度完全取决于种子的随机程度。为了让一次性密码更加实用,我们可以根据所需长度,使用伪随机数生成器的输出替换原来的私钥;这样的话只要传递初始种子就可以了。因为 CPRNG 具有确定性,使用相同种子能得到相同输出(也就能得到相同的 key 用来加解密)。为了更好理解,我们先看看原来的一次性密码:
使用伪随机数生成器的输出 G(K),替换原来的私钥 K:
(注:图例中只是其中一种流密码,称为同步流密码。还有一种方法称为 “自同步流密码”,使用密文中的前几位数计算出密钥中的每一位。)
替换后的私钥可以远远短于要加密的消息,使得分配及管理私钥更为方便,进一步改善了一次性密码不实用的问题。但这种做法也带来了新的问题:
将原来完全随机的私钥替换为安全随机数生成器的输出,会导致私钥长度比原消息短,使得我们的密码不再具有完全保密性。因此流密码的安全性取决于我们的伪随机数生成器的不可预测性。如果可以预测 CSPRNG 的输出,则可以获得明文消息。以下是大家熟知的一些使用弱流密码的密码系统:
802.11b WEP:WEP 是一种给 WiFi 数据做加密的算法,它使用的流密码称为 RC4 。因为流密码中不能一直使用同个密钥,所以长期使用的密钥包含一个每次都会变动的值 “IV”;然而 “IV”只有 24 位,也就是说加密超过 5000 条消息后,就会有五成的概率出现相同的密钥。
CSS:DVD Forum 使用内容扰乱系统(CSS, Content Scramble System)来管理 DVD 的数字版权,使得仅有获得授权的应用才能访问 DVD 内容。CSS 使用 40 位的密钥,而 40 位的密钥空间较小,可以相对快速地暴力破解。(尽管密钥是 40 位,但考虑到 CSPRNG 的技术特点,只要猜出 17 位组合后,系统便可能被完全破解。)
改善其功能性和可用性。它也可以支持多种区块链应用程序的开发,提高其可扩展性。