「玩一玩」System.Random类在极限运算环境下重复生成随机数的对比实验

Conmajia 2012-05-24 02:46:43
加精
...全文
1170 53 打赏 收藏 转发到动态 举报
写回复
用AI写文章
53 条回复
切换为时间正序
请发表友善的回复…
发表回复
shoy160 2012-06-01
  • 打赏
  • 举报
回复
很有想象力。。
Conmajia 2012-05-31
  • 打赏
  • 举报
回复
[Quote=引用 51 楼 的回复:]

和极限不极限没关系 随机数是根据DateTime.Now.Ticks生成的 你要用不同的定义多个传进去就出不一样的数据了,你这样写在一起 一般都出一样的数据
[/Quote]

最好是贴出数据或者做法,我才好实验,只靠「一般」、「都」,这样的话不能让人信服。
hzpdh 2012-05-31
  • 打赏
  • 举报
回复
和极限不极限没关系 随机数是根据DateTime.Now.Ticks生成的 你要用不同的定义多个传进去就出不一样的数据了,你这样写在一起 一般都出一样的数据
wtorc 2012-05-31
  • 打赏
  • 举报
回复
共同进步!
Danielankang 2012-05-30
  • 打赏
  • 举报
回复
不错的分享,谢谢。
种草德鲁伊 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

引用 15 楼 的回复:

好玩,感谢分享,不过楼主的结帖率。


有个恶心的设定,不结贴不能发新帖,我本来打算保持0结贴率的
[/Quote]

CSDN确实很SB
wcxwwdwwj2 2012-05-27
  • 打赏
  • 举报
回复
有点深度,一会再研究下
haitao 2012-05-26
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 的回复:]
并没有认真看懂文章,只是想起以前做一个生成批量的随机号。用for循环,以毫秒做种子,结果全是相同的随机号。折腾不出结果,后来就改用Guid.NewId(),处理下当随机号了。
[/Quote]

种子是只需要设1次的,必须在循环外设的
Conmajia 2012-05-26
  • 打赏
  • 举报
回复
好吧,总之谢了
Conmajia 2012-05-26
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 的回复:]

conmajia
不敢帮你改帖子,点编辑,出来的框框一个字都没有,就一个标题,我怕改了就over了,csdn的问题很多
[/Quote]
bdmh 2012-05-26
  • 打赏
  • 举报
回复
conmajia
不敢帮你改帖子,点编辑,出来的框框一个字都没有,就一个标题,我怕改了就over了,csdn的问题很多
Conmajia 2012-05-26
  • 打赏
  • 举报
回复
暴力法是屡试不爽的大招,理论上无敌,只是时间问题
Conmajia 2012-05-26
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 的回复:]

引用 2 楼 的回复:
看来我写的有歧义。我贴的代码是引用的,并不是我实际使用的,那啥业务代码是我把他原来的和我这个无关的代码删了。我实际代码和你的是差不多的。


C# code

Guid guid = Guid.NewGuid();

int key1 = guid.GetHashCode();
int key2 = unchecked((int)DateTime.No……
[/Quote]

我的目的是尽量全面测试,我只恨不能测得所有组合情况,用了static岂不是和我的目的背道而驰
rularys 2012-05-26
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 的回复:]

你调用银行的接口,你能“在毫秒级内穷举到了这个32位的种子”什么意义?你穷举几次,帐号就被暂时锁死了,那么通过“穷举”来“破解”的这个概念只有唬自己,唬不了别人。
[/Quote]
你误会了。我只是举例子指出伪随机函数的这个特性而已。
"我们要是知道人家生成密钥的“算法”,我们都能去暴力模拟它" 这句话。
任何密码都能暴力穷举,不管它的生成算法是什么。问题是是能不能付出这个代价——取128位或者更长的密匙,一方面也是为了让穷举的代价变得更高。RSA 的密匙生成算法是公开的,但这并不妨碍它所使用的密匙不可破解性
  • 打赏
  • 举报
回复
你调用银行的接口,你能“在毫秒级内穷举到了这个32位的种子”什么意义?你穷举几次,帐号就被暂时锁死了,那么通过“穷举”来“破解”的这个概念只有唬自己,唬不了别人。
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 的回复:]
我就见过这样的一个加密策略:它利用伪随机函数来产生128位的临时密匙,再用这个密匙来加密明文;密匙本身再用公匙加密算法加密保存待查。在这里它就只利用了伪随机数的第二种特性。但是很遗憾,随机函数的种子的随机性没有得到重视,只是简单的用一个GetTickCount获取的一个32位值来做。结果利用这个特点,我在毫秒级内穷举到了这个32位的种子,再利用它生成的128位伪随机数破解了密文——它那128位的密匙根本是摆设。[/Quote]

你这里有个自己“设计”的前提,然后去批驳它。没有多少实际意义。我们要是知道人家生成密钥的“算法”,我们都能去暴力模拟它。你把这个叫做“密码破解”?
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
看来我写的有歧义。我贴的代码是引用的,并不是我实际使用的,那啥业务代码是我把他原来的和我这个无关的代码删了。我实际代码和你的是差不多的。


C# code

Guid guid = Guid.NewGuid();

int key1 = guid.GetHashCode();
int key2 = unchecked((int)DateTime.Now.……
[/Quote]

你的r应该定义为 static 的变量,只要在类型加载时初始化一次就够了。
rularys 2012-05-26
  • 打赏
  • 举报
回复
呵呵 楼主的对实验结果的总结还少指出一个结论:
对于只是需要伪随机数的概率分布特性的,种子不重要,随便哪个种子,伪随机数序列的分布都没什么大的不同。
但是如果是需要伪随机数的随机性来作为密码的话,其随机性或者说其不可破解性取决于种子的随机性。

一般这两个需要都是同时出现的,但也有疏忽的时候:
我就见过这样的一个加密策略:它利用伪随机函数来产生128位的临时密匙,再用这个密匙来加密明文;密匙本身再用公匙加密算法加密保存待查。在这里它就只利用了伪随机数的第二种特性。但是很遗憾,随机函数的种子的随机性没有得到重视,只是简单的用一个GetTickCount获取的一个32位值来做。结果利用这个特点,我在毫秒级内穷举到了这个32位的种子,再利用它生成的128位伪随机数破解了密文——它那128位的密匙根本是摆设。
lthaoyue 2012-05-25
  • 打赏
  • 举报
回复
分析的很详细啊
mimixi666 2012-05-25
  • 打赏
  • 举报
回复
很好很好。。不错,加油
加载更多回复(22)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