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

📄 main.cpp

📁 RSA公钥加密的基本实现 bmp灰度图片加解密操作包括 RSA 的加减密算法; 素数检测算法;RSA 密钥生成算法; 应用该 RSA 密码体制加、解密; BMP 灰度图的算法; Pollard p-1
💻 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 + -