2010安全与保密实验指导书(新).doc
文本预览下载声明
实验指导一 密码体制的编程实现
一、实验要求和目的
(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(
显示全部