📄 work.cpp
字号:
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
#define TRUE 1
#define FALSE 0
void decode(void);
void encode(void);
void get_prime( int *val);
int getE( int PHI);
int get_common_denom(int e, int PHI);
int getD( int e, int PHI);
int decrypt(int c,int n, int d);
int Reverse(int m,int u);
int gcd(int n1,int n2);
bool PrimeTest(int b,int n);
int MoMiMutiply(int x,int r,int p);
void main(void)
{
int choice;
cout<<"1--Encode"<<endl<<"2--Decode"<<endl;
cin>>choice;
if(choice==1)
{
encode();
}
else if(choice==2)
{
decode();
}
}
void encode(void)
{
FILE *fp1,*fp2,*fp3;
fp1=fopen("key.txt","wt");
fp2=fopen("1.bmp","rb");
fp3=fopen("2.bmp","wb");
int a,b,n,e,PHI,d,m,c;
int i;
unsigned char chr;
get_prime(&a);
get_prime(&b);
n=a*b;
PHI=(a-1)*(b-1);
e=getE(PHI);
d= Reverse(PHI,e);
fprintf(fp1,"%d %d %d %d %d %d",a,b,n,PHI,e,d);
for(i=0;i<140;i++)
{
chr=fgetc(fp2);
fputc(chr,fp3);
}
i=0;
while(!feof(fp2))
{
i++;
chr=fgetc(fp2);
m=(int)chr;
c=(int)pow(m,e) % n ;
c=MoMiMutiply(m,e,n);
chr=(unsigned char)c;
fputc(chr,fp3);
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
void decode(void)
{
FILE *fp1,*fp2,*fp3;
fp1=fopen("key.txt","rt");
fp2=fopen("2.bmp","rb");
fp3=fopen("3.bmp","wb");
int a,b,n,e,PHI,d,m,c;
int i;
unsigned char chr;
fscanf(fp1,"%d",&a);
fscanf(fp1,"%d",&b);
fscanf(fp1,"%d",&n);
fscanf(fp1,"%d",&PHI);
fscanf(fp1,"%d",&e);
fscanf(fp1,"%d",&d);
for(i=0;i<140;i++)
{
chr=fgetc(fp2);
fputc(chr,fp3);
}
while(!feof(fp2))
{
chr=fgetc(fp2);
c=(int)chr;
m=decrypt(c,n,d);
chr=(unsigned char)m;
fputc(chr,fp3);
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
int MoMiMutiply(int x,int r,int p)
{
int a,b,c;
a=x;
b=r;
c=1;
while (b!=0)
{
if ((b&0x01)==0)
{
b=b/2;
a=(a*a)%p;
}
else
{
b=b-1;
c=(a*c)%p;
}
}
return c;
}
bool PrimeTest(int b,int n)
{
int m=1;
int l=0;
int V;
int i;
while (m<(n-1)){m=m*2;l++;}
if ((b<2)||(b>=(n-1))) return (false);
V=MoMiMutiply(b,m,n);
if (V==1) return (true);
i=1;
do
{
if (V==(n-1)) return (true);
if (i==l) return (false);
V=MoMiMutiply(V,2,n);
i++;
}
while (1);
return(false);
}
int gcd(int n1,int n2)
{
int c;
int t;
if ((n1<0) || (n2<=0)) return 0;
//s1
c=0;
//s2
while ((n1%2==0)&&(n2%2==0))
{
n1=n1/2;
n2=n2/2;
c++;
}
//s3
if (n2%2==0)
{
t=n1;
n1=n2;
n2=t;
}
do
{
//s4
while (n1%2==0)
{
n1=n1/2;
}
//s5
if ((long)(n1-n2)<0)
{
t=n1;
n1=n2;
n2=t;
}
//s6
n1=(n1-n2)/2;
}
while (n1!=0);
return (n2<<c);
}
int Reverse(int m,int u)
{
int n1=m;
int n2=u;
long b1=0;
long b2=1;
long t;
int q;
int r;
do
{
q=n1/n2;
r=n1-q*n2;
if (r==0) break;
n1=n2;
n2=r;
t=b2;
b2=b1-q*b2;
b1=t;
}
while (1);
if (n2!=1)
return (0); //不存在
if (b2<0)
return (b2+m);
else
return (b2);
}
//解密
int decrypt(int c,int n, int d)
{
int i,g,f;
if (d%2==0) g=1; else g=c;
for (i=1;i<=d/2;i++)
{
f=c*c % n;
g=f*g % n;
}
return(g);
}
int getD( int e, int PHI)
{
int u[3]={1,0,PHI};
int v[3]={0,1,e};
int q,temp1,temp2,temp3;
while (v[2]!=0)
{
q=floor(u[2]/v[2]);
temp1=u[0]-q*v[0];
temp2=u[1]-q*v[1];
temp3=u[2]-q*v[2];
u[0]=v[0];
u[1]=v[1];
u[2]=v[2];
v[0]=temp1;
v[1]=temp2;
v[2]=temp3;
}
if (u[1]<0)
return(u[1]+PHI);
else
return(u[1]);
}
int get_common_denom(int e, int PHI)
{
int great,temp,a;
if (e >PHI)
{
while (e % PHI != 0)
{
temp= e % PHI;
e =PHI;
PHI = temp;
}
great = PHI;
}
else
{
while (PHI % e != 0)
{
a = PHI % e;
PHI = e;
e = a;
}
great = e;
}
return(great);
}
int getE( int PHI)
{
int great=0, e=2;
while (great!=1)
{
e=e+1;
great = gcd(e,PHI);
}
return(e);
}
void get_prime( int *val)
{
#define NO_PRIMES 39
int primes[NO_PRIMES]={3,5,7,11,13,
17,19,23,29,31,
37,41,43,53,59,
61,67,71,101,103,97,
107,109,113,127,131,
137,139,149,151,157,
163,167,173,179,181,
191,193,197};
int prime,i;
do
{
prime=FALSE;
printf("Enter a prime number >> ");
scanf("%ld",val);
for (i=0;i<NO_PRIMES;i++)
if (*val==primes[i])
prime=TRUE;
}
while (prime==FALSE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -