`

两种常见的伪随机数算法

 
阅读更多
         在密码技术中,随机序列是非常重要的,比如密钥产生、数字签名、身份认证和众多的密码学协议等都要用到随机序列。所以产生高质量的随机数序列对信息的安全性具有十分重要的作用。随机数分为真随机数和伪随机数,计算机通过算法产生的随机数并不上真正意义上的随机数,很容易被破解,只能称为伪随机数。若要产生真正的随机数,必须通过硬件来实现,比如使用离子辐射事件的脉冲检测器、气体放电管和带泄露的电容等,但是为每台计算机配备这样的装置上不可能。下面将两种常见的随机算法:线性同余和RSA算法。
         1、线性同余
          Ni+1=(A*Ni+B)mod M 其中i=0,1,…,M-1

 

         要求:B,M互为质数;M的所有质因子的积能整除A-1;若M是4的倍数A-1也是;A,B,N0都比M小;A,B是正整数(根据此公式可以递推出随机数,有兴趣的可以推倒一下)
         因此,取A=7^5;B=0;M=2^31-1; N0为系统时间;满足B=0,M=2^31-1互为质数;M=2^31-1的所有质因子的积能整除A-1=7^5-1;若M是4的倍数A-1也是;A,B,N0都比M小;A,B是正整数。
         实现:
package org.mino.random;

/**
 * @author DingJie
 * @date 2014-5-1
 * @email dingjie_nlp@126.com
 */
public class LineRmainderRandom {

	private static long initSeed = System.currentTimeMillis();  
	/**
	 * @param args
	 */
	public static void main(String[] args) {
	    for (int i = 0; i < 100; i++)  
	    {  
	        getRand ();  
	    } 
	}
	private static void getRand ()  
	{  
	    initSeed = (initSeed * 16807L) % ((1 << 31) - 1);  
	    System.out.println(initSeed);
	}  

}
 其实java.util.Random类中使用的就是线性同余方法:
    protected int next(int bits) {
        long oldseed, nextseed;
        AtomicLong seed = this.seed;
        do {
	    oldseed = seed.get();
	    nextseed = (oldseed * multiplier + addend) & mask;
        } while (!seed.compareAndSet(oldseed, nextseed));
        return (int)(nextseed >>> (48 - bits));
    }
 2、RSA伪随机数方法
            RSA是依据依旧是一个满足一定条件的数学公式
       设A从2~(N-1) C=(A EXP D) mod N满足如下条件:D是素数,N是两个素数(P,Q)之积, (D * E) mod ((P-1) * (Q-1))=1 因为:若 C=(A EXP D)mod N 有:A=(C EXP E) mod N 所以,C与A 一一对应;设N=15,P=5,Q=3则A为2到14的数。现在要产生2到14的伪随机数。取D为3,E为3,

 

     C2=(2EXP3)mod15 = 8,  

  C3=(3EXP3)mod 15 = 12,
  C4  = (4EXP3)mod 15= 4,
  C5  = (5EXP3)mod 15= 5,
  C6  = (6EXP3)mod 15= 6,
  C7  = (7EXP3)mod 15= 13,
  C8  = (8EXP3)mod 15= 2,
     C9  = (9EXP3)mod 15= 9,
  C10  = (10EXP3)mod 15= 10,
  C11  = (11EXP3)mod 15= 11,
  C12  = (12EXP3)mod 15= 3,
  C13  = (13EXP3)mod 15= 7,
  C14  = (14EXP3)mod 15= 14

           
 
 
分享到:
评论

相关推荐

    超素数法长周期伪随机数发生器的应用算法 (2003年)

    结合素数性质以及算法技巧,给出一种优选乘子的超素数伪随机数法和一种更长周期的伪随机数生成方法,这两种方法都有更理想的统计性能。超素数方法的周期是M-1,而长周期方法的周期为M(M-1)。统计结果表明,新方法...

    十种内部排序的算法比较

    其中的数据要用伪随机数产生器产生;至少要用5组不同的输入数据做比较;比较的指标为关键字参加的比较次数和关键字的移动次数(关键字交换为3次移动)。 (3) 针对不同的输入表长做试验,观测检查两个指标相对表长的...

    数据结构内部排序算法比较.doc

    (2)待排序表的表长不小于1005其中的数据要用伪随机数产生程序产生:至少要用5组不同的输入数据作比较:比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)。 (3)最后要对结果作出简单...

    Python random库使用方法及异常处理方案

    –伪随机数:计算机中通过采用梅森旋转算法生成的(伪)随机序列元素 python中用于生成伪随机数的函数库是random 因为是标准库,使用时候只需要importrandom random库的常用函数: random库的引用方法与math库...

    算法导论(part1)

    算法是用英语和一种“伪代码”来描述的,任何有一点程序设计经验的人都能看得懂。书中给出了230多幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书中的所有算法,都给出了关于其运行时间...

    九种排序算法

    其中数据要用伪随机数产生程序产生;至少要用5组不同的输入数据作比较;比较的指标有关键字参加的比较次数和关键字的移动次数。(关键字交换计为3次移动) (3)最后要对结果作出简单的分析,包括对各组数据得出...

    算法导论(part2)

    算法是用英语和一种“伪代码”来描述的,任何有一点程序设计经验的人都能看得懂。书中给出了230多幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书中的所有算法,都给出了关于其运行时间...

    Mersenne Twister随机数产生

    利用Mersenne Twister算法产生随机数,并测试和分析了其随机性。 程序中还加入了界面显示。 各个文件为: initGenerator.m: initGenerator函数,用于初始化随机序列的长度和值 generateNum.m: generateNum函数,当...

    冒泡,快速排序的比较

    其中的数据要用伪随机数产生程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)。 (2)最后要对结果作出简单分析,包括对各组数据得出...

    C# salt+hash 加密

    1、伪随机数:pseudo-random number generators ,简称为:PRNGs,是计算机利用一定的算法来产生的。伪随机数并不是假随机数,这里的“伪”是有规律的意思,就 是计算机产生的伪随机数既是随机的又是有规律的。怎样...

    利用密码技术或者专门的随机数产生算法产生随机数,并对产生的随机数进行统计分析

    (一)本次实验使用了两种方法生成随机数,分别如下: 1、使用RC4算法产生随机数: 原理:RC4算法的原理很简单,包括初始化算法和伪随机子密码生成算法两大部分。在初始化的过程中,密钥的主要功能是将S-box搅乱,i...

    Rsa编程代码

    1. LibTomCrypt是一个包含主要的加密函数,Hash函数,伪随机数生成器, 公钥加密函数等密码算法的函数库,RSA编程实验中,使用的主要函数是rsa_make_key,rsa_encrypt_key, rsa_encrypt_key_ex ,rsa_decrypt_key,rsa...

    单片机随机数字课程设计报告.doc

    常见的随机数发生器有两种:使用数学算法的伪随机数发生器和以物理随机量作 为发生源的真随机数发生器。要获取真正随机的真随机数,常使用硬件随机数发生器的 方法来获取。每次获取的真随机数都是不可测的,具有很好...

    球极平面逆投影迭代谱聚类算法

    提出一种相似矩阵迭代修正并聚类算法, 分为偏振定理的谱分离数据和球极平面逆投影的几何分离数据两步. 首先将数据谱分解, 得到低维距离矩阵; 然后投影到双随机矩阵, 隐式进行一次球极平面逆投影, 几何对称分离数据; ...

    C# Random类的正确应用方法

    这里的伪随机表示有随机性但是可以基于算法模拟出随机规律。 Random类的构造方式有两种。 Random r= new Random()。会以当前系统时间作为默认种子构建一个随机序列 Random r = new Random(unchecked((int)DateTime...

    Web服务安全(PGP、S/MIME、Secure Shell、SFTP)

    需要注意的是,随机数生成是指PGP提供两个伪随机数发生器(PRNG):一个是ANSI X9.17发生器,采用IDEA算法,以CFB(密码反馈模式)生成;另一个是从用户击键的时间和序列中计算熵值,从而引入随机性。 PGP在安全...

    并行计算课程设计(代码+执行文件+文档)

    蒙特·卡罗方法(Monte Carlo method)是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。球的体积可以估算为:位于点模型内随机点个数与全体随机点个数的比值乘以包围盒的体积算的。 3. 设计分析 3.1...

    费马素性检测,费马小定理

    费马素性检验是一种随机化算法,判断一个数是合数还是可能是素数。 根据费马小定理:如果p是素数,&lt;math&gt;1 \le a \le p,那么 &lt;math&gt;a^ \equiv 1 \pmod。 如果我们想知道n是否是素数,我们在中间选取a,看看上面...

    DES数据加密

    这又分为两种方式:对称密钥算法和非对称密钥算法。所谓对称密钥算法就是加密解密都使用相同的密钥,非对称密钥算法就是加密解密使用不同的密钥。非常著名的pgp公钥加密以及rsa加密方法都是非对称加密算法。加密密钥...

    论文研究-序列信息融合与两阶段特征选择的膜蛋白预测.pdf

    针对膜蛋白特征表达过程中出现的特征维数高的问题,结合最大信息系数与遗传算法提出一种两阶段特征选择(MIC-GA)。抽取膜蛋白序列信息中的伪氨基酸组成、二肽组成和位置特异性分数矩阵等特征融合后作为特征参数,并...

Global site tag (gtag.js) - Google Analytics