📄 main.cpp
字号:
#include "RSA.h"#include <stdio.h>#include <stdlib.h>#include <iostream>using namespace std;long getBigPrime(long *p, long PrimeSize1, long PrimeSize2);//get two Big Prime; if get return 1, noget return -1long Encrypt(long *p, long n, long n_fai, long b, long a);//Encrypt function
long Decrypt(long *p, long n, long n_fai, long b, long a);//Decrypt function
long getb(long n_fai);//get b
long getb_1(long n_fai,long b);//get b_1
int main(){//Parameter of RSA long p[2];//two big prime,p=p[0],q=p[1] long n;//n=p*q long n_fai;//n_fai=(p-1)*(q-1) long b;//1<=b<=n_fai, gcd(b,n_fai)==1 long a;//a=b_1 (mod n_fai)//get two Big Prime if (getBigPrime(p,128,256) == -1) cout << "Get Prime Wrong!" <<endl;
cout<<"!!!!!!!!!"<<endl;// cout << p[0] << p[1] <<endl;
//get b && a,a=b_1
n=p[0]*p[1];
n_fai=(p[0]-1)*(p[1]-1);
cout<<"The n is:"<<n<<endl;
cout<<"The n_fai is:"<<n_fai<<endl;
// srand((unsigned)time(NULL));
while(1)
{
b=getb(n_fai);
// cout<<"The Rondom b is:"<<b<<endl;
if ((a=getb_1(n_fai,b))>0)
break;
}
/*
cout<<endl;
cout<<"The Rondom b is:"<<b<<endl;
cout<<"The Rondom a is:"<<a<<endl;
cout<<"The a*b%n_fai is:"<<a*b%n_fai<<endl;
*/
//En_Decrypt function
cout<<"******Welcome to my RSA design******"<<endl;
cout<<"I will encrypt(decrypt) the file Image.bmp"<<endl;
Encrypt(p, n, n_fai, b, a);
Decrypt(p, n, n_fai, b, a); return 0;}long Encrypt(long *p, long n, long n_fai, long b, long a)
//En_Decrypt function
{
long plain,cipher,header[62];
// int len;
FILE *iobmp=fopen("Image.bmp","rb");
FILE *RSAbmp=fopen("RSA.bmp","wb");
if (iobmp==NULL)
{
cout<<"Open File Image.bmp Error!"<<endl;
return 0;
}
if (RSAbmp==NULL)
{
cout<<"Create File RSA.bmp Error!"<<endl;
return 0;
}
fread(header,sizeof(char),62,iobmp);
fwrite(header,sizeof(char),62,RSAbmp);
cout<<"Encrypting..."<<endl<<"Please Waiting..."<<endl;
long b_Out[100];
long b_bits=NumberToBinary(b_Out, b);
while ((plain=fgetc(iobmp))!=EOF)
{
// printf("%ld\n",plain); plain+=128;
cipher=SquareMultiply(b_Out, n, plain, b_bits);
fwrite(&cipher,sizeof(cipher),1,RSAbmp);
}
cout<<"Encrypting Finish..."<<endl<<"Devrypting ..."<<"Please Waiting..."<<endl;
fclose(iobmp);
fclose(RSAbmp);
return 0;
}
long Decrypt(long *p, long n, long n_fai, long b, long a)
//En_Decrypt function
{
long plain,cipher,header[62];
FILE *RSAbmp=fopen("RSA.bmp","rb");
FILE *RSAbackbmp=fopen("RSAback.bmp","wb");
if (RSAbmp==NULL)
{
cout<<"Open CipherFile RSA.bmp Error!"<<endl;
return 0;
}
if (RSAbackbmp==NULL)
{
cout<<"Create PlainBackFile RSAback.bmp Error!"<<endl;
return 0;
}
fread(header,sizeof(char),62,RSAbmp);
fwrite(header,sizeof(char),62,RSAbackbmp);
cout<<"Encrypting..."<<endl<<"Please Waiting..."<<endl;
long a_Out[100];
long a_bits=NumberToBinary(a_Out, a);
while (fread(&cipher,sizeof(cipher),1,RSAbmp)!=0)
{
plain=SquareMultiply(a_Out, n, cipher, a_bits);
fputc(plain-128,RSAbackbmp);
}
cout<<"Decrypt Finish"<<endl;
fclose(RSAbmp);
fclose(RSAbackbmp);
return 0;
}
long getb_1(long n_fai,long b)
//get b_1
{
long a;
if((a=MultiplicativeInverse(n_fai, b))==-1)
return -1;
else return a;
}
long getb(long n_fai)
//get b,return b{
long tempb[MAX_N];
for (long i=0; i<n_fai; i++)
tempb[i]=i;
return tempb[rand()%n_fai];
}
long getBigPrime(long *p, long PrimeSize1, long PrimeSize2)//get two Big Prime{
srand((unsigned)time(NULL)); while (1) {
again_a: long a = rand()%PrimeSize1+PrimeSize1;
if (OddEvenTest(a)==2)
goto again_a; cout <<"The Random Number a is : "<<a<<endl; for (long i=PrimeSize1; i<PrimeSize1*2; i++) { if ((p[0]=MillerRabin(a)) > 0) { cout << "The Prime p:"<< p[0] <<endl; break; } else
{
a=a+2;
p[0]=0;
} }
break; } while (1) {
again_b: long b = rand()%PrimeSize2+PrimeSize2; if (OddEvenTest(b)==2)
goto again_b;
cout <<"The Random Number b is : "<<b<<endl;
for (long i=PrimeSize2; i<PrimeSize2*2; i++) { if ((p[1]=MillerRabin(b)) > 0) {
cout << "The Prime q:"<<p[1] <<endl; break; } else
{
b=b+2;
p[1]=0;
} }
break; } if (p[0]>0 && p[1]>0) return 1; else return -1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -