📄 crerndnum.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 + -