- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
2010安全与保密实验指导书(新)
实验指导一 密码体制的编程实现
一、实验要求和目的
(1)用VC++实现RSA加解密算法;
(2)加深对RSA加解密算法的理解;
二、实验条件
(1)安装VC++开发环境;
(2)熟悉RSA加解密算法的有关知识;
三、实验时间
2学时
四、实验内容和步骤
RSA加解密算法是公开密钥密码体制的一种加密算法,它不仅可以作为加密算法使用,而且可以作为数字签名和密钥分配与管理。在这种体制中,每个用户有两个密钥:加密密钥PK={e,n}和解秘密钥SK={d,n}。用户把加密密钥PK公开,使得系统中的任何其他用户都可以使用,而对解密密钥SK中的d则保密。
1. 实验的建立
(1)在Windows桌面上选择“开始”|“程序”|“Microsoft Visual Studio 6.0”|“Microsoft Visual C++6.0”命令,进入“Microsoft Visual C++6.0”系统界面。在“Microsoft Visual C++6.0”系统界面中,建立加解密项目并运行之,出现图1所示的程序界面;
图1 程序界面
(2)单击“求随机数N、E”按钮,获得N、D、E三个参数(或者直接输入N、D、E三个参数),得到图2所示的结果;
图2单击“求随机数N、E”按钮后的结果
(3)在第三个文本框中输入待加密的明文,然后单击“加密”按钮,密文出现在第四个文本框中,如图3所示;
图3得到密文
(4)单击“解密”按钮,恢复的明文出现在第四个文本框中,如图4所示;
图4得到明文
2. 重要源代码的说明
(1)选取参数D,求随机数N、E;
void CRSADlg::OnButtonGet()
{ ready=1;
UpdateData(TRUE);
int len=2;
for(int i=0;im_Len;i++){len*=2;}
CTime t0=CTime::GetCurrentTime();
P.Mov(0);
Q.Mov(0);
N.Mov(0);
E.Mov(0);
P.GetPrime(len); //得到两个随机数
Q.GetPrime(len);
N.Mov(P.Mul(Q)); //计算N=P*Q
N.Put(m_N);
P.m_ulValue[0]--;
Q.m_ulValue[0]--;
P.Mov(P.Mul(Q)); //P=(P-1)*(Q-1)
D.Mov(0x10001); //解密密钥D为已知
m_D=10001;
E.Mov(D.Euc(P)); //求与解密密钥D互质的E
E.Put(m_E);
CTime t1=CTime::GetCurrentTime();
CTimeSpan t=t1-t0;
m_OUT.Format(%d,t.GetTotalSeconds());
m_OUT+= 秒;
Q.m_ulValue[0]=0;
UpdateData(FALSE);// TODO: Add your control notification handler code here
}
(2)“加密”按钮对应的程序代码;
void CRSADlg::OnOK()
{ if(ready==0)
{ m_OUT=_T(请先输入或生成N、D、E);
UpdateData(FALSE);
return;
}
UpdateData(TRUE);
if(m_IN.GetLength()256)
{ m_OUT=_T(N不得大于256位);
UpdateData(FALSE);
return;
}
for(int i=0;im_IN.GetLength();i++)
{ if((m_IN[i]0)||
((m_IN[i]9)(m_IN[i]A))||
((m_IN[i]F)(m_IN[i]a))||
(m_IN[i]f))
{ m_OUT=_T(待加密数据必须为0-9或A-F或a-f组成的整数);
UpdateData(FALSE);
return;
}
}
P.Get(m_IN);
if(P.Cmp(N)=0)
{ m_OUT=_T(待加密数据必须小于N);
UpdateData(FALSE);
return;
}
Q.Mov(P.RsaTrans(E,N));
Q.Put(m_OUT);
UpdateData(FALSE);
}
(3)“解密”按钮对应的程序代码;
void CRSADlg::OnDecrypt()
{ if(
文档评论(0)