生成随机128位数

时间:2013-05-10 22:16:58

标签: c#

我正在学校学习,其中一项要求是生成一个随机的128位数字。 我想知道如何在C#中执行此操作,这种方法可以工作吗?

byte[] RND128NUMBYTE = new byte[128];
Random Rand = new Random();
Rand.NextBytes(RND128NUMBYTE);

提前谢谢大家

编辑:首先,谢谢大家的回答。 无论如何,如果我清除了分配,那就更好了:我正在以安全的方式构建服务器/客户端应用程序。 用户连接到服务器后,要与连接到该服务器的其他用户进行通信,必须对其进行身份验证。用户请求auth到服务器,服务器用128位随机数回答客户端。之后,将完成其他一些过程。

4 个答案:

答案 0 :(得分:12)

数组的大小以元素形式给出。因此,对于字节数组,您需要16个元素,每个元素8位,而不是128个元素。

您可以使用System.Random.NextBytesRNGCryptoServiceProvider.GetBytes

但是System.Random.NextBytes可能不是一个好选择,因为System.Random的不良播种意味着你无法获得随机128位数的预期属性。例如,即使生成少于2 ^ 64个数字,您也很可能会发生冲突。来自良好PRNG的128位数字与GUID一样全球唯一,从System.Random得出的数字肯定不是。

byte[] bytes = new byte[16];
using(var rng = new RNGCryptoServiceProvider())
{
    rng.GetBytes(bytes);
}

答案 1 :(得分:7)

首先,您要生成128个随机字节,而不是随机位。但是你的澄清会产生重大影响:

  

我正在以安全的方式构建服务器/客户端应用程序。用户连接到服务器后,要与连接到该服务器的其他用户进行通信,必须对其进行身份验证。用户请求auth到服务器,服务器用128位随机数回答客户端。

在这种情况下你的解决方案是深刻的,非常错误的,即使你考虑到你生成八次太多位的事实。 System.Random只是伪随机,而实际上只有31位熵,当你正在播种时。 (*)为了安全起见,您需要所有128位熵。

请记住,每一个缺失的位都会使问题再次变得容易攻击;如果你需要128位熵并且你有31位,那么问题不是四次次更容易攻击。问题是2 128-31 = 10 29 次更容易攻击!

巧合的是,我刚刚写了一篇关于此的博客文章。我挑战读者,在仅给出前五张或六张牌的情况下,弄清楚我用Random洗过的一副牌的其余部分。有人在几个小时内通过蛮力找到了解决方案。 随机非常弱。。见http://ericlippert.com/2013/05/06/producing-permutations-part-seven/

如果您需要为安全系统提供加密强度随机性,那么您需要使用一个特殊用途的随机源,其中包含超过128位的熵。

因此CodeInChaos的答案是正确的。

这个故事有两个道德:

首先,这就是设计安全系统如此困难的原因。有很多细节要做,你必须正确地所有,否则系统就不安全了。

其次,请确保在问题中提供足够的信息以获得良好的答案。


(*)实际上它远不如此,因为其中一些 31 可能的种子远比其他种子更可能。

答案 2 :(得分:3)

是不是想知道作业的内容是什么?

这样做:
实施你的理论。运行很多次并存储结果。做一些关于它的统计数据,比如检查最低和最高值,知道你在限制范围内。为了额外加上每个结果,并确保它们均匀分布。

答案 3 :(得分:2)

  

要求是生成一个随机的128位数字

我认为这项任务有点过于苛刻,我希望它们的意思是pseudo-random number。我想指出你必须将问题分解成你理解的部分。

您已正确初始化PRNG并知道如何让它fill a byte array

Random Rand = new Random();
Rand.NextBytes(RND128NUMBYTE);

现在你需要随机填充128位的空格。什么是128位,.NET或C#是否为您提供对位的访问?不是直接的,但您有byte类型。这种类型使用8位,因此您只需要128/8 = 16字节。

你几乎就在那里,你只需创建一个16字节而不是128字节的数组:

byte[] RND128NUMBYTE = new byte[16];

如何将convert这些字节变成“数字”我会让你感到高兴。