上一期聊过密码技术“十八般兵器”的头一位——分组密码,本期描述对称密码体制的另一重要成员——序列密码,也称为流密码(stream cipher)的功用与特点。
在密码学工具箱不同“兵器”中,序列密码重要性和应用规模肯定比不了分组密码和公钥密码,那为什么要把它放第二期内容描述呢?大家可以发现,各类密码教科书中的分组密码与序列密码基本都是紧挨着介绍的,两者关系之紧密可见一斑。而且,序列密码的出现也与现代分组密码一样都很早于公钥密码,著名的一次一密算法早在二战前就出现了。这里我们也要遵从传统,相信随着后面的阐释大家会“其义自见”。
序列密码工作的基本过程
序列密码的大体过程如下图所示,在这里我们以其中的一次一密算法为例。一次一密是最典型也可以说最成功的序列密码(其它序列密码算法有RC4、SEAL等),1949年信息论发明人香农证明了只有一次一密(one-time pad)密码算法是信息论安全的,这给序列密码技术的研究以强大的支持,序列密码的后继发展都是模仿和改进一次一密算法的尝试(明显所有的改进都没能超越原型)。下面我们就通过“一步一动”的分步拆解方式让大家一窥其究竟。
第一步,产生密钥流
序列密码产生的初衷不难理解,如果能以某种方式像源源不断的水流一样获得一个“活跃的”密钥流(即上图中密钥比特流,这也是流密码说法的来源),人们自然就应该、也便于利用这样的密钥流进行加密。
既然这种密钥流是流密码的“动力源泉”,虽然密钥流形式上就是一个随机的二元(即二进制的0,1)序列,但对其质量上的讲究就十分有必要了。试想,这个“泉眼”可是一个需要随时提供足够数量(依明文而定)和高安全质量(不能重复)密钥的“永动泉”,没有它的推动,明文就形成不了足够安全的密文。我们可以粗略的分为两种——人造泉与天然泉,质量呢,也必然是天然的远强于人造的。对密钥流的“讲究”可以说是序列密码的一大特点,用学术性语言来说就是——流密码的安全性取决于密钥流的安全性。
“人造泉”形式的密钥流通过伪随机数生成器生成密钥序列,它生成的也肯定是伪随机序列。其优点是容易构造,容易分发,通过加解密两端共同构造的伪随机数生成器可以容易的产生。
“天然泉”形式的密钥流就是指通过真随机方式产生的、与信息明文长度相同的密钥流,这是满足理论上不可破译的一次一密算法所必须满足的。易见一次一密算法对真随机数发生器件提出了较高的要求,不能够出现密钥流“用完了”或“不够用”的情况,鉴于高速真随机数发生器如量子随机数发生器(QRNG)等近年来才得到了长足发展和应用,读者应该能明白,在四十年代理论完美的一次一密算法限于当时技术水平是非常难于实现的,香农研究上的高瞻远瞩真是让我等后辈折服。
以上阐述的是“泉眼”来源的差别,有了密钥流,使用上还需要注意:密钥“即用即弃”,绝不能重复使用,这是使用序列密码一定要遵守的共性要求。一次一密算法的别称——一次性密码本强调的就是这个原则。
第二步,同步并加密
在一次一密算法中,采用的是明文与密钥逐位亦或的“简单”做法。这体现了序列密码的又一共性特点——复杂和关键点在密钥流发生器而不是明文与密钥的“混合”操作上。如果单纯从加密操作上看,一次一密密码对明文的混乱程度也就是扩散性远不及分组密码,但如此简单的密码居然是理论上无法破解的,完全依赖于密钥流的产生。
解密时,对密文信息与密钥同样进行逐位的异或操作,就获得了明文,在此对解密过程不再赘述。
序列密码没有分组补齐这一步骤,值得讨论的是序列密码的明/密文与密钥的同步问题,因为两者一旦不同步就会导致加解密运算失败,它是序列密码中一个自身暗含但应用序列密码时需考虑的问题。序列密码从这个方面看可以分为两种:完全让密钥流的生成独立于明文序列和密文序列,称为同步序列密码,一次一密算法就是同步序列密码。从其原理图中易见,消息的发送者和接收者必须同步才能做到正确的加密解密,即双方使用相同的密钥,并用其对同一位置(状态)进行操作。一旦由于密文字符在传输过程中被插入或删除而破坏了这种同步性,那么解密将失败。这时只有借助其它的加密技术来重建同步,解密才能继续进行。重置同步的技术包括:重新初始化,在密文的规则间隔中设置特殊记号,或者,如果明文包含足够的冗余度,那么就可以尝试密钥序列的所有可能偏移。
序列密码也可以做到让密钥流本身是与明文和密文序列相关,称为异步序列密码或自同步序列密码,之所以称为异步序列密码就是要增加额外处理过程使之相关,之所以称为自同步,是因为这样做的好处是在同步性遭到破坏时,可以自动地重建正确的解密,而且仅有固定数量的明文字符不可恢复。具体实现方式在此不再赘述。
序列密码总体特点
分组密码与序列密码的区别
既然分组密码以一定大小(为便于计算机处理一般是4字节整数倍)作为每次处理的基本单元,而序列密码则是以通常1个位(bit)长、最多一个或几个字节长度(比较少见)为基本的处理单元。那能否从外在特征检视,认为序列密码就是把分组密码的分组尽量做到最小而来从而两者是能自由转换的呢?两者的区别到底在哪里呢?
分组密码与序列密码的最大区别不在于分组大小,而在于记忆性。分组密码是把明文分成相对比较大的分组,对每个分组使用相同的加密函数进行处理,因此分组密码是不随时间变化的固定变换,也就是无记忆的。分组密码可以通过应用上期所述的CFB模式或OFB模式适当增加这种状态相关性也就是记忆性,但这种增加程度是有限的。
序列密码是有记忆的是指它是随时间变化的加密变换(也可称为状态密码),序列密码算法不仅与密钥和明文有关,还一定和当前状态有关。序列密码的记忆性是与生俱来的,例如,任何时刻一次一密算法的异或位操作是对“当前”明文位置上的位操作,每个时刻处理的明文对象都不同,一个看似简单的异或操作,明文是在密钥流这个“永动泉”的推动下,不停流转而产生相应密文的。是不是能看出点孔夫子所述的“逝者如斯夫,不舍昼夜”的意味来。
因此,分组密码算法的设计关键在于加解密算法,使明文和密文之间的关联在密钥的控制下尽可能复杂,而序列密码算法的设计关键在于密钥流发生器,使生成的密钥序列具有尽可能高的不可预测性。
序列密码可称高手的几个理由
第一是研究序列密码涉及到大量的理论知识,诸如信息论安全这种理论可证明安全的设计原理被提出,也得到了广泛的分析,序列密码让人们用着更放心,尽管许多研究成果并没有完全公开,序列密码是世界各国军事、外交等“高端”领域中使用的主要密码体制之一。
第二是因为序列密码的算法运算部分相对简单,便于硬件实施,算法的实现就不需要复杂的硬件电路(最简单的就是只需能实现一位上异或操作的门电路即可),算法运行速度就相对快、错误传播少。
第三是因为传统上密码管理者和研究者认为用重复周期尽量长的伪随机序列生成密钥就够用了,而伪随机序列的产生很容易,有比较成熟的数学理论工具和程序,再不济也能靠人工分发离线密钥进行密钥管理保障,这就造成了序列密码有点“按需配置”、“丰俭由人”的意味。有理论依据,易构造,又能满足用户大部分需求,用户怎么会不使用这么好的东西呢。所以我们说序列密码是持道至简的低调高手,并不为过。
序列密码的相对不足
“完美”密钥流的产生相对困难,一次一密算法的不足就在于密钥序列太长,随着当前信息技术的进步,难点倒不是在于随机密钥序列产生不了(例如QRNG就容易按需产生高质量密钥流),而是在于密钥管理上,这样大规模密钥序列的存储、分发等管理操作的复杂度高于使用分组密码,可维护性也弱于使用分组密码。
至此,对称密码体制的部分就聊完了,对称密码是最早被人们发明出来的现代密码,发展成熟,原理易于理解与接受,应用最为广泛,厂商封装后开发者和用户使用上都非常方便灵活。我们在此是想为读者展现对称密码内部运行上的一些规律,不论是分组密码还是序列密码,都是运转非常讲求“规范齐整”的密码——尽管分组、同步等细节一般都会被封装起来。不论分组密码还是序列密码,都非常强调密钥使用上的“新鲜性”,密钥不能重复使用、不能被敌手预测,量子密码中的量子密钥分发(QKD)技术,就不仅能够通过量子信道支持实现分组密码使用上的自动化实时高速密钥更新,而且为实现完善的一次一密信息论可证安全的序列密码提供了可能。
下期开始,我们进入到非对称密码体制的缤纷世界!
康老师 简介
深耕信息安全领域二十余年,从事安全增强系统、密码应用系统及通用软件系统开发、信息安全理论研究、标准规范编研及开发团队管理。参与多项国家863、973、核高基专项等重大科研项目,作为主要完成人编研完成国家/军用标准多项,发表学术论文二十余篇。