?? rsa算法的c++實(shí)現(xiàn).txt
字號:
RSA算法的C++實(shí)現(xiàn)
key_produce.h //==本程序提供密鑰產(chǎn)生的一些基本數(shù)學(xué)實(shí)現(xiàn)
#include
class CKEY_PRODUCE
{
public:
CKEY_PRODUCE();
virtual ~CKEY_PRODUCE();
public:
int JudgePrime(unsigned int prime);//==========判prime是否為素數(shù)
//============================================算出p*q的歐拉值
int Count_N_AoLa_Num(unsigned int p, unsigned int q, unsigned int * ao_la);
//============================================求兩個數(shù)的最大公因數(shù)
unsigned int CountCommonData(unsigned int a, unsigned int b);
//=============================================隨機(jī)選擇公鑰e
int RandSelect_e( unsigned int ao_la, unsigned int* e );
//=============================================求b的e次方除d的余數(shù)
unsigned int GetOutNum(unsigned int b,unsigned int e , unsigned int d);
//=============================================求任意大于2的整數(shù)的歐拉值
unsigned int CountAnyNumAola(unsigned int number);
//=============================================產(chǎn)生RSA 公_私 密鑰
int Produce_RSA_Key(unsigned int p,unsigned int q, unsigned int* Ke, unsigned int* Kd, unsigned int* model);
//===========================利用加的模等于模的加求e*d = 1 mod model 中的d
int OverOneNum(unsigned int e,unsigned int model, unsigned int* d);
};
key_produce.cpp//==本程序提供密鑰產(chǎn)生的一些基本數(shù)學(xué)實(shí)現(xiàn)
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'的歐拉數(shù) - 1) mod n' (其中n'= (p-1)*(q-1) ),因n'的//歐拉數(shù)也不好求
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的余數(shù)
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的整數(shù)的歐拉值
unsigned int CKEY_PRODUCE::CountAnyNumAola(unsigned int number)
{
unsigned int ao_la= 1;
unsigned int i; if( number<=1 )
printf("本函數(shù)不處理2以下的范圍!\n");
for(i=2; i<number ; i++)
{
if( CountCommonData(number, i)==1 )
ao_la ++;
}
return ao_la;
}
encryption.h//==本程序提供對文件進(jìn)行加密解密的操作
class CENCRYPTION
{
public:
CENCRYPTION();
virtual ~CENCRYPTION();
void Encrypt(UINT PublicKey, UINT mod, FILE* fipRe, FILE* fipWr,char* extrName );
void Explain(UINT PrivateKey, UINT mod, FILE* fipRe, FILE* fipWr );
void TxtEncrypt(unsigned* cipSourceTxt, int buffSize, unsigned int Ke, unsigned int model);
private:
//==================================求b的e次方除d的余數(shù)
unsigned int GetOutNum(unsigned int b,unsigned int e , unsigned int d);
//==================================對原文進(jìn)行加密并覆蓋原緩沖區(qū)
};
encryption.cpp//==本程序提供對文件進(jìn)行加密解密的操作
CENCRYPTION::CENCRYPTION()
{ }
CENCRYPTION::~CENCRYPTION()
{ }
//==================================對原文進(jìn)行加密并覆蓋原緩沖區(qū)
void CENCRYPTION::TxtEncrypt(unsigned* cipSourceTxt, int buffSize, unsigned int Ke, unsigned int model)
{
int i;
for( i=0; i < buffSize; i++ )
{
cipSourceTxt[i] = GetOutNum( cipSourceTxt[i], Ke, model );
}
}
//==================================求b的e次方除d的余數(shù)
unsigned int CENCRYPTION::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;
if( outNum >= d )
{
outNum %= d;
}
if(!outNum)
return outNum;
}
return outNum%d;
}
void CENCRYPTION::Encrypt(UINT PublicKey, UINT mod, FILE* fipRe, FILE* fipWr ,char* extrName)
{
unsigned int ReSize;
unsigned int uBuf[BUFFER_SIZE]= {0,};
char cBuf[BUFFER_SIZE];
unsigned int i;
for(i=0; i<3; i++)//=====我認(rèn)為擴(kuò)展名是3個字符
{
if(extrName)//=========如果有擴(kuò)展名, 將擴(kuò)展名放入uBuf 和數(shù)據(jù)一樣加密
{
uBuf[i]= 0;
*((char*)(&uBuf[i])) = extrName[i];
}
else
uBuf[i]= 0;
}
if(extrName)//===============如果有擴(kuò)展名, 將擴(kuò)展名加密
TxtEncrypt(uBuf, 3,PublicKey,mod);
fwrite( (char*)uBuf,1, 3*sizeof(unsigned int), fipWr);//密文前12個,字節(jié)中是源文件的 擴(kuò)展名信息
do
{
ReSize= fread(cBuf, 1, BUFFER_SIZE,fipRe);
if(ReSize)
{
unsigned int record=1;
unsigned int WrNum;
for(i=0; i < ReSize; i++)
{
uBuf[i]= 0;
*((char*)(&uBuf[i])) = (cBuf[i]) ;
} TxtEncrypt(uBuf, ReSize,PublicKey,mod); WrNum= fwrite( (char*)uBuf,1, ReSize*sizeof(unsigned int), fipWr);
printf("第%d次寫入%d字節(jié)!\n",record++, WrNum);
}
}while(ReSize == BUFFER_SIZE);
}
void CENCRYPTION::Explain(UINT PrivateKey, UINT mod, FILE* fipRe, FILE* fipWr )
{
unsigned int ReSize;
unsigned int uBuf[BUFFER_SIZE]= {0,};
char cBuf[BUFFER_SIZE];
do
{
ReSize= fread(uBuf, sizeof(unsigned int), BUFFER_SIZE,fipRe);
if(ReSize)
{
unsigned int i;
unsigned int record=1;
unsigned int WrNum;
TxtEncrypt(uBuf, ReSize,PrivateKey,mod);
for(i=0; i<ReSize; i++)
cBuf[i]= (char)(uBuf[i]);
WrNum= fwrite( cBuf,1, ReSize, fipWr);
printf("第%d次寫入%d字節(jié)!\n",record++, WrNum);
}
}while(ReSize == BUFFER_SIZE);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -