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

📄 rsacryclass.cpp

📁 RSA公钥加解密算法源码
💻 CPP
字号:

#include "stdafx.h"
#include "stdlib.h"

#include "stdio.h"
#include "RSACryClass.h"
#include "math.h"
#define rnd() float(rand())/RAND_MAX 

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

CMYRSA::CMYRSA()
{

}

CMYRSA::~CMYRSA()
{

}

int CMYRSA::IsPrime(unsigned short lngNumber)//返回0表示不是素数,1表示是素数
{
	unsigned short lngCount;
	unsigned short lngSqr;
	unsigned short x;
	int IsPrime;

    lngSqr = (unsigned short)sqrt(lngNumber);
    if(lngNumber < 2 ) return (0);

    lngCount = 2;
    IsPrime = 1;

    if ((lngNumber%lngCount)==0)
	{
        IsPrime = 0;//IsPrime=0表示不是素数
        return (IsPrime);
	}
    
    lngCount = 3;
    for(x=lngCount;x<=lngSqr;x=x+2)
	{
        if ((lngNumber%x)==0)
		{
            IsPrime = 0;
            return(IsPrime);
		}
	}
	return(IsPrime);
}

unsigned short CMYRSA::Euclid(unsigned short a, unsigned short b)//求b对a的素数(以a为模与b互质的数)
{
	unsigned short r,r1,r2;
	unsigned short p,p1,p2;
	unsigned short q,q1,q2;
	unsigned short n,c,s,x;
	try 
	{
		r1 = a; r = b;
		p1 = 0; p = 1;
		q1 = 2; q = 0;
		n = -1;
		while (!(r==0))
		{
		    r2 = r1; r1 = r;
			p2 = p1; p1 = p;
			q2 = q1; q1 = q;
			n = n + 1;
			r = r2 % r1;
			c = (short)(r2 / r1);
			p = (c * p1) + p2;	
			q = (c * q1) + q2;
		}
		s = (b * p1) - (a * q1);
		if (s>0)
			x=p1;
		else
			x=(0-p1)+a;
		return(x);
	}
	catch(...)
	{
		return(0);
	}
}


unsigned short CMYRSA::Mult(unsigned short x, unsigned short p, unsigned short m)
{
	unsigned short y;
	y=1;
	try
	{
		while (p!=0)
		{
			while ((p%2)==0)
			{
				x = (x * x)%m;
				p = p / 2;
			}
			y = (x * y) % m;
			p = p - 1;
		}
		return(y);
	}
	catch (...)
	{
		y=0;
		return(y);
	}

}

void CMYRSA::GetKey()
{
	unsigned short d,phi,e,x,q,p,n;
	int bb=0;
	srand( (unsigned)time( NULL ) );

	do
	{
		do
		{
			p = (unsigned char)(rnd() * 1000);
		}while(IsPrime(p)==0 || p>255);
	
		do
		{
			q = (unsigned char)(rnd() * 1000);
		}while (IsPrime(q)==0 || q>255);
	
		n = p * q;
		phi = (p - 1) * (q - 1);
		d = (short)(rnd() * n) ;
		if (d==0||n==0||d==1) continue;
		e = Euclid(phi, d);
		if (e==0||e==1) continue;
		x = Mult(255, e, n);
		if (Mult(x, d, n) == 255) 
		{
			PublicKey=d;
			PrivateKey=e;
			R=n;
			bb=1;
		}
	}while(bb==0);
}

void CMYRSA::Encode()
{
	unsigned short s,x;
	int a=0;
	do 
	{
		s=0;
		a=sfile.Read(&s,1);
		x=Mult(s,PublicKey,R);
		if (a<=0) break;
		dfile.Write(&x,4);
	}while(a>0);
	sfile.Close();
	dfile.Close();
}

void CMYRSA::Encode(unsigned char *SourceStr,int SourceLen,unsigned char *DesStr,int *DesLen)
{
	unsigned short s,x;	
	int i=0;
	*DesLen=SourceLen*2;
	for(i=0;i<SourceLen;i++) 
	{
		s=0;
		//s=(long)*(SourceStr+i)|(long)*(SourceStr+i+1)<<8|(long)*(SourceStr+i+2)<<16|(long)*(SourceStr+i+3)<<24;
		s=(short)*(SourceStr+i);
//		s+=(short)(*(SourceStr+i+1)<<8);
		x=Mult(s,PublicKey,R);	
		*(DesStr+i)=(unsigned char)(x & 0x00FF);
		*(DesStr+i+1)=(unsigned char)((x>>8) & 0x00FF);
		//*(DesStr+i*4)=(unsigned char)(x & 0x000000FF);
		//*(DesStr+i*4+1)=(unsigned char)((x>>8) & 0x000000FF);	
		//*(DesStr+i*4+2)=(unsigned char)((x>>16) & 0x000000FF);
		//*(DesStr+i*4+3)=(unsigned char)((x>>24) & 0x000000FF);		
	}
}

void CMYRSA::Readly(unsigned char SFileName[], unsigned char DFileName[])
{
	strcpy((char *)DFilePath,(char *)DFileName);
	strcpy((char *)SFilePath,(char *)SFileName);
	sfile.Open((char *)SFilePath,CFile::modeRead);
	dfile.Open((char *)DFilePath,CFile::modeCreate|CFile::modeWrite);
}

void CMYRSA::Decode()
{
	unsigned short s,x;
	int a=0;
	char t;		
	do 
	{
		x=0;
		a=sfile.Read(&x,4);
		s=Mult(x,PrivateKey,R);
		if (a<=0) break;
		t=(char)s;		
		dfile.Write(&t,1);				
	}while(a>0);
	sfile.Close();
	dfile.Close();
}

void CMYRSA::Decode(unsigned char *SourceStr,int SourceLen,unsigned char *DesStr,int *DesLen)
{
	unsigned short s,x;
	unsigned char t;	
//	int i,len;	
	int i;
	i=0;
	
//	if((SourceLen%4)==0) 
//		*DesLen=SourceLen/4;
//	else
//		*DesLen=SourceLen/4+1;	
	
	if((SourceLen%2)==0) 
		*DesLen=SourceLen/2;
	else
		*DesLen=SourceLen/2+1;
	//*DesLen=SourceLen;
	for(i=0;i<SourceLen;i=i+2)
	{
		x=0;
		s=0;
		x=((unsigned short)(*(SourceStr+i)))| ((unsigned short)(*(SourceStr+i+1)))<<8;
		s=Mult(x,PrivateKey,R);	
		
		t=(unsigned char)s;		
		*(DesStr+i/2)=t;		
		
		/*
		*(DesStr+i)=(unsigned char)(s&0x000000ff);
		*(DesStr+i+1)=(unsigned char)((s>>8)&0x000000ff);
		*(DesStr+i+2)=(unsigned char)((s>>16)&0x000000ff);
		*(DesStr+i+3)=(unsigned char)((s>>24)&0x000000ff);
		*/
	}
}

⌨️ 快捷键说明

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