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

📄 work.cpp

📁 RSA做的加密BMP的程序。本来RSA不是做这个的
💻 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 + -