⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crerndnum.cpp

📁 大随机数生成器算法的研究与实现.大随机数已经在当今社会的各个领域中都频繁使用
💻 CPP
字号:
// CreRndNum.cpp: implementation of the CCreRndNum class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ansi917.h"
#include "CreRndNum.h"
#include "MD5Checksum.h"
#include "des.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCreRndNum::CCreRndNum()
{

}

CCreRndNum::~CCreRndNum()
{

}
int CCreRndNum::CharToInt(char ch)
{
	switch(ch)
	{
	case 'a':
	case 'A':
		return 0xa;
	case 'b':
	case 'B':
		return 0xb;
	case 'c':
	case 'C':
		return 0xc;
	case 'd':
	case 'D':
		return 0xd;
	case 'e':
	case 'E':
		return 0xe;
	case 'f':
	case 'F':
		return 0xf;
	default:
		return (int)(ch-0x30);
	}

}

///////////////////////////////////////////////
//函数名:     get_SystemStatus_W32
//函数功能:   得到系统状态
//输入:       无
//输出:       系统状态字符串,ni:得到的字符串长度
//buf:用以保存系统状态字符中,maxlen:字符串长度
///////////////////////////////////////////////
int CCreRndNum::get_SystemStatus_W32(int maxlen)
{
    int ni = 0;     //保存得到的字符串长度
	DWORD dwRes;
	MEMORYSTATUS ms;
	dwRes = GetCurrentProcessId();  //返回长整型(DWORD)
	if (maxlen >= sizeof(DWORD))
	{
		memcpy(&buf[ni], &dwRes, sizeof(dwRes));
		ni += sizeof(dwRes);
		maxlen -= sizeof(dwRes);
	}
	dwRes = GetCurrentThreadId();
	if (maxlen >= sizeof(DWORD))
	{
		memcpy(&buf[ni], &dwRes, sizeof(dwRes));
		ni += sizeof(dwRes);
		maxlen -= sizeof(dwRes);
	}
	dwRes = GetTickCount();
	if (maxlen >= sizeof(DWORD))
	{
		memcpy(&buf[ni], &dwRes, sizeof(dwRes));
		ni += sizeof(dwRes);
		maxlen -= sizeof(dwRes);
	}
	ms.dwLength = sizeof(MEMORYSTATUS);
	GlobalMemoryStatus(&ms);
	if (maxlen >= sizeof(MEMORYSTATUS))
	{
		memcpy(&buf[ni], &ms, sizeof(MEMORYSTATUS));
		ni += sizeof(MEMORYSTATUS);
		maxlen -= sizeof(MEMORYSTATUS);
	}
	return ni;

}

void CCreRndNum::GetKey()
{
    int sysInfoLen = get_SystemStatus_W32(300);
	CString sKey32;  //字符串型
	int iKey32[32];  //转换后的整型
    sKey32 = CMD5Checksum::GetMD5(buf,sysInfoLen);//字符串

	for(int i = 0; i < 32; i++)//字符串转化为整型
	{
		iKey32[i] = CharToInt(sKey32[i]);
	}
	for(i = 0; i < 64; i++)  //取出每一位
	{
		KK1[i] = iKey32[i / 4] >> (i % 4) & 0x01; 
		KK2[i] = iKey32[16 + i / 4] >> (i % 4) & 0x01; 

	}
}
///////////////////////////////////////////////
//函数名:     GetTime
//函数功能:   得到64bit的当前日期和时间的二进制
//输入:        系统时间
//输出:        btime[64]
///////////////////////////////////////////////
void CCreRndNum::GetTime()
{
int i;
FILETIME ft;
GetSystemTimeAsFileTime(&ft);
	for (i = 0; i < 32; i++)
 	{
 		DTi[31 - i] = (char)((ft.dwHighDateTime >> i) & 0x01); // 取得各位的值
 		DTi[63 - i] = (char)((ft.dwLowDateTime >> i) & 0x01);
 	}

}

