昆 明 理 工 大 学 理 学 院
信息与计算科学专业 操作性实验报告
年级: 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的值有要求。即,知道密文时,解密不容易解出!
评分标准 学 风--报告格式规范,文字清晰 观察能力--正确描述和理解需要操作的问题
操作能力--正确输入程序,熟悉编程环境 调试能力--熟练使用调试功能解决程序错误
实 验 报 告
学号: 2011221104220026 姓名:孙元喜
算法设计与分析实验报告班级姓名学号年月日目录实验一二分查找程序实现03页实验二棋盘覆盖问题分治法08页实验三01背包问题的动态规划…
算法设计课程报告课题名称算法设计与实现课题负责人名学号张樱紫0743111317同组成员名单角色无指导教师左劼评阅成绩评阅意见提交…
遗传算法实验报告姓名:**学号:**一、实验目的:熟悉和掌握遗传算法的运行机制和求解的基本方法。遗传算法是一种基于空间搜索的算法,…
1hanoi塔packagesyyimportjavautilpublicclassHanoipublicstaticvoidmo…
四川大学计算机学院软件学院实验报告学号姓名专业班级第13周一简介RSA公开密钥密码体制所谓的公开密钥密码体制就是使用不同的加密密钥…
现代密码学实验报告题目RSA算法的实现过程一实验目的简单实现RSA过程通过OpenSSL命令编辑器实现发送方对明文进行加密签名接受…
实验二非对称密码算法RSA一实验目的通过实际编程了解非对称密码算法RSA的加密和解密过程加深对非对称密码算法的认识二实验环境运行W…
网络安全作业题目DES学号专业及班级姓名日期20xx0414加密算法网络工程0902班一DES简介DES是一个分组密码算法使用64…