RSA加密算法实验报告

昆 明 理 工 大 学 理 学 院

信息与计算科学专业  操作性实验报告

年级: 20##级  姓名:    学号:   指导教师:         实验课程名称:  RSA加密算法  开课实验室:  理学楼 210                

实验成绩:

实验内容:

1.实验/作业题目:

用C++builder 实现RSA加密算法

2.实验/作业课时:4个课时

3.实验过程(包括实验环境、实验内容的描述、完成实验要求的知识或技能)

RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数( 大于 100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。 密钥对的产生。选择两个大素数,p 和q 。

计算: n = p * q

然后随机选择加密密钥e,要求 e 和 ( p - 1 ) * ( q - 1 ) 互质。最后,利用Euclid 算法计算解密密钥d, 满足 e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )其中n和d也要互质。数e和n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知道。 

加密信息 m(二进制表示)时,首先把m分成等长数据块 m1 ,m2,..., mi ,块长s,其中 2^s <= n, s 尽可能的大。对应的密文是:ci = mi^e ( mod n ) ( a )
解密时作如下计算:
mi = ci^d ( mod n ) ( b )
RSA 可用于数字签名,方案是用 ( a ) 式签名, ( b )式验证。

4.程序结构(程序中的函数调用关系图)

主要程序代码:

TForm1 *Form1;

int p=113,q=41,e=13,d=937,n=2537,t=2436;

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}

void __fastcall TForm1::FormPaint(TObject *Sender)

{//显示渐变背景

  double y,Step=Height/256.00;

  for(int i=255;i>0;i--)

  {

    Form1->Canvas->Brush->Color=RGB(155,207,20);

    Form1->Canvas->FillRect(Rect(0,int(y),Width,int(y+Step)));

    y=y+Step;

  }

}

void __fastcall TForm1::FormResize(TObject *Sender)

{//更新背景

   Form1->Refresh();

}

int TForm1::candp(int a, int b, int c)          //算法函数

{

        //TODO: Add your source code here

        int r=1;

     b=b+1;

     while(b!=1)

     {

         r=r*a;

         r=r%c;

         b--;

     }

     //printf("%d\n",r);

     return r;

}

void __fastcall TForm1::ButEncrClick(TObject *Sender)           //加密按钮

{

        //int p=43,q=59,e=13,d=937,n=2537,t=2436;

        int m,c;

        char h;

        AnsiString str=EdM->Text;

        AnsiString str1="",str2="";

        if(str=="")

        {

                Application->MessageBoxA("错误!加密是需要输入明文的~","提示信息框",MB_ICONASTERISK);

                return;

        }

        for(int i=1;i<=str.Length();i++)

        {

                if((str[i])&0x80)

                {

                        Application->MessageBoxA("对不起,暂不支持中文!","提示信息框",MB_ICONASTERISK);

                        EdM->Text="";

                        return;

                }

                h=str[i];

                m=h;

                c=candp(m,e,n);

                //str1=str1.IntToHex(c,4);

                str1=In2Ch(c);

                str2+=str1;

        }

        EdC->Text=str2;

}

void __fastcall TForm1::ButDecrClick(TObject *Sender)           //解密按钮

{

        int m,c;

        char h[4],s;

        AnsiString str=EdC->Text;

        AnsiString str1="",str2="",str3="";

        if(str=="")

        {

                Application->MessageBoxA("错误!解密是需要输入密文的~","提示信息框",MB_ICONASTERISK);

                return;

        }

        for(int i=1;i<=str.Length();i=i+4)

        {

                 if((str[i])&0x80||(str[i+1])&0x80||(str[i+2])&0x80||(str[i+3])&0x80)

                {

                        Application->MessageBoxA("对不起,暂不支持中文!","提示信息框",MB_ICONASTERISK);

                        EdC->Text="";

                        return;

                }

                h[0]=str[i];

                h[1]=str[i+1];

                h[2]=str[i+2];

                h[3]=str[i+3];

                //c=HexToInt(h);

                c=Ch2In(h);

                m=candp(c,d,n);

                s=m;

                str1=s;

                str2+=str1;

        }

        EdM->Text=str2;

}

