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