内容来自论文无忧网 www.paper51.com
图3 分别得到产生大随机数的输入随机数 copyright paper51.com void CCreRndNum::GetTime() 内容来自论文无忧网 www.paper51.com { http://www.paper51.com int i; paper51.com FILETIME ft; 内容来自www.paper51.com GetSystemTimeAsFileTime(&ft); copyright paper51.com for(i = 0; i < 32; i++) http://www.paper51.com { DTi[31- i] = (char)((ft.dwHighDateTime >> i) & 0x01); // 取得各位的值 paper51.com DTi[63- i] = (char)((ft.dwLowDateTime >> i) & 0x01); } 内容来自www.paper51.com } 内容来自www.paper51.com void CCreRndNum::GetVi() //得到64位的二进制随机数 http://www.paper51.com {int i; copyright paper51.com
srand((unsigned)time(NULL)); http://www.paper51.com
for (i = 0; i < 64; i++) copyright paper51.com { Vi[i] = rand()%2; } paper51.com } 内容来自论文无忧网 www.paper51.com 函数名: Step_1 paper51.com
函数功能: 产生随机数第1步(见图1) 内容来自www.paper51.com 输入: DTi(时间),K1,K2(密钥) paper51.com 输出: Result_1[64] 内容来自论文无忧网 www.paper51.com 调用函数: MyDes::EDE() copyright paper51.com
void CCreRndNum::Step_1() 内容来自论文无忧网 www.paper51.com { GetTime(); //得到时间二进制并保存在DTi中 copyright paper51.com GetKey(); //产生密钥并保存在KK1,KK2中 paper51.com CDESMyDes; 内容来自www.paper51.com
MyDes.EDE(DTi, KK1, KK2, Result_1); //三重DES加密(EDE) 内容来自www.paper51.com } copyright paper51.com 函数名: Step_2 paper51.com 函数功能: 产生随机数第2步(见图1) copyright paper51.com 输入: Result_1,Vi(第一次输入的随机数) http://www.paper51.com
输出: Result_2[64] 内容来自论文无忧网 www.paper51.com void CCreRndNum::Step_2() 内容来自论文无忧网 www.paper51.com { inti; copyright paper51.com
//之前已得到V0 paper51.com for(i = 0; i < 64; i++) copyright paper51.com { Result_2[i] = Vi[i] ^Result_1[i]; } 内容来自论文无忧网 www.paper51.com } paper51.com 函数名: Step_3 http://www.paper51.com
函数功能: 产生随机数第3步(见图1) http://www.paper51.com 输入: Result_2,K1,K2(密钥) 内容来自www.paper51.com 输出: Result_3[64] http://www.paper51.com 调用函数: MyDes::EDE() http://www.paper51.com void CCreRndNum::Step_3() 内容来自论文无忧网 www.paper51.com {CDES MyDes; 内容来自www.paper51.com MyDes.EDE(Result_2, KK1, KK2, Result_3); copyright paper51.com } 内容来自www.paper51.com 函数名: Step_4 内容来自www.paper51.com 函数功能: 产生随机数第4步 异或(见图1) 内容来自www.paper51.com 输入: Result_1,Result_3 内容来自论文无忧网 www.paper51.com 输出: Result_4[64] 内容来自论文无忧网 www.paper51.com void CCreRndNum::Step_4() copyright paper51.com { int i; http://www.paper51.com
for (i =0; i < 64; i++) 内容来自www.paper51.com { Result_4[i] = Result_1[i] ^ Result_3[i];} http://www.paper51.com
} paper51.com 函数名: Step_5 copyright paper51.com 函数功能: 产生随机数第5步(见图1) copyright paper51.com 输入: Result_4,K1,K2(密钥) http://www.paper51.com 输出: Result_5[64] 内容来自www.paper51.com 调用函数: MyDes::EDE copyright paper51.com
void CCreRndNum::Step_5() 内容来自www.paper51.com {CDES MyDes; 内容来自论文无忧网 www.paper51.com
MyDes.EDE (Result_4, KK1, KK2, Result_5);} 内容来自论文无忧网 www.paper51.com 函数名: GetRandNumber 内容来自论文无忧网 www.paper51.com 函数功能: 产生随机数,保存在dwRndNum[33]中. http://www.paper51.com 输入: 无 内容来自论文无忧网 www.paper51.com 输出: dwRndNum[33] paper51.com
备注: 输出1025位二进制,故用33个DWORD型的数存放随机数. 内容来自论文无忧网 www.paper51.com BOOL CCreRndNum::GetRandNumber(DWORD dwRndNum[]) 内容来自www.paper51.com
{ GetVi(); 内容来自www.paper51.com int i,m; http://www.paper51.com for(m = 0; m < 17; m++) //17轮产生1088(取1025)位的Ri 内容来自www.paper51.com { Step_1(); 内容来自www.paper51.com
Step_2(); 内容来自www.paper51.com Step_3(); http://www.paper51.com for (i = 0; i < 64; i++) paper51.com { Ri[(m << 6) + i] =Result_3[i]; //保存到1024bit的Ri中 } 内容来自论文无忧网 www.paper51.com Step_4(); 内容来自论文无忧网 www.paper51.com
Step_5(); 内容来自论文无忧网 www.paper51.com for (i = 0; i < 64; i++) //Vi+1自动赋给Vi copyright paper51.com
{ Vi[i] = Result_5[i]; } 内容来自www.paper51.com
} // end for 内容来自论文无忧网 www.paper51.com UINT temp; 内容来自www.paper51.com for( i = 0; i < 1024; i++) //取第1~1024位 copyright paper51.com { temp = (UINT)(i / 32); 内容来自论文无忧网 www.paper51.com if(i% 32 == 0) http://www.paper51.com dwRndNum[temp] =dwRndNum[temp] | (DWORD)Ri[i]; 内容来自论文无忧网 www.paper51.com
else 内容来自论文无忧网 www.paper51.com
dwRndNum[temp] = dwRndNum[temp] << 1 | (DWORD)Ri[i]; copyright paper51.com } paper51.com for(i=0;i<32;i++) copyright paper51.com { while(dwRndNum[i]<2147483648) 内容来自www.paper51.com
{dwRndNum[i]+=dwRndNum[i];} http://www.paper51.com } http://www.paper51.com dwRndNum[32] &= (DWORD)Ri[1024]; //取第1025位,其余位为0 copyright paper51.com returnTRUE; 内容来自www.paper51.com } copyright paper51.com 6 检验随机数 内容来自www.paper51.com
随机数检验方法有如下几种: 内容来自www.paper51.com
参数检验,检验其分布参数的观察值与理论值的差异显著性。 内容来自www.paper51.com 均匀性检验,又称频率检验,意在检验伪随机数的经验频率与理论频率的差异是否显著。 copyright paper51.com
独立性检验,即检验所产生的伪随机数的独立性和统计相关是否异常,包括相关关系检验和联列表检验等。 copyright paper51.com 组合规律检测,按随机数出现的先后次序,根据一定的规律组合,检验其组合的观察值与理值是不否有显著差异,包括距离检验和配套检验等。 paper51.com 游程检验,把随机数序列按一定的规则进行分类,分为正负游程检验和升降游程检验等。 copyright paper51.com
本程序采用了均匀性检测,即频率检测。 http://www.paper51.com
由于随机数是由16次循环得来。并且存放在32个数组中,所以取其中高位数组的值就可以判断是否满足均匀性检测。 copyright paper51.com 算法示意图: paper51.com
paper51.com
copyright paper51.com 图4 检验随机数足够随机 内容来自www.paper51.com
Int bb=0; http://www.paper51.com bb++; http://www.paper51.com chars[40]; copyright paper51.com for (int i =0;i<33;i++) paper51.com
{ http://www.paper51.com sprintf(s,"(%2d) %10lX\r\n",i,dwn[i]); copyright paper51.com m_show.ReplaceSel(s); 内容来自论文无忧网 www.paper51.com } copyright paper51.com cc=cc/bb*(bb-1)+dwn[31]/bb; 内容来自www.paper51.com
sprintf(s,"第%2d次前位平均值为:\n%10lX\n",bb,cc); 内容来自www.paper51.com m_show.ReplaceSel(s); copyright paper51.com 7 系统测试 paper51.com
第一次多次运行程序,如图: copyright paper51.com
内容来自论文无忧网 www.paper51.com
图5 第一次测试结果 http://www.paper51.com 第二次多次运行程序,如图: paper51.com
paper51.com
图6 第2次测试结果 copyright paper51.com 第三次多次运行程序,如图: copyright paper51.com 内容来自论文无忧网 www.paper51.com 图7 第3次测试结果 copyright paper51.com |