void __fastcall TForm1::ButSetClick(TObject *Sender)

{

        PnlSet->Visible=true;

        EdP->Text=IntToStr(p);

        EdQ->Text=IntToStr(q);

        EdN->Text=IntToStr(n);

        EdT->Text=IntToStr(t);

        EdE->Text=IntToStr(e);

        EdD->Text=IntToStr(d);

}

AnsiString TForm1::In2Ch(int x)

{

        char f[4];

        //char* z;

     int temp[4];

     int a,y;

        AnsiString str="",str1="";

        a=94;

     for(int i=0;i<4;i++)

     {

         temp[i]=x%a;

         x/=a;

     }

     for(int j=0;j<4;j++)

     {

                f[j]=temp[3-j]+33;

         //f[j]=CT[temp[3-j]];

                str1=f[j];

                str+=str1;

     }

        //z=f;

        return str;

}

int TForm1::Ch2In(char h[4])

{

        //TODO: Add your source code here

     int y=0,a=94;

     for(int i=3;i>0;i--)

     {

         //h[i]=str[i]-33;

         y=int(y+(h[i]-33)*(pow(a,3-i)));

     }

        return y;

}

void __fastcall TForm1::ButHideClick(TObject *Sender)

{

        PnlSet->Visible=false;

}

int TForm1::fun(int x, int y)

{

        //TODO: Add your source code here

        int tt;

     while(y)

     {

         tt=x;

         x=y;

         y=tt%y;

     }

     if(x==1)

         return 0;

     else

         return 1;

}

void __fastcall TForm1::ButSetPQClick(TObject *Sender)

{

        AnsiString str="";

        int pt,qt,nt,tt,et;

        pt=StrToInt(EdP->Text);

        qt=StrToInt(EdQ->Text);

        for(int i=2;i<=sqrt(pt);i++)

                if(pt%i==0)

                {

                Application->MessageBoxA("p必须是质数,请重输!","错误信息框",MB_ICONASTERISK);

                return;

                }

        for(int i=2;i<=sqrt(qt);i++)

                if(qt%i==0)

                {

                Application->MessageBoxA("q必须是质数,请重输!","提示信息框",MB_ICONASTERISK);

                return;

                }

        nt=pt*qt;

        EdN->Text=IntToStr(nt);

        tt=(pt-1)*(qt-1);

        EdT->Text=IntToStr(tt);

        et=StrToInt(EdE->Text);

        if(et<1||et>t||fun(et,t))

     {

                Application->MessageBoxA("公钥必须大于1小于t,且必须与t互质,请重输!","提示信息框",MB_ICONASTERISK);

                return;

     }

        while(((et*d)%tt)!=1) d++;

        p=pt,q=qt,n=nt,t=tt,e=et;

        //EdD->Text=IntToStr(d);

        PnlSet->Visible=False;

}

void __fastcall TForm1::ButResetClick(TObject *Sender)

{

        p=43,q=59,e=11,d=937,n=2537,t=2436;

        ButSetClick(Form1);

}

5.算法描述、流程图或操作步骤:

加密流程图

6.实验数据和实验结果(用屏幕图形表示,可另加附页)

1、字符串加密

对应的P、Q:

2、字符串解密:

对应的P、Q值:

7.改进建议:

本程序实现了RSA算法的基本原理,但对P、Q的值给定不同的值时,加密算法没问题,但解密的时候老是出现错误,当然解密还是可以解出来的。可能输入的密文对P、Q的值有要求。即,知道密文时,解密不容易解出!

评分标准  学    风--报告格式规范,文字清晰       观察能力--正确描述和理解需要操作的问题

操作能力--正确输入程序,熟悉编程环境   调试能力--熟练使用调试功能解决程序错误

 

第二篇:信息安全-RSA加密算法实验报告

实   验   报   告

学号: 2011221104220026         姓名:孙元喜     

相关推荐