随机性不是您所想象的那样呆板:一些数字流要比其它一些更随机。计算机一直是具有完全确定性的机器,所以,特别在随机的行为方面表现不尽人意(这里撇开那些不怎么样的 OS 软件不谈)。事实上,(部分)随机数真正的唯一来源涉及到测量物理现象,譬如,放射性衰变的计时,它可以用某些数学方面的技巧来提取纯的随机序列。
为了编写代码来实现类似于前面提到的算法,常见情况下,伪随机数生成器生成 0 到 N 之间的一个整数,返回的整数再除以 N。得出的数字总是处于 0 和 1 之间。对生成器随后的调用采用第一次运行产生的整数,并将它传给一个函数,以生成 0 到 N 之间的一个新整数,然后再将新整数除以 N 返回。这意味着,由任何伪随机数生成器返回的数目会受到 0 到 N 之间整数数目的限制。
换句话说,第 n+1 个数等于第 n 个数乘以某个常数 a,再加上常数 b。如果结果大于或等于某个常数 c,那么通过除以 c,并取它的余数来将这个值限制在一定范围内。请注意,a、b 和 c 通常是质数。Donald Knuth 在 "The Art of Computer Programming" (请参阅参考资料)一书中详细介绍了对于这些常数,如何挑选好的值。
人们甚至发明了特殊的机器来破解密码算法。在 1998 年,EFF 发明了用于破解 DES 消息的专用机器。这台机器的目的只是强调 DES(一个流行的、政府支持的密码算法)是如何易受攻击的。(如果想要了解有关 DES 破解器的更多情况,请参阅参考资料。)“破解” DES 的难易程度直接与密钥的长度相关。所以,发明专门用于恢复 RNG 种子的机器也是在可能的范围之内。
如果有一个视伪随机数是必不可少的应用,那么这里有几个可以进一步了解不同算法特性的有价值的资料。较著名的参考资料是 Donald Knuth 的 "The Art of Computer Programming,Volume 2 (Seminumerical Algorithms)" 的第 3 章(请参阅参考资料)。除此以外,还有在 Salzburg 大学数学系的 pLab 中的研究人员,他们花费了所有时间从理论上和实践上来研究随机数的生成。他们的网页(请参阅参考资料)提供了许多有价值的线索来帮助您选择适合于您的应用的生成器。
系统时钟种子甚至进一步使 Reliable Software Technologies 减少可能的洗牌方法数。通过将他们的程序与生成伪随机数的服务器上的系统时钟同步,使得可能组合的数量减少到大约 200,000 种可能性。在这之后,系统就变得不堪一击,由于在这个微小集合的洗牌方法中进行搜索是不费吹灰之力的,这可以在 PC 机上实时地做到。
发现这个薄弱环节的 RST 开发的工具需要知道纸牌中的五张牌。基于这五张牌,程序从几十万个可能的洗牌方法中搜索并推出最优匹配。在 Texas Hold 'em Poker 情形中,这意味着程序将欺骗性玩家手中的两张牌作为输入,再加上三个玩家的第一张翻开的牌(发牌)。这五张牌在第一圈下赌注后是已知的,这足够确定(实时,在玩牌期间)确切的洗牌方法。这幅图显示了 RST 揭开这个赌博事实的图形界面。左上角的 Site Parameters 框是用来同步时钟的。右上角的 Game Parameters 框是用来输入这五张牌和启动搜索的。这副图是程序已经确定所有牌之后捕捉的屏幕。欺骗性的攻击者提前知道谁手中拿有什么牌,余下的发牌会象什么样,以及谁将会胜利。
在本文的下两个专题中,将要提供关于在硬件方面和软件方面如何正确地处理随机数生成的一些指示(以及大量代码)。如果您想提前了解这些,那么很好,可以看 "Randomness Recommendations for Security" (RFC 1750) 这本资料,但它有点枯燥。另外一本值得看的资料是 Bruce Schneier 的优秀作品 "Applied Cryptography"(请参阅参考资料)。
参考资料
请参阅 developerWorks 上有关随机数生成系列的第 2 篇文章使您的软件运转起来:打破偏见。
请参阅 Donald Knuth 的 The Art of Computer Programming, 第一卷,第 3 版(Addison Wesley Longman 公司,1997 年 6 月,ISBN 0201896834),以及 The Art of Computer Programming, (Seminumerical Algorithms) 第 2 卷,第 3 版 (Addison Wesley Longman 公司,1997 年 10 月,ISBN 0201896842)。
请访问 RST,阅读有关他们的 1999 在线扑克揭秘和他们的软件安全性组。
请阅读有关由 EFF 创建的 DES 破解器。
请访问在 Salzburg 大学数学系的 pLab。
请阅读由 ASF 软件发布的 Texas Hold'em 扑克。
请阅读 Ian Goldberg 和 David Wagner 在 1996 年的 Netscape 揭秘。
请阅读由 Bruce Schneier 著作的“已应用的密码术”。
请访问 RSA 的有关用于密钥的随机数的常见问题解答。
关于作者
Gary McGraw 是 Reliable Software Technologies 负责企业技术的副总裁,该公司位于美国弗吉尼亚州杜勒斯 (Dulles)。他从事咨询服务和研究工作,帮助决定技术研究和开发方向。McGraw 在 Reliable Software Technologies 从一个研究科学家作起,从事软件工程和计算机安全性方面的研究。他拥有印第安那大学认知科学和计算机科学双博士学位,弗吉尼亚大学的哲学学士学位。他为技术刊物撰写了 40 余篇经同行检测的文章,担任过主要的电子贸易供应商,包括 Visa 和 Federal Reserve 的顾问职务,并在空军研究实验室、DARPA、国家科学基金会,以及 NIST 的高级项目赞助下担任其首席调研员。
McGraw 是移动代码安全性方面著名的权威人士,并且与普林斯顿的教授 Ed Felten 合作撰写了 "Java Security: Hostile Applets, Holes, & Antidotes" (Wiley, 1996) 以及 "Securing Java: Getting down to business with mobile code" (Wiley, 1999)。McGraw 和 RST 创始人之一、首席科学家 Dr. Jeffrey Voas 一起编写了 “Software Fault Injection: Inoculating Programs Against Errors”(Wiley, 1998)。McGraw 定期为一些受欢迎的商业出版物撰稿,而且其文章经常在全国出版的文章中所引用。
John Viega 是一个高级副研究员,Software Security Group 的创始人之一,并担任 Reliable Software Technologies 的高级顾问。他是 DARPA 赞助的开发标准编程语言安全性扩展的首席调研员。John 已撰写了 30 余篇涉及软件安全性和测试领域的技术性文章。他负责在主要网络和电子贸易产品中查找一些众所周知的安全性薄弱环节,包括最近在 Netscape 安全性中的缺陷。他还是开放源码软件社区的重要成员,编写过 Mailman、 GNU Mailing List Manager 以及最近发布的 ITS4(一种在 C 和 C++ 代码中查找安全性薄弱环节的工具)。Viega 拥有弗吉尼亚大学计算机科学的硕士学位。
使您的软件运行起来:消除偏差
如何通过硬件真正实现随机数生成
Gary McGraw 和 John Viega
Reliable Software Technologies
2000 年 4 月 11 日
内容:
它们如何工作?
消除偏差
硬件源
它们有多好?
结束语
参考资料
关于作者
在本系列的第一部分中,Gary McGraw 和 John Viega 讨论了精确随机数生成。在这一部分,即本系列的第二部分中,Gary 和 John 研究了随机数的硬件源。这些源有时可以提供比全软件解决方案更高的安全性保证(虽然我们也将处理基于硬件的随机数发生器中的缺点)。
从本专栏的上一部分中,我们知道了随机数通常会产生很重要的安全性后果。问题是确定性的机器很难实现随机。最佳答案就是使用好的物理度量来生成随机数(或至少是伪随机数发生器的种子)。许多自然现象就具备这种条件。其诀窍就是它们必须有一些可测量的特性,而且行为至少要尽可能随机(如果不能真正做到随机)。(这种随机性是在量子力学级别上提出的。还不知道随机性真正是量子力学的固有部分,还是我们的科学理论还不够好,不能预测我们应该能够预测的结果。)收集随机性的真正硬件设备是基于测量诸如原子的放射性衰变或热辐射中的波动(某些 Pentium III 处理器就测量后者)之类的事情。
确保数据流随机性的最广为人知的测试套件就是 George Marsaglia 的 DIEHARD 软件包(请参阅参考资料)。它对数据流执行无数的测试。另一个适合此类测试的合理软件包是 pLab(请参阅参考资料)。这些测试做什么或者不做什么其实并不重要;我们只是必须相信它们正在测试发生器的质量,并且认真听从我们正在使用的发生器是否没有通过测试。
在构建用于随机数的硬件设备时,有一些诸如 DIEHARD 这样的测试套件也捕捉不到的缺陷。例如,某些类型的偏差不会在大多数统计测试中显示出来。由于这个原因,我们强烈建议:如果有可能的话,使用信誉好的商业硬件源来生成随机数,而不要构建自己的硬件源,因为您也许最终会不正确地测试您的发生器。如果您仍认定需要亲自测试发生器,我们建议您阅读文章“True Random Number Generators”(请参阅参考资料)。
请访问 developerWorks 上这个讲述随机数生成系列的第一篇文章“使您的软件运行起来:摆弄数字”。
请访问 ComScire 以了解关于 ComScire QNG 的信息。
请阅读 Robert Davies 撰写的评论“True Random Number Generators”。
请访问 Tundra 以了解关于 Tundra RBG 1210 的信息。
请访问 lavarand 网站,以轻松地查看随机数生成。
请阅读文章“Hardware Random Bit Generator”以了解如何构建自己的硬件随机数发生器。
请访问 DIEHARD 以获取一组随机数发生器的测试。
请访问 pLab,这是一个用于生成和测试随机数的面向对象系统。
Reliable Software Technologies.
关于作者
Gary McGraw 是 Reliable Software Technologies 负责企业技术的副总裁,该公司位于美国弗吉尼亚州杜勒斯(Dulles)。他从事咨询服务和研究工作,帮助决定技术研究和开发方向。McGraw 在 Reliable Software Technologies 从一个研究科学家作起,从事软件工程和计算机安全性方面的研究。他拥有印第安那大学认知科学和计算机科学双博士学位,弗吉尼亚大学的哲学学士学位。他为技术刊物撰写了 40 余篇经同行审查的文章,担任过主要的电子贸易供应商,包括 Visa 和 Federal Reserve 的顾问职务,并在空军研究实验室、DARPA、国家科学基金会,以及 NIST 的高级技术项目赞助下担任其首席调研员。
McGraw 是移动代码安全性方面著名的权威人士,并且与普林斯顿的教授 Ed Felten 合作撰写了“Java Security: Hostile Applets, Holes, & Antidotes”(Wiley, 1996)以及“Securing Java: Getting down to business with mobile code”(Wiley, 1999)。McGraw 和 RST 创始人之一、首席科学家 Dr. Jeffrey Voas 一起编写了“Software Fault Injection: Inoculating Programs Against Errors”(Wiley, 1998)。McGraw 定期为一些受欢迎的商业出版物撰稿,而且其文章经常在全国出版的文章中所引用。
John Viega 是一名高级副研究员,Software Security Group 的共同创始人,并担任 Reliable Software Technologies 的高级顾问。他是 DARPA 赞助的开发标准编程语言安全性扩展的首席调研员。John 已撰写了 30 余篇涉及软件安全性和测试领域的技术性文章。他负责在主要网络和电子贸易产品中查找一些众所周知的安全性脆弱性,包括最近在 Netscape 安全性中的缺陷。他还是开放源码软件社区的重要成员,编写过 Mailman、 GNU Mailing List Manager 以及最近发布的 ITS4(一种在 C 和 C++ 代码中查找安全性脆弱性的工具)。Viega 拥有弗吉尼亚大学的计算机科学硕士学位。