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

📄 key_produce.cpp

📁 对文件加密解密 附带文件传输功能,感觉还可以哦!
💻 CPP
字号:
// KEY_PRODUCE.cpp: implementation of the CKEY_PRODUCE class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Mysun.h"
#include "KEY_PRODUCE.h"

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

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

CKEY_PRODUCE::CKEY_PRODUCE()
{
	
}

CKEY_PRODUCE::~CKEY_PRODUCE()
{
	
}

int CKEY_PRODUCE::Produce_RSA_Key(unsigned int p,unsigned int q, unsigned int* Ke, unsigned int* Kd, unsigned int* model)
{
	unsigned int ao_la;
	if( Count_N_AoLa_Num(p, q, &ao_la) )
	{
		if( RandSelect_e(ao_la, Ke) )
		{
			//*Kd= GetOutNum (*Ke, CountAnyNumAola(ao_la)-1 ,ao_la) ;
			//注:求Kd还是不用 x= a^(n'的欧拉数 - 1) mod n' (其中n'= (p-1)*(q-1) ),因n'的//欧拉数也不好求
			if( OverOneNum(*Ke, ao_la, Kd) )
			{
				*model= p*q;
				return 1;
			}
		}
	}
	return 0;
}
int CKEY_PRODUCE::JudgePrime(unsigned int prime)
{
	unsigned int i;
	unsigned int limit= (unsigned int)sqrt((double)prime);
	for(i=2; i <= limit; i++)
	{
		if(prime%i==0)
		{
			return 0;
		}
	}
	return 1;
}
int CKEY_PRODUCE::Count_N_AoLa_Num(unsigned int p, unsigned int q, unsigned int * ao_la)
{
	if( !JudgePrime(p) )
		return 0;
	if( !JudgePrime(q) )
		return 0;
	*ao_la = (p-1)*(q-1);
	return 1;
}
unsigned int CKEY_PRODUCE::CountCommonData(unsigned int a, unsigned int b)
{
	unsigned int c ;
	if( c= a%b )
		return CountCommonData(b,c);
	else
		return b;
}
int CKEY_PRODUCE::RandSelect_e( unsigned int ao_la, unsigned int* e )
{
	unsigned int tmp;
	unsigned int div;
	if( ao_la <= 2 )
	{
		return 0;
	}
	srand( time(0) );
	div= ao_la - 2;
	do
	{
		tmp = ( (unsigned int)rand()+90 ) % div + 2;
	}while( CountCommonData(tmp, ao_la)!=1 );
	*e = tmp;
	return 1;
}
//==================================求b的e次方除d的余数
unsigned int CKEY_PRODUCE::GetOutNum(unsigned int b,unsigned int e , unsigned int d)
{
	unsigned int i;
	unsigned int outNum= 1;
	for( i=0; i<e; i++)//=========用了乘的模 等于 模的乘
	{
		outNum *= b;//==============b d如果长过16位,很有可能溢出
		if( outNum >= d )
			outNum %= d;
		if(!outNum)
			return outNum;
	}
	return outNum%d;
}
//==============================利用加的模等于模的加求e*d = 1 mod model 中的d
int CKEY_PRODUCE::OverOneNum(unsigned int e,unsigned int model, unsigned int* d)
{
	unsigned int i;
	unsigned int over= e;
	for(i=1; i<model; )
	{
		over= over % model;
		if( over==1 )
		{
			*d = i;
			return 1;
		}
		else
		{
			if(over+e<= model)
			{
				do
				{
					i++;
					over += e;
				}
				while( over+e <= model );
			}
			else
				
			{
				i++;
				over +=e;
			}
		}
	}
	return 0;
}
//==================================求任意大于1的整数的欧拉值
unsigned int CKEY_PRODUCE::CountAnyNumAola(unsigned int number)
{
	unsigned int ao_la= 1;
	unsigned int i;  if( number<=1 )
		printf("本函数不处理2以下的范围!\n");
	for(i=2; i<number ; i++)
	{
		if( CountCommonData(number, i)==1 )
			ao_la ++;
	}
	return ao_la;
}

⌨️ 快捷键说明

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