密码学课程设计
long enterTime=System.currentTimeMillis();
//System.out.println("请输入种子:");
//Scanner get_seed=new Scanner(System.in);
//seed=get_seed.nextInt();
Calendar c=Calendar.getInstance();
伪随机数序列{ xn}通过下列迭代方程得到:
xn+1=(axn+c)modm
如果m、a、c和x0都是整数,那么通过这个迭代方程将产生一系列的整数,其中每个数都在0 ≤ xn < m的范围内。数值m、a和c的选择对于建立一个好的伪随机数产生器十分关键。为了形成一个很长的伪随机数序列,需要将m设置为一个很大的数。一个常用准则是将m选为几乎等于一个给定计算机所能表示的最大非负整数。因而,在一个32位计算机上,通常选择的m值是一个接近或等于231的整数。此外,为了使得随机数列不易被重现, 可以使用当前时间的毫秒数作为初始种子的位置。
附录:实验代码:(完整的源程序)
1线性同余
import java.util.Calendar;
import java.util.Scanner;
public class Main{
static double seed;
static int rez;
static int m;
public static void main(String[] args) {
线性反馈移位寄存器(LFSR),它是由n个D触发器和若干个异或门组成的,如下图:
其中,gn为反馈系数,取值只能为0或1,取为0时表明不存在该反馈之路,取为1时表明存在该反馈之路;n个D触发器最多可以提供2^n-1个状态(不包括全0的状态),为了保证这些状态没有重复,gn的选择必须满足一定的条件。下面以n=3,g0=1,g1=1,g2=0,g3=1为例,说明LFSR的特性,具有该参数的LFSR结构如下图:
int hour=c.get(Calendar.HOUR_OF_DAY);
int minute=c.get(Calendar.MINUTE);
int second=c.get(Calendar.SECOND);
String s=""+hour+minute+second;
//System.out.println(s);
2.2线性同余算法生成随机数
到目前为止,使用最为广泛的随机数产生技术是由Lehmer首先提出的称为线性同余算法,即使用下面的线性递推关系产生一个伪随机数列x1,x2,x3,…
这个算法有四个参数,分别是:
a 乘数 0 ≤ a < m
c 增量 0 ≤ c< m
m 模数 m > 0
≤ x0 < m x0 初始种子(秘密) 0
rez=(int) ((seed*16807)%m);
一、设计题目
随机数产生器应用系统
二、课题要求
系统功能要求:
1)模拟线性移位寄存器、线性同余发生器等产生伪随机数,并比较算法性能以及伪随机数的随机性;
2)利用该模拟随机数,应用到口令认证系统中,完成口令的生产、口令的加密保护、登陆验证等功能;
3)利用该模拟随机数,应用到密钥生成系统中,可以利用该密钥完成对称密钥的加密和解密功能。
功能流图:
4、安全性分析
基本满足预期的要求,能够保证安全需要,由于是利用随机数的方式进行加密和解密,而且算法本身的安全性也很高,所以有一定的实用性和稳定性,基本保障不会被破译。
5、总结展望
目前感觉随机数的生成是比较好的部分,满足课程设计本身的锻炼目的,采用时间作为seed,两种方法都能产生伪随机数,不足之处在于,时间间隔小,产生的第一个随机数很相近,口令认证和随机数的加密解密工作可以更加完善,部分功能还不是太满美,时间更多些可以调试到更好。
2.2 线性反馈移位寄存器生成随机数
LFSR是指给定前一状态的输出,将该输出的线性函数再用作输入的线性寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位。赋给寄存器的初始值叫做“种子”,因为线性反馈移位寄存器的运算是确定性的,所以,由寄存器所生成的数据流完全决定于寄存器当时或者之前的状态。而且,由于寄存器的状态是有限的,它最终肯定会是一个重复的循环。然而,通过本原多项式,线性反馈移位寄存器可以生成看起来是随机的且循环周期非常长的序列。
3、系统设计和模块设计
1.总体设计思路
利用线性同余发生器(LCG)和线性反馈移位寄存器(LFSR)生成伪随机数M序列,并通过口令认证系统完成口令生成加密工作,同时完成对随机数的加密和解密功能。
2.模块设计思路
2.1原理
通过一定的算法对事先选定的随机种子(seed)做一定的运算可以得到一组人工生成的周期序列,在这组序列中以相同的概率选取其中一个数字,该数字称作伪随机数,由于所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。这里的“伪”的含义是,由于该随机数是按照一定算法模拟产生的,其结果是确定的,是可见的,因此并不是真正的随机数。伪随机数的选择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要,如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。
假设在开始时,D2D1D0=111(seed),那么,当时钟到来时,有:
D2பைடு நூலகம்D1_OUT=1;
D1=D0_OUT^D2_OUT=0;
D0=D2_OUT=1;
即D2D1D0=101;同理,又一个时钟到来时,可得D2D1D0=001. ………………
seed,就是随机数的种子,在系统运行的到某某时刻的时候,如果接到产生随机序列的命令,则获取当前的系统时刻作为seed,这里具有一定的随机性。
seed=Integer.parseInt(s);
//System.out.println(seed);
//seed=hour+minute+second;
m= (int) Math.pow(2, 31)-1;
//System.out.println(m);
for(int i=0;i<10;i++){