void CCreRndNum::GetVi()
{
int i;
    srand((unsigned)time(NULL));
    for (i = 0; i < 64; i++)
	{
		Vi[i] = rand()%2;
	}
}
///////////////////////////////////////////////
//函数名:     Step_1
//函数功能:   产生随机数第1步(见流程图)
//输入:       DTi(时间),K1,K2(密钥)
//输出:       Result_1[64]
//调用函数:   MyDes::EDE()
///////////////////////////////////////////////
void CCreRndNum::Step_1()
{
	GetTime();   //得到时间二进制并保存在DTi中
    GetKey();    //产生密钥并保存在KK1,KK2中
	CDES MyDes;
	MyDes.EDE (DTi, KK1, KK2, Result_1);  //三重DES加密(EDE)


}
///////////////////////////////////////////////
//函数名:     Step_2
//函数功能:   产生随机数第2步(见流程图)
//输入:       Result_1,Vi(第一次输入的随机数)
//输出:       Result_2[64]
///////////////////////////////////////////////
void CCreRndNum::Step_2()
{
	int i;
//之前已得到V0
	for (i = 0; i < 64; i++)
	{
		Result_2[i] = Vi[i] ^ Result_1[i];
	}

}
///////////////////////////////////////////////
//函数名:     Step_3
//函数功能:   产生随机数第3步(见流程图)
//输入:       Result_2,K1,K2(密钥)
//输出:       Result_3[64]
//调用函数:   MyDes::EDE()
///////////////////////////////////////////////
void CCreRndNum::Step_3()
{
CDES MyDes;
MyDes.EDE(Result_2, KK1, KK2, Result_3);

}
///////////////////////////////////////////////
//函数名:     Step_4
//函数功能:   产生随机数第4步 异或(见流程图)
//输入:       Result_1,Result_3
//输出:       Result_4[64]
///////////////////////////////////////////////
void CCreRndNum::Step_4()
{
  int i;
  for (i = 0; i < 64; i++)
  {
	  Result_4[i] = Result_1[i] ^ Result_3[i];
  }

}
///////////////////////////////////////////////
//函数名:     Step_5
//函数功能:   产生随机数第5步(见流程图)
//输入:       Result_4,K1,K2(密钥)
//输出:       Result_5[64]
//调用函数:   MyDes::EDE
///////////////////////////////////////////////
void CCreRndNum::Step_5()
{
CDES MyDes;
MyDes.EDE (Result_4, KK1, KK2, Result_5);
}

///////////////////////////////////////////////
//函数名:     GetRandNumber
//函数功能:   产生随机数,保存在dwRndNum[33]中.
//输入:       无
//输出:       dwRndNum[33]
//备注:       输出1025位二进制,故用33个DWORD型的数存放随机数.
///////////////////////////////////////////////

BOOL CCreRndNum::GetRandNumber(DWORD dwRndNum[])
{
    GetVi();
    int i,m;
	for (m = 0; m < 17; m++)              //17轮产生1088(取1025)位的Ri
	{
		Step_1();
	    Step_2();
	    Step_3();
	    for (i = 0; i < 64; i++)
		{   
			Ri[(m << 6) + i] = Result_3[i];    //保存到1024bit的Ri中  
						
		}
        
	    Step_4();
	    Step_5();

	   for (i = 0; i < 64; i++)    //Vi+1自动赋给Vi
		{   
			Vi[i] = Result_5[i];
		}

	}  // end for

    UINT temp;
	for ( i = 0; i < 1024; i++)  //取第1~1024位
	{
		temp = (UINT)(i / 32);
		if(i % 32 == 0)
           dwRndNum[temp] = dwRndNum[temp] | (DWORD)Ri[i];
	    else
           dwRndNum[temp] = dwRndNum[temp] << 1 | (DWORD)Ri[i];

	}
	for(i=0;i<32;i++)
	{
		while(dwRndNum[i]<2147483648)
		{dwRndNum[i]+=dwRndNum[i];}
	}
    dwRndNum[32] &= (DWORD)Ri[1024]; //取第1025位,其余位为0

	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -