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

📄 rsa.cpp

📁 两种加密算法实现,用VC++实现,非常好用
💻 CPP
字号:
// RSA.cpp: implementation of the CRSA class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "EncryptDecryptDlg.h"
#include "RSA.h"

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

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

CRSA::CRSA()
{

}

CRSA::~CRSA()
{

}

//对szMessage利用RSA算法进行测试   
CString   CRSA::Encrypt(CString   szMessage,   int   p,   int   q,int   e)   
{   
	int t,d,n,iMessage,EncryValues,a,b,gcd;   
	CString EncryMessage;   

	n   =   p*q;		//计算乘积   
	t   =   (p-1)*(q-1);	//用于与私钥e互素,同时e的值要保存   

	ExtBinEuclid(&t,&e,&a,&b,&gcd);//获取公钥   
	if(gcd==1)   
		d=t-b;   

	//对信息进行加密   
	//将字符串信息进行数据类型转化     
	iMessage   =   atoi(szMessage.GetBuffer(szMessage.GetLength()));   
	EncryValues   =   GetValues(iMessage,d,n);   
	EncryMessage.Format(_T("%d"),   EncryValues);   

	return EncryMessage;   
}  
 
CString CRSA::Decrypt(CString   szMessage,int   e,int   n)   
{   
	int EncryValues,iMessage;   
	CString EncryMessage;   

	iMessage   =   atoi(szMessage.GetBuffer(szMessage.GetLength()));   
	EncryValues   =   GetValues(iMessage,e,n);   
	EncryMessage.Format(_T("%d"),   EncryValues);  
	
	return EncryMessage;   
}  
 
//获取与Itemp的素数   
int CRSA::GetSecretKey(int   p,   int   q)   
{   
	int IResult,Itemp;   
	Itemp   =   (p-1)*(q-1);   

	for(IResult=(int)(0.2*Itemp);IResult<Itemp;IResult++)   
		if(IsPrime(IResult))   
		return IResult;
		
	return Itemp;   
}   

//判别是否为素数   
BOOL   CRSA::IsPrime(int   x)   
{   
	int   k;   

	k=int(sqrt(x));   
	for(int i=2; i<=k;i++)   
	{   
		if(x%i==0)           
			break;   
	}   

	if(i>=k+1)                               
		return TRUE;   
	else   
		return FALSE;   
}   
    
/*   
求高次模运算   
输入参数:u表示公开密钥,V为n   
*/   
int   CRSA::GetValues(int iMessage,int   d,int   n)   
{   
	int s,t,u;   

	s=1;   
	t=iMessage;   
	u=d; 
	
	while(u)   
	{   
		if(u&1)   
			s=(s*t)%n;   

		u>>=1;   
		t=(t*t)%n;   
	}   

	return s;   
}   
    
/*   
求模逆元运算---欧几里德拓展算法   
输入参数:u表示t,V为公开密钥   
*/   
void CRSA::ExtBinEuclid(int* u,int* v,int* u1,int* u2,int* u3)   
{   
	int k,t1,t2,t3;   
	if(*u < *v)   
		swap(*u, *v);   

	for(k=0; isEven(*u) && isEven(*v); ++k)   
	{   
		*u   >>=   1;   
		*v   >>=   1;   
	} 
	
	*u1   =   1;   
	*u2   =   0;   
	*u3   =   *u;  
	
	t1   =   *v;   
	t2   =   *u   -   1;   
	t3   =   *v;   

	do   
	{   
		do   
		{   
			if(isEven(*u3))   
			{   
				if(isOdd(*u1)||isOdd(*u2))   
				{   
					*u1   +=   *v;   
					*u2   +=   *u;   
				}  
				
				*u1   >>=   1;   
				*u2   >>=   1;   
				*u3   >>=   1;   
			}   

			if(isEven(t3)   ||   *u3   <   t3)   
			{   
				swap(*u1,t1);   
				swap(*u2,t2);   
				swap(*u3,t3);   
			}   

		}while(isEven(*u3)); 
		
		while(*u1   <   t1   ||   *u2   <   t2)   
		{   
			*u1   +=   *v;   
			*u2   +=   *u;   
		}   

		*u1   -=   t1;   
		*u2   -=   t2;   
		*u3   -=   t3;  
		
	}while(t3   >   0);   

	while(*u1   >=   *v   &&   *u2   >=   *u)   
	{   
		*u1   -=   *v;   
		*u2   -=   *u;   
	}   

	*u1   <<=   k;   
	*u2   <<=   k;   
	*u3   <<=   k;   
}   

BOOL CRSA::isEven(int x) 
{ 
    return !(bool)(x & 0x0001); 
}

BOOL CRSA::isOdd(int dN) 
{ 
	return (bool)(dN & 0x0001); 
} 

void CRSA::swap(int *p1,int *p2)
{
	int p;

	p = *p1;
	*p1 = *p2;
	*p2 = p;
}

void CRSA::swap(int& p1,int& p2)
{
	int p;
	
	p = p1;
	p1 = p2;
	p2 = p;
}


⌨️ 快捷键说明

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