安全性设计如何选择可靠的随机数加密方案?
质量不良的随机随机数不会成为加密系统的弱点,只要采用标准化的解决方案,将可帮助设计工程师们一夜好眠。那么如何为安全设计选择可靠的随机数加密方案?
随机数(random number)是密码学的钥匙(也是关键),它们会是加密系统的弱点,因此也常变成受攻击的目标;因此我总是尝试让我的脑袋绕着有关随机性的主题转。我一直认为二极管接面(diode junction)的热噪声(thermal noise)是随机性的,但是现在,它似乎并不是那么随机。密码学家们总是在思考坏人可能会发动的攻击手法,然后要想出对抗的招数;他们做的是好事,因为大多数人(包括我自己)在进行在线金融活动或购物时,都得仰赖安全性通讯。有许多密码学菁英任职于美国国家标准技术研究所 (National Institute of Standards and Technology,NIST);该组织公布了一套规格,有关于如何建立随机比特流,以应用于加密──其SP800-90A规格所提供的解决方案,是以一种决定性随机位产生器(Deterministic Random Bit Generator ,DRBG)将比特流加密。这种随机数生成器(Random Number Generator,RNG)对我来说是有意义的,接下来我将先简短介绍DRBG的原理,然后谈谈如何将这种RNG嵌入FPGA中;现在我需要先厘清一些会用到的专门术语,然后解释其运作过程。任何一套加密系统会需要一组密钥以及一组输入的数据流,从这里事情开始变得比较复杂。用以编排密码的、“或多或少随机”的比特流,被称做是Entropy (熵)输入;为了确保每次RNG的产出是不同的,Entropy要结合叫做Nonce (随机数)的输入;Nonce在通过DRBG的每一个周期,必须要改变或是增加。这是有道理的,因为你需要防堵一个可能会多次收集数据、尝试预测下一个输出比特流内容的攻击者。但是为了防止Entropy本身被泄漏,还有一个选项是采用第三个变量──个人化字符串 (Personalization String);这里的巧妙之处在于,如果这个输入是源自于一组编号,就可以确保显然正在监视相同机器的攻击者难以有进展。SP800-90A规格还包含 另一个选择性的额外输入(Additional Input),其概念是它可以源自于第二个(独立的) Entropy来源、也就是“腰带又加上吊带”的双重保障。到这里我的头开始痛了…然后我读到有关于Health Check的部分;Health Check一开始是做为例行检查、确认一切安好,或者是在使用者怀疑攻击者可能窜改RNG时进行。这个区块惠隔离所有DRBG的外部输入,然后馈入一组预设的刺激;输出的结果是针对一组已知答案的验证,如果因为任何原因失败,Health Check就会释出错误消息、锁住RNG ,避免输出任何被破 解的比特流。要将RNG嵌入几乎任何一种FPGA都很容易,设计工程师只需要采用RNG IP核心以及简单的环形振荡器与计数器做为Entropy的来源;这种常见规则适用于打造加密系统,因为设计工程师必须确保FPGA内部的敏感数据,不能从组件的任何一个接脚被存取。模拟、验证被随机设计的电路可能听起来很难,但因为是完全确定性的,RNG核心有一套完整的验证测试基准;如果最后的加密系统需要听过外部测试机构的批准, 该测试基准也同样重要。我只能想象要测试比特流随机特性会遇到的问题。FPGA的实作过程应该是全数字化的,所以应该很强韧、不会受到尝试以改变电压或温度的攻击者之窜改;自振荡频率有可能会变化,但那不应该影响输出比特流的随机性质量。采用IP核心做为嵌入式AES加密引擎的一个好处是,该种电路区块能在许多应用中同时支持其他工作,为数据流提供多重加密解密,节省FPGA内部空间。当它需要透过不安全的连结传送加密密钥,另一个选项是在密钥包装中采用AES加密引擎。质量不良的随机随机数不会成为加密系统的弱点,只要采用标准化的解决方案,将可帮助设计工程师们一夜好眠。