随机数产生的算法(200分)

  • 主题发起人 主题发起人 yoller
  • 开始时间 开始时间
Y

yoller

Unregistered / Unconfirmed
GUEST, unregistred user!
许多加密算法都需要随机数,因此随机数的算法将直接影响
加密的程度。
于是,我想寻找一种好的随机数产生的算法,在人才济济的
大富翁上,我想是可以成功找到的。
如果满意的话,我还会再加分的,谢谢。
 
注: 我要的只是算法,与Delphi的各种函数没有任何关联,
希望大家能够理解。
 
0到1之间均匀分布的一个随机数
设 m = 2^16,则产生0到1之间均匀分布的随机数计算公式如下:
Ri = mod(2053 *(Ri-1) + 13849,m);
RNDi = Ri/m
R 为随机数的种子。
 
function Random [ ( Range: Integer) ];
 
真正的随机数不容易得到,
xiao.lit提供的方法得到的只是一个伪随机数。
 
也只能得到伪随机数了,不过应该够用了啊
 
procedure Randomize;
var
systemTime :
record
wYear : Word;
wMonth : Word;
wDayOfWeek : Word;
wDay : Word;
wHour : Word;
wMinute : Word;
wSecond : Word;
wMilliSeconds: Word;
reserved : array [0..7] of char;
end;
asm
LEA EAX,systemTime
PUSH EAX
CALL GetSystemTime
MOVZX EAX,systemTime.wHour
IMUL EAX,60
ADD AX,systemTime.wMinute { sum = hours * 60 + minutes }
IMUL EAX,60
XOR EDX,EDX
MOV DX,systemTime.wSecond
ADD EAX,EDX { sum = sum * 60 + seconds }
IMUL EAX,1000
MOV DX,systemTime.wMilliSeconds
ADD EAX,EDX { sum = sum * 1000 + milliseconds }
MOV RandSeed,EAX
end;
 
伪随机数的方法是非常实用的,如果不对硬件编程的话,也不使用RANDOM函数,
这种方法是最好不过了.
 
好难的问题。
据说每个版本的netscape用的安全连接中的加密算法也是用事件相关随机,但居然本人很简单
破了。原因很简单,年月日可取范围很小,基本等于不随机,就算到毫秒,也只有1000个。
依照现在计算机的计算速度,这种随机是很容易被穷尽的。
至于上面的伪随机数,被别人知道算法,简直就一点用也没用。要知道你的算法,基本
只要会反汇编的都可以找出来。
 
改正错别字:
好难的问题。
据说某个版本的netscape用的安全连接中的加密算法也是用时间相关随机,但居然被人很简单
破了。原因很简单,年月日可取范围很小,基本等于不随机,就算到毫秒,也只有1000个。
依照现在计算机的计算速度,这种随机是很容易被穷尽的。
至于上面的伪随机数,被别人知道算法,简直就一点用也没用。要知道你的算法,基本
只要会反汇编的都可以找出来。
 
我看到一份产生随即数的资料,具体的做法我忘了,但大体如下:

把日期时间+毫秒数进行一系列运算最后用sin()来一下,就产生了0到1之间的随即数了。
 
用随机的指针指向随机的地址,
反正读一个随机的地址中的值,
再和时间一起计算计算,
应该能得到一个怪怪的数值
 
关注!
给我1分够了。
 
要加密的话,为什么不用两个大素数相乘的办法呢?这样简单又可行.
比如你先编程产生两个够大的素数,然后相乘.在解密时判断密钥是否这个和数的因子就行
了.
至于随机数,算法过程是不可能产生随机数的.(凡是图灵机算出来的数都不可能时随机数)
但是,比如说Pi,他的序列比一般的伪随机过程丰富多了,只要你取足够靠后的位就行了.
 
如果谁有好的算法也给我一份!
tianrei@21cn.com
 
我是第一次上大户翁的,这里的文章很精彩!谢谢!
 
取Cpuid和硬盘卷标作种子,效果比日期好...
 
由时间和cpuid等作种子的并不是很"安全"的随机数.
随机数的产生是有工业标准的,尤其是用在加密领域
在RFC里面是有的,不过哪个号码的RFC你要自己找了,算法好像也有一些
的,
 
可以考虑pgp的做法,让用户敲几个键和移动鼠标来取得随机数,根据敲键盘和移动鼠标的速度、位置等取,应该比较好。
 
后退
顶部