可以使用ping伪随机选择的IP地址生成真正的随机数吗?
提出的问题是在第二年Comp Science演讲期间提出的,当时他讨论了在确定性计算设备中生成数字的可能性。
这是唯一不依赖非商品类硬件的建议。
随后,没有人会把自己的声誉摆在线上,以明确地支持或者反对它。
任何人都在支持或者反对立场。如果是这样,那么提及可能的实现方式呢?
解决方案
嗯,我发现这类问题很快引发了关于"真正随机"含义的讨论。
我认为测量ping会产生质量不错的随机位,但是速率不足以发挥很多作用(除非我们愿意进行认真的DDOS处理)。
而且我认为这不会比测量计算机的模拟/机械性能或者操作它的肉袋的行为随机得多。
(编辑)实际上,这种方法使我们可以发现网络中有人操纵"随机"数字生成器。
尽管我不能明确表示支持或者反对,但此实现存在问题。
这些IP地址是从哪里来的,如果它们是随机选择的,则当它们不答复或者延迟答复时会发生什么,这意味着随机数的显示速度会变慢。
同样,即使我们要制作一个包含100.000个结果的可视化图形并计算出数字之间没有相关性或者相关性很少,也并不意味着它确实是随机的。正如dilbert解释的那样:)
一个好的随机数生成器的一部分是所有数字的概率相等,即n->无穷大。
因此,如果我们打算生成随机字节,那么从一个良好的rng获得足够的数据,则每个字节应有相等的返回概率。此外,不应返回某些数字的模式或者可预测性(某些时间段内的概率峰值)。
我不太确定使用ping我们将要测量什么来获取随机变量,这是响应时间吗?如果是这样,我们可以确定某些响应时间或者响应时间范围会比其他响应时间更频繁,因此会导致潜在的不安全随机数生成器。
它并没有使我成为随机性的良好来源。
我们将使用哪种度量标准-显而易见的是响应时间,但是我们可以合理预期的值范围很小:几十毫秒到几千。响应时间本身将遵循钟形曲线,并且不会在任何间隔内随机分布(如何选择间隔?),因此我们必须尝试从数字中选择一些"随机"位。
LSB可能会给我们一个随机的比特流,但是我们可能不得不考虑时钟粒度问题,也许是由于中断的工作原理,在某些系统上我们总是会得到2ms的倍数。
获取随机位可能有更好的"有趣"方式-可能是用google搜索一个随机单词,抓住第一页,然后从页面中选择第N位。
它不如使用大气噪声好,但仍是真正随机的,因为它取决于网络的特性,该特性以随机的不可重复行为而臭名昭著。
有关随机性的更多信息,请参见Random.org。
这是一个实现的尝试:
@ips : list = getIpAddresses(); @rnd = PseudorandomNumberGenerator(0 to (ips.count - 1)); @getTrueRandomNumber() { ping(ips[rnd.nextNumber()]).averageTime }
我想你可以。需要注意的几件事:
<UL>
- 即使对随机IP地址执行ping操作,每个数据包的前几跳(从我们到ISP网络中的第一台真正的L3路由器)也将是相同的。即使我们在第一个存在点中对数据中心中的内容执行ping操作,这也会为往返时间设置一个下限。因此,我们必须注意时序的标准化,往返行程有一个下限。
- 我们还必须注意网络中的流量整形。路由器中的典型泄漏存储区实现方式每M微秒释放N个字节,从而有效地将计时扰动到特定的时隙中,而不是连续的时间范围内。因此,我们可能需要丢弃时间戳的低位。
但是,我不同意这样的前提,即商品硬件中没有很好的熵源。过去几年中,许多x86芯片组都包含随机数生成器。我熟悉的传感器使用相对敏感的ADC来测量芯片上两个不同位置的温度,并将其相减。可以显示(通过卡方分析)该温差的低阶位是高度随机的。当我们增加系统上的处理负荷时,整体温度会升高,但是管芯两个区域之间的差异仍然不相关且不可预测。
测量某种东西以生成随机种子的方法似乎是一种很好的方法。 O'Reilly的《实用Unix和Internet安全》一书提供了一些类似的确定随机种子的其他方法,例如要求用户键入几次击键,然后测量两次击键之间的时间。 (这本书指出,PGP使用此技术作为其随机性的来源。)
我想知道系统CPU的当前温度(测量到许多小数位)是否可能是随机种子的可行组成部分。这种方法的优点是不需要访问网络(因此,当网络连接断开时,随机生成器将不会变得不可用)。
但是,CPU的内部传感器可能不太可能准确地将CPU温度测量到足够的小数位,以使该值真正适合作为随机数种子。至少不是问题中提到的"商品级硬件"!
我将代表加入行列(每次downvote至少要获得2分)。
不。
我们网络上的恶意计算机可能使用ARP欺骗(或者许多其他技术)来拦截ping,并在一定时间后对其进行回复。这样,他们不仅会知道随机数是什么,还可以控制它们。
当然,仍然存在本地网络的确定性问题,因此它可能不像实际操作那么简单。但是,由于我们无法从ping互联网上的随机IP中获得任何好处,因此我们也可能会从以太网流量中吸取熵。
从机器上连接的设备中提取熵是一个经过充分研究的原理,各种设备和测量方法的优缺点可以例如是。从/ dev / random的执行中被盗。
[编辑:作为一般原则,在安全性的基础上工作时(并且大量实际随机数据的唯一实际需求与安全性相关),我们必须假设资源丰富,坚定的攻击者将在他们的工作中做一切破坏系统的力量。
为了实现实际的安全性,我们可以假设没有人急切地希望使用PGP密钥,并在安全性与成本之间进行权衡取舍。但是,在发明算法和技术时,我们需要为它们提供可能遇到的最强大的安全保证。由于我可以相信某个人可能在某处可能非常想要其他人的私钥来构建此套件以击败建议,因此我不能接受它是当前最佳实践的进步。 AFAIK / dev / random遵循最佳实践,可以在廉价的家用PC上生成真正的随机数据。
[另一个编辑:它在评论中建议(1)任何TRNG都可能影响物理过程,并且(2)无论如何这里都没有涉及安全问题。
(1)的答案是,在任何实际的硬件上,比ping响应时间做得好得多,并且更快地收集更多的熵是可能的,因此该建议不是解决方案。用CS术语来说,显然我们不能在确定性机器上生成随机数,这正是引发此问题的原因。但是从CS的角度来看,具有任何外部输入流的机器从定义上来说是不确定的,因此,如果我们谈论的是ping,那么我们就不是在谈论确定性的机器。因此,有必要查看真实机器具有的真实输入,并将其视为随机性的来源。不管机器是什么,原始ping时间在可用的来源列表中都不算高,因此可以在担心更好的来源之前就将它们排除在外。与不破坏我们自己的硬件相比,假设网络没有被破坏是一个更大(也是不必要的)的假设。
(2)的答案是哲学上的。如果我们不介意随机数具有可以一时兴起而不是偶然选择的属性,那么此建议是可以的。但这不是我对"随机"一词的理解。仅仅因为某些东西不一致并不意味着它一定是随机的。
最后,要根据请求解决提案的实现细节:假设我们接受ping时间是随机的,则仍然不能将未处理的ping时间用作RNG输出。我们不知道它们的概率分布,而且它们肯定不是均匀分布的(通常这是人们从RNG中想要的)。
因此,我们需要确定我们愿意依靠每个ping多少熵。熵是随机变量的精确定义的数学属性,可以合理地认为它是对"随机"实际程度的度量。在实践中,我们会找到自己满意的下限。然后将多个输入哈希在一起,并将其转换为小于或者等于输入的总依赖熵的输出位数。 "总计"并不一定意味着总和:如果输入在统计上是独立的,则它是总和,但是ping不太可能是这种情况,因此熵估计值的一部分将用于考虑相关性。这种哈希运算的复杂的大姐姐被称为"熵收集器",所有好的OS都有一个。
但是,如果我们使用数据为PRNG设置种子,并且PRNG可以使用任意大的种子输入,那么我们就不必进行哈希处理,因为它将为我们完成此操作。如果我们想知道种子值的"随机性"是多少,我们可以使用世界上最好的PRNG,但是它的熵仍然受到种子熵的限制。]
随机数太重要了,不要碰运气。
或者外部影响/操纵。
在我看来,真正的随机性是无法言喻的,无法知道序列是否是随机的,因为根据定义,无论多么不可能,序列都可以包含任何东西。保证特定的分配模式可减少随机性。 "模式"一词有点像是赠品。
I MADE U A RANDOM NUMBER BUT I EATED IT
简短答案
单独使用ping时序数据并不是真正随机的,但是可以将其用作熵的来源,然后可以将其用于生成真正的随机数据。
较长的版本
ping时间的随机性如何?
就其本身而言,来自网络操作(例如ping)的计时数据将不会均匀分布。 (而且选择随机主机的想法实际上是不可行的,许多主机根本不会响应,并且主机之间的差异可能很大,响应时间范围之间存在差距,这取决于卫星连接)。
但是,尽管时序分布不均,但数据中会存在一定程度的随机性。或者换句话说,存在一定程度的信息熵。将定时数据馈入随机数生成器进行播种是一个好主意。那么,熵的水平是多少?
对于说大约50ms的网络时序数据(测量到最接近的0.1ms),并且值的传播范围为2ms,我们将拥有大约20个值。四舍五入到最接近的2的幂(16 = 2 ^ 4),每个定时值都有4位熵。如果它适用于任何类型的安全应用程序(例如生成加密密钥),那么我会很保守地说,每次读取它只有2或者3位熵。 (请注意,我在这里做了一个非常粗略的估计,而忽略了攻击的可能性)。
如何生成真正的随机数据
对于真正的随机数,我们需要将数据发送到按照/ dev / random设计的东西中,以收集熵,并将其分布在数据存储中(使用某种哈希函数,通常是安全的哈希函数)。同时,熵估计增加。因此,对于128位AES密钥,在熵池具有足够的熵之前,将需要64个ping定时。
为了更强大,可以从键盘和鼠标的使用情况,硬盘响应时间,主板传感器数据(例如温度)等中添加计时数据。这会增加熵收集的速度,并使攻击者难以监视所有来源的熵。的确,这就是现代系统所做的。这篇文章的第二条评论列出了MS Windows熵源的完整列表。
更多阅读
为了讨论对随机数生成器的(计算机安全性)攻击以及加密安全的随机数生成器的设计,我们可能做得比阅读Bruce Schneier和John Kelsey的yarrow论文还要糟糕。 (Yarrow由BSD和Mac OS X系统使用)。
我见过的商品硬件上最好的随机性来源是一个人,他从摄像头上取下了滤镜或者其他东西,将不透明的胶水粘在镜头上,然后能够轻易地从撞击CCD的宇宙射线中检测出单个白色像素。它们尽可能接近完全随机,并受到量子效应的保护,免受外部监听。
在信任往返ping作为熵之前,我会尽快使用ISAAC之类的功能来增强PRNG。正如其他人所说,某人不仅容易猜测数字,而且还可能在不同程度上控制它们,这太容易了。
存在其他重要的熵源,其他人已经提到过。没有提到的(可能不切实际的)是从车载音频设备上采样噪音。.即使没有连接麦克风,通常也会有点吵。
我进行了9轮尝试,尝试为正在编写的客户端/服务器RPC机制提供强大(快速)的PRNG。双方都有一个相同的密钥,该密钥由1024行的32个字符的密码组成。客户端将发送AUTH xx,服务器将返回AUTH yy ..并且双方都知道要使用哪两行密钥来生成河豚秘密(+盐)。然后,服务器将发送整个密钥的SHA-256摘要(已加密),客户端知道它正在与具有正确密钥的对象进行对话..会话继续。是的,对中间人的保护非常薄弱,但是对于如何使用该设备却没有公钥。
因此,我们有一台非阻塞服务器,该服务器必须处理多达256个连接.. PRNG不仅要强大,而且必须要快。使用较慢的方法来收集客户端中的熵并不是一件困难的事,但这在服务器中是无法承受的。
所以,我不得不问你的想法..这有多实用?
随机性不是二进制属性-它是介于0和1之间的值,它描述预测流中的下一个值有多困难。
问"如果我基于ping值,我的值会有多大的随机性?"实际上是在问" ping随机性如何?"。我们可以通过收集足够多的数据集(例如100万ping)并及时映射其分布曲线和行为来进行估算。如果分布是平坦的并且行为难以预测,则数据似乎更加随机。较坎bump的分布或者可预测的行为表明较低的随机性。
我们还应该考虑样品分辨率。我可以想象结果会以某种方式四舍五入到毫秒,因此使用ping时,我们可以将整数值设置为0到500。这不是很多分辨率。
从实际的角度来看,我建议不要这样做,因为可以预测和操纵ping,从而进一步降低了随机性。
通常,我建议不要"滚动自己的"随机性生成器,加密方法和哈希算法。看起来很有趣,但实际上它是很多令人生畏的数学。
关于如何构建一个真正好的熵生成器-我认为可能必须是一个密封的盒子,该盒子可以输出某种原子或者亚原子相互作用的结果。我的意思是,如果我们使用的是敌人也可以轻松阅读的熵源,那么他只需要找出算法即可。任何形式的连接都是可能的攻击手段,因此我们应将熵源尽可能靠近消耗它的服务。
不。
拔下网络电缆(或者/etc/init.d/networking stop
),熵基本上降为零。
在其ping的计算机上执行"拒绝服务"攻击,我们还可以获得可预测的结果(ping超时值)
没有数学计算可以得出随机结果,但是在"现实世界"中,计算机不仅仅只是处理数字...借助一点点创造力,应该可以产生没有已知方法的随机结果复制或者预测确切的结果。
我见过的最容易实现的想法(在所有系统上都可以普遍使用)是使用计算机声卡线路输入/麦克风端口中的静态信号。
其他想法包括热噪声和高速缓存线的低电平定时。许多带有TPM芯片的现代PC都已经内置了加密质量的硬件随机数生成器。
我对ping(如果使用ICMP的话)的膝盖反应是欺骗太过分了。到那时,我们不妨拨出一个计数器,并使用背景辐射作为随机辐射源。
是的,这是可能的,但是……细节中有魔鬼。
如果要生成32位整数,则需要收集> 32位的熵(并使用足够的混合函数来使该熵散布,但这是已知且可行的)。最大的问题是:
ping时间有多少熵?
该问题的答案取决于有关网络和攻击模型的各种假设,并且在不同情况下会有不同的答案。
如果攻击者能够完全控制ping的时间,则每次ping都会获得0比特的熵,并且无论混合多少,我们都无法获得总共32比特的熵。如果他们对ping时间的控制不够完美,我们将获得一些熵,并且(如果我们没有高估收集的熵的数量)将获得完全随机的32位数字。
我们可以使用XKCD方法:
我得到了一些使用traceroute创建随机数的代码。我也有一个使用ping来执行此操作的程序。一年多以前,我在一个班级项目中做到了这一点。它所做的全部工作就是在地址上运行traceroute并进行寻址,它花费的毫秒数最少。它在获取随机数方面效果很好,但我真的不知道它与真正的随机数有多接近。
这是我运行时得到的8个数字的列表。
455298558263758292242406192 506117668905625112192115962 805206848215780261837105742 095116658289968138760389050 465024754117025737211084163 995116659108459780006127281 814216734206691405380713492 124216749135482109975241865
#include <iostream> #include <string> #include <stdio.h> #include <cstdio> #include <stdlib.h> #include <vector> #include <fstream> using namespace std; int main() { system("traceroute -w 5 www.google.com >> trace.txt"); string fname = "trace.txt"; ifstream in; string temp; vector<string> tracer; vector<string> numbers; in.open(fname.c_str()); while(in>>temp) tracer.push_back(temp); system("rm trace.txt"); unsigned index = 0; string a = "ms"; while(index<tracer.size()) { if(tracer[index]== a) numbers.push_back(tracer[index-1]); ++index; } std::string rand; for(unsigned i = 0 ; i < numbers.size() ; ++i) { std::string temp = numbers[i]; int index = temp.size(); rand += temp[index - 1]; } cout<<rand<<endl; return 0; }
很简单,因为网络遵守规定的规则,所以结果不是随机的。
网络摄像头的想法听起来(合理)。 Linux人们经常建议简单地使用没有麦克风的声卡发出的随机噪声。
如果我们要使用商品硬件,则声卡应该几乎可以做到。只需调高模拟输入的音量,便可以得到便宜的白噪声源。廉价的随机性,无需网络。
YouTube展示了正在使用的设备:http://www.youtube.com/watch?v=7n8LNxGbZbs
随机是,如果没人能预测下一个状态。
这是我的建议:
1选择一小部分网站,它们离位置越远越好。例如如果我们在美国,请尝试一些在马来西亚,中国,俄罗斯,印度等国家拥有服务器IP的网站。高流量的服务器更好。
2在国家/地区,互联网流量很高时(在我的国家,例如晚上7点至晚上11点),对这些网站进行多次很多次ping,获取每个ping结果(仅使用整数值)并计算其模数2 ping操作,我们会得到一位:0或者1)。
3重复该过程几天,记录结果。
4收集从所有ping中获得的所有位(可能我们将获得数十万个位),然后从中选择位。 (也许我们想通过使用上述相同方法中的一些数据来选择自己的位:))
注意:在代码中,我们应该检查超时..etc