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

📄 rsa算法的c++实现.txt

📁 最短路径算法C C++ 邻接矩阵实现 哈夫曼算法和哈夫曼树 RSA算法的C++实现 lzw压缩算法的c语言实现 计算日期程序(C语言)
💻 TXT
字号:
RSA算法的C++实现

key_produce.h //==本程序提供密钥产生的一些基本数学实现
#include 
class CKEY_PRODUCE 
{
public:
CKEY_PRODUCE();
virtual ~CKEY_PRODUCE();
public:
int JudgePrime(unsigned int prime);//==========判prime是否为素数
//============================================算出p*q的欧拉值
int Count_N_AoLa_Num(unsigned int p, unsigned int q, unsigned int * ao_la);
//============================================求两个数的最大公因数
unsigned int CountCommonData(unsigned int a, unsigned int b);
//=============================================随机选择公钥e
int RandSelect_e( unsigned int ao_la, unsigned int* e );
//=============================================求b的e次方除d的余数
unsigned int GetOutNum(unsigned int b,unsigned int e , unsigned int d);
//=============================================求任意大于2的整数的欧拉值
unsigned int CountAnyNumAola(unsigned int number);
//=============================================产生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//==本程序提供密钥产生的一些基本数学实现

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;
}



encryption.h//==本程序提供对文件进行加密解密的操作
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的余数
unsigned int GetOutNum(unsigned int b,unsigned int e , unsigned int d);
//==================================对原文进行加密并覆盖原缓冲区
};
encryption.cpp//==本程序提供对文件进行加密解密的操作

CENCRYPTION::CENCRYPTION()
{ }
CENCRYPTION::~CENCRYPTION()
{ }
//==================================对原文进行加密并覆盖原缓冲区
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的余数
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++)//=====我认为扩展名是3个字符
{
   if(extrName)//=========如果有扩展名, 将扩展名放入uBuf 和数据一样加密
   {
    uBuf[i]= 0;
    *((char*)(&uBuf[i])) = extrName[i];
   }
   else
    uBuf[i]= 0;
}
if(extrName)//===============如果有扩展名, 将扩展名加密
   TxtEncrypt(uBuf, 3,PublicKey,mod);
fwrite( (char*)uBuf,1, 3*sizeof(unsigned int), fipWr);//密文前12个,字节中是源文件的 扩展名信息
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字节!\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字节!\n",record++, WrNum);
   }

}while(ReSize == BUFFER_SIZE);
}



⌨️ 快捷键说明

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