可能一个真正随机的数量可产生使用坪以伪随机选择的IP地址吗?

StackOverflow https://stackoverflow.com/questions/137340

  •  02-07-2019
  •  | 
  •  

提出的问题来了约在2年Comp科学讲座的同时,讨论无法产生数字在一个确定性的计算设备。

这是唯一的建议这不是依赖非商品类的硬件。

随后没有人会投他们的声誉在线争辩的明确支持或反对它。

任何人照顾,使一个独立或反对。如果是这样,怎么样提及作为一种可能的执行?

有帮助吗?

解决方案

没有

网络上的恶意计算机可能会使用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计时数据本身并不是真正随机的,但它可以用作的来源。熵,然后可用于生成真正的随机数据。

更长的版本

ping时间有多随机?

本身,来自网络操作(例如ping)的定时数据不会均匀分布。 (而选择随机主机的想法并不实际 - 许多人根本不会做出回应,主机之间的差异可能很大,响应时间范围之间存在差距 - 想想卫星连接。)

然而,虽然时间分布不均匀,但数据中会有一定程度的随机性。或者换句话说,信息熵的级别存在。将定时数据提供给随机数生成器以播种它是一个好主意。那么存在什么级别的熵?

对于大约50ms的网络定时数据,测量到最接近的0.1ms,扩展值为2ms,您有大约20个值。向下舍入到最接近的2的幂(16 = 2 ^ 4),每个定时值有4位熵。如果它适用于任何类型的安全应用程序(例如生成加密密钥),那么我会保守并且说每次读取只有2或3位熵。 (请注意,我在这里做了一个非常粗略的估计,并忽略了攻击的可能性。)

如何生成真正的随机数据

对于真正的随机数,您需要将数据发送到按照的设计方式设计的内容。 / dev / random 将收集熵,将其分发到数据存储中(使用某种哈希函数,通常是安全的)。同时,增加了熵估计。因此,对于128位AES密钥,在熵池具有足够的熵之前将需要64个ping定时。

为了更加强大,您可以添加键盘和鼠标使用时间数据,硬盘响应时间,主板传感器数据(例如温度)等。它会增加熵收集率并使攻击者难以接受监控所有熵源。事实上,这就是现代系统所做的。 MS Windows熵源的完整列表列在中这篇文章的第二条评论

更多阅读

关于对随机数生成器的(计算机安全)攻击以及加密安全随机数生成器的设计的讨论,你可能会比阅读 yarrow paper by Bruce Schneier 和约翰凯尔西。 (Yarrow由BSD和Mac OS X系统使用)。

没有

拔下网线(或 /etc/init.d/networking stop ),熵基本上降为零。

在正在ping的计算机上执行拒绝服务攻击,您还可以获得可预测的结果(ping超时值)

我猜你可以。一对夫妇的事情看出:

  • 即便侦测的随机的IP地址,则第一个几跳(从你第一个真正的L3路由器在ISP网络)将同每一个分组。这一下限上往返时间,甚至如果你平安东西在一个数据中心在这一点的存在。所以你必须要小心正常化的时机,有一个下限上往返。
  • 你也想要小心有关的交通成形中的网络。一个典型的漏斗执行一个路由器稿N字节每M微秒,从而有效地影响了地球的时间到具体的时隙而不是连续的范围的时间。所以,你可能需要放弃的低单位的您的时间戳。

但是我不同意的前提下,有不良好来源的熵在初级商品的硬件。许多x86的芯片组在过去的几年中已经包括随机数发生器。那些我所熟悉的使用比较敏感的Adc来测量温度在两个不同的位置上的死亡,并减去他们。低单位的这种温度的差异可以显示(通过卡方分析)强烈随机的。为增加处理上的负载系统的总体温就会上升,但差两个区域之间的死亡仍然是不相关和不可预测。

我见过的商品硬件随机性的最佳来源是一个从他的网络摄像头上移除过滤器或其他东西的人,在镜头上涂上不透明的胶水,然后能够轻松地检测出来自宇宙射线的单个白色像素CCD。它们尽可能接近完全随机,并通过量子效应保护免受外部窥探。

好的随机数生成器的一部分是所有数的相等概率为n - >无穷大。

因此,如果您计划生成随机字节,那么使用来自良好rng的足够数据,每个字节应具有相同的返回概率。此外,某些数字的返回应该没有模式或预测(在某些时间段内出现概率高峰)。

我不太确定使用ping你要测量什么来获得随机变量,它是响应时间吗?如果是这样,您可以非常肯定某些响应时间或响应时间范围将比其他响应时间更频繁,因此会产生一个潜在不安全的随机数生成器。

如果你想要商品硬件,你的声卡就应该这么做了。只需调高模拟输入的音量,即可获得廉价的白噪声源。廉价的随机性,无需网络。

测量某物以生成随机种子的方法似乎是一个非常好的方法。 O'Reilly的书籍实用的Unix和互联网安全给出了几乎没有类似的确定随机种子的附加方法,例如要求用户键入几次击键,然后测量击键之间的时间。 (该书指出,PGP使用这种技术作为其随机性的来源。)

我想知道系统CPU的当前温度(测量到多个小数位)可能是随机种子的可行组件。这种方法的优点是不需要访问网络(因此当网络连接断开时,随机生成器不会变得不可用)。

然而,CPU的内部传感器可能不太可能准确地将CPU温度测量到足够的小数位,以使该值真正可行作为随机数种子;至少,不是“商品级硬件”,而不是“商品级硬件”。正如问题所述!

它不如使用大气噪音那么好,但它仍然是真正随机的,因为它取决于网络的特征,这是随机不可重复的行为而臭名昭着。

有关随机性的更多信息,请参见 Random.org

以下是对实施的尝试:

@ips  : list = getIpAddresses();
@rnd         = PseudorandomNumberGenerator(0 to (ips.count - 1));

@getTrueRandomNumber() { ping(ips[rnd.nextNumber()]).averageTime }

在信任往返之前,我会尽快使用像 ISAAC 之类的东西作为更强大的PRNG ping为熵。正如其他人所说的那样,对于某人来说,不仅可以猜测你的数字,而且还可能在不同程度上控制它们,这太容易了。

其他人提到的其他重要的熵来源。未提及的(可能不实用)是从板载音频设备采样噪声..即使没有连接麦克风,通常会有点嘈杂。

我试图为我正在编写的客户端/服务器RPC机制提供强大(快速)的PRNG,进行了9轮。双方都有一个相同的密钥,由1024行32个字符密码组成。客户端将发送AUTH xx,服务器将返回AUTH yy ..并且双方都知道密钥的哪两行用于产生河豚秘密(+ salt)。然后,服务器将发送整个密钥(加密)的SHA-256摘要,客户端知道它正在与具有正确密钥的内容进行通信。会话继续。是的,对于中间人的保护非常弱,但公钥不可用于设备的使用方式。

所以,你有一个非阻塞服务器,必须处理多达256个连接..不仅PRNG必须是强大的,它必须是快速的。使用较慢的方法在客户端中收集熵并不是一件困难的事情,但在服务器中无法提供。

所以,我不得不询问你的想法......它有多实用?

没有数学计算可以产生随机结果,但是在“真实世界”中。计算机并不只是简单地处理数字......只要有一点创造力,就应该有可能产生随机结果,而没有已知的方法可以复制或预测确切的结果。

我见过的最容易实现的想法之一是在所有系统上普遍使用的是使用静态来自计算机声卡线/麦克风端口。

其他想法包括热噪声和高速缓存行的低级别定时。许多带有TPM芯片的现代PC都具有加密质量的硬件随机数发生器。

我对ping的反应(特别是如果使用ICMP)就是你的作弊太过分了。此时你也可以掏出一个giger计数器并使用背景辐射作为随机源。

是的,这是可能的,但......细节中的魔鬼。

如果你要生成一个32位整数,你需要收集> 32位熵(并使用足够的混合函数来使熵传播,但这是已知的和可行的)。最大的问题是:

ping时间有多少熵?

这个问题的答案取决于对网络和攻击模型的各种假设,并且在不同情况下有不同的答案。

如果攻击者能够完全控制ping时间,那么每次ping就会得到0位熵,无论你混合多少,你都不可能总共得到32位熵。如果他们对ping时间的控制不够完美,你会获得一些熵,并且(如果你不高估你正在收集的熵数量)将获得完全随机的32位数字。

YouTube会显示正在运行的设备: http://www.youtube.com/watch? v = 7n8LNxGbZbs

随机是,如果没人能预测下一个状态。

虽然我无法明确地支持或反对,但这种实施方式存在问题。

这些IP地址来自何处,如果它们是随机选择的,当它们没有回复或迟到回复时会发生什么,这是否意味着随机数会更慢出现。

此外,即使您制作了100.000结果的可视图表并计算出数字之间没有或几乎没有相关性,并不意味着它是真正随机的。正如 dilbert 所解释的那样:)

它不会让我成为随机性的良好来源。

你会使用什么指标 - 显而易见的是响应时间,但你可以合理预期的值范围很小:几十毫秒到几千。响应时间本身将遵循钟形曲线而不是随机分布在任何间隔(您将如何选择间隔?),因此您必须尝试从数字中选择一些“随机”位。

LSB可能会为您提供一个随机位流,但您必须考虑时钟粒度问题 - 可能由于中断的工作方式,您在某些系统上总是会得到2ms的倍数。

可能有更好的'有趣'的方法来获取随机位 - 也许google是一个随机的单词,抓住第一页并从页面中选择第N位。

呃,我发现这类问题很快引发了对“真正随机”意义的讨论。

我认为测量ping会产生质量合理的随机位,但是速度不够大(除非你愿意做一些严重的DDOS)。

我并不认为它会比测量计算机的模拟/机械特性或操作它的肉袋的行为更随意。

(编辑)从实际角度来看,这种方法可以让您的网络中有人操纵您的“随机”数字生成器。

在我看来,真正的随机性是不可言说的 - 无法知道序列是否是随机的,因为根据定义,无论多么不可能,它都可以包含任何。保证特定的分布模式减少随机性。单词“pattern”是一个赠品。

    I MADE U A RANDOM NUMBER
           BUT I EATED IT

随机性不是二元属性 - 它是介于0和1之间的值,用于描述预测流中下一个值的难度。

询问“如果我以ping为基础,我的价值观会有多随机?”实际上是在问“ping是多么随机?”。您可以通过收集足够大的数据集(例如1百万ping)并及时映射其分布曲线和行为来估计。如果分布平坦且行为难以预测,则数据似乎更随机。更崎岖的分布或可预测的行为表明随机性较低。

您还应该考虑样本分辨率。我可以想象结果以某种方式舍入到一个毫秒,所以使用ping你可以有0到500之间的整数值。这不是很多分辨率。

在实践方面,我建议不要这样做,因为可以预测和操纵ping,进一步降低其随机性。

一般来说,我建议不要“滚动自己”。随机生成器,加密方法和散列算法。看起来很有趣,它主要是很多非常令人生畏的数学。

至于如何建立一个非常好的熵发生器 - 我认为这可能必须是一个密封的盒子,它在原子或亚原子级别上输出某种相互作用的结果。我的意思是,如果你正在使用敌人可以轻易读取的熵源,他只需要找出你的算法。任何形式的连接都是可能的攻击向量,因此您应该将熵源尽可能靠近尽可能消耗它的服务。

您可以使用XKCD方法:

我得到了一些使用traceroute创建随机数的代码。我也有一个使用ping的程序。一年多前我做了一个班级项目。它所做的只是运行traceroute on和address,它需要ms时间的最小sig数字。它可以很好地获取随机数,但我真的不知道它与真正的随机数有多接近。

这是我运行时收到的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人员通常建议只使用没有连接麦克风的声卡中的随机噪声。

这是我的建议:

1-选择尽可能远离您所在位置的网站。例如如果你在美国尝试一些在马来西亚,中国,俄罗斯,印度等地拥有服务器IP的网站。高流量的服务器更好。

2-在您所在国家的高互联网流量时期(在我的国家,如下午7点到11点)ping那些网站很多次,取每个ping结果(仅使用整数值)并计算模数2它(即从每个ping操作得到一位:0或1)。

3-重复该过程数天,记录结果。

4-收集你所有ping中的所有比特(可能你会获得数十万比特)并从中选择你的比特。 (也许你想通过使用上面提到的相同方法中的一些数据来选择你的位:))

小心:在你的代码中你应该检查超时..etc

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top