📄 rsa.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 + -