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

📄 gaussrandom.cpp

📁 DES查分攻击源代码
💻 CPP
字号:
// GaussRandom.cpp: implementation of the CGaussRandom class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "DesDemo.h"
#include "GaussRandom.h"
#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

CGaussRandom::CGaussRandom()
{

}

CGaussRandom::~CGaussRandom()
{

}


DWORD CGaussRandom::Seq32(DWORD Key)
{
	int i;
	for(i=0;i<32;i++)
	{
		_asm
		{
		MOV EBX,Key;
		SHL EBX,1
		MOV EAX,Key;
		MOV EDX,MCoef_32[0];
		AND EAX,EDX; //select the bit for xor
		MOV EDX,EAX;
		SHR EAX,16;
		XOR AX,DX;
		XOR AH,AL; // because P only judge one byte
		// so must XOR to judge the p of whole word
		JP NEXT //jp equals the xor
		INC EBX
		NEXT: MOV Key,EBX;

		}
	}
	return Key;
}


WORD CGaussRandom::RNG()
{
	DWORD A,B;
	_asm
	{
		_emit 0x0f
		_emit 0x31
		MOV A,EAX
		MOV B,EDX
	}

	m_RandomKey = Seq32(m_RandomKey^A^B);
	return (WORD)m_RandomKey;
}

DWORD CGaussRandom::RNG32()
{
	DWORD A,B;
	_asm
	{
		_emit 0x0f
		_emit 0x31
		MOV A,EAX
		MOV B,EDX
	}

	m_RandomKey32 = Seq32(m_RandomKey32^A^B);
	return m_RandomKey32;
}

/////////////////////////////////////////////////////////////////
//生成正态分布函数和正态分布概率密度函数表,表宽度为3倍方差
//正态分布函数均值为0,方差为1
//FTable: 正态分布函数表
//fTable: 正态分布概率密度表
//Length: 表的长度
/////////////////////////////////////////////////////////////////
void CGaussRandom::NormalTable(float *FTable, float * fTable,int Length)
{
	int i;
	float h; // 步长 
	float x,temp;
	float C;

	x=-3;
	h= (float)6.0/Length/2;
	FTable[0]=0;
	C=(float)(1/sqrt(2*3.1415927));

	// 初始参数设置 
	fTable[0]= (float)exp(-x*x/2)*C;

	// 起始点的概率密度 ,exp(-x*x/2)*C为概率密度函数 
	for(i=1;i<Length;i++)
	{
		x+=h;
		temp = (float)exp(-x*x/2)*C;
		x+=h;
		fTable[i] = (float)exp(-x*x/2)*C;

		// 计算正态分布概率密度函数 
		FTable[i] = FTable[i-1]+(fTable[i-1]+4*temp+fTable[i])*h/3;
		//辛普森数值积分公式计算正态分布函数
	}
}

////////////////////////////////////////////////////////////////////////
//生成均值为0,方差为1的高斯随机数
//Gauss_F: 正态分布函数表,规格如上,可以由NormalTable函数生成
//Length: 正态分布函数表的长度
//返回值:均值为0,方差为1的高斯分布随机数
////////////////////////////////////////////////////////////////////////
float CGaussRandom::NormalRNG()
{
	float * Gauss_F,*fTable;
	int Length = 256;
	Gauss_F = new float[Length];
	fTable = new float[Length];

	NormalTable(Gauss_F,fTable,Length);

	float RandomNumber;
	float temp,h;
	int i;

	// 正态分布表的步长 
	h= (float)(6.0/Length);

	//产生一个[0,1)区间内均匀随机数 
	temp = (float)RNG()/65536;
	
	if(temp == 0)
	return 0;

	for(i=0;i<Length;i++)
	{
		if(temp<=Gauss_F[i]) //计算随机数落入正态分布表的哪个区间
		{
			//进行线性差值 
			RandomNumber = (-3+h*i)+(temp-Gauss_F[i-1])/(Gauss_F[i]-Gauss_F[i-1])*h;			
			break;
		}
	}	

	delete[] Gauss_F;
	delete[] fTable;

	return RandomNumber;
}


int CGaussRandom::Random(int nMin,int nMax)
{
	float fRand = NormalRNG();
	int n = nMax - nMin;
	int n2 = 10;
	while((nMax-nMin)/n2!=0)
		n2 *=10;
	int  fNR = (int)((float)(fRand*n2))%n;
	return abs((fNR+nMin)%nMax);
}

⌨️ 快捷键说明

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