信息安全技术实验四 公钥加密实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息安全技术实验四公钥加密实验
一实验目标
请大家使用MFC完成程序的调试和实验内容。
二实验内容
1 RSA简介
1)公钥加密算法:
加密使用一个密钥(公钥),解密使用另一个密钥(私钥),这样的算法称为公钥加密算法。
2)RSA介绍
RSA是目前使用最广泛的公钥加密算法,是Rivest, Shamir,Adleman (RSA) 三个人,1977年发明出来的。
是最典型的公钥密码体制
算法基于单向陷门函数的原理。
以模幂运算为基本运算。
安全性基于大数因子分解的困难性(将一个充分大的正整数分解成两个素数之积几乎是不可能的)。
数学基础是著名的欧拉(Euler)数论。
2 RSA的实现
1)RSA数学表达
1.1)RSA初始化步骤
a)对于每个用户都生成自己的公钥\私钥对:
b)选择两个随机大素数(~100 digit,10进制), p, q
c)计算模数N=p.q
d)选择一个随机加密密钥匙e : e<N, gcd(e,ø(N))=1
e)解下列同余方程,求解密密钥d:
f) e.d=1 mod ø(N) and 0<=d<=N
g)私钥是{d,p,q},是自己保留的,秘密的
h)公钥是K={e,N},是公开发布的,任何人都可以获得。
1.2) RSA加密过程
a)要加密消息M,发送者要得到接收者的公钥Kr={er,Nr} (注释r=receiver)
b)计算: C=M er mod Nr, where 0<=M<N
c)将密文C发送给接收者
1.3)RSA解密过程
a)为解密C,接收者使用私钥K-1r={d,p,q}
b)计算得出: M=C d mod Nr
1.4)其中,私钥d的计算可以使用下列公式
对满足方程a x ≡ 1 mod r的X:
x=aφ(r)-1 mod r
2)RSA的算法程序:
2.1) 在RSA加解密算法Dlg.h文件中定义了p,q,n,e,d等变量public:
CBigInt Q;
CBigInt P;
CBigInt N;
CBigInt E;
CBigInt D;
2.2) 主体代码,实现数据的RSA加密
//RSA加密
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;i<m_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));//RSA加密实现,调用P.RsaTrans(E,N) 把P加密成Q,P是明文,Q是密文Q.Put(m_OUT); //Q输出赋值给变量m_OUT, 这个是与界面中的加密/解密输出结果文本框对应的变量UpdateData(FALSE); //FALSE表示,把m_OUT的值输出到界面显示。
}
//RSA解密
void CRSADlg::OnDecrypt()
{
if((ready==0)||(Q.m_ulValue[0]==0))
{
m_OUT=_T("请先进行加密");
UpdateData(FALSE);
return;
}
Q.Get(m_OUT);
P.Mov(Q.RsaTrans(D,N));
P.Put(m_OUT);
UpdateData(FALSE);// TODO: Add your control notification handler code here
}
2.3) 程序调试方法
a) 解压到一个目录下:
b)打开vc++6.0
c)打开工作区,在英文版中,是“open workspace”d)选定目录
e)选中相应的dsw文件
f)观察onOK代码,是主要的代码完成RSA加密操作
g)调试程序
三注意事项
1. 搞清楚Put,Get,和Mov等函数的作用
2. 加密和解密中数据都是16进制的,即0-9,A-F的字符,不可以使用其他字符。
四、问题
1 请说明Q.Mov(P.RsaTrans(E,N)); 语句中的P,Q ,E ,N 代表什么数或什么意思?
答:语句中的P代表输入的明文,Q代表的是明文P加密后的密文,E代表的是输入的公钥,N代表的是两个素数的积。
2 请说明P.Mov(Q.RsaTrans(D,N)); 语句中的P,Q ,D ,N 代表什么数或什么意思?
答:语句中的P代表的是解密后的明文,Q代表的是待解密的密文,D代表的是私钥,N代表的是两个素数的积。
3 请举出实例说明,P,Q,E,D,N代表的数
实例如下:输入两个素数的积N=33(p=3,q=11),公钥E=7,私钥D=3,明文P为8,通过RSA加密算法(十六进制)得出Q=20。
如下图
4 请说明RSA加密和解密中RsaTrans的作用
答:RSA加密中RsaTrans的作用是对明文P进行加密(求明文对公钥的乘方的模)得到密文Q,即Q=P E mod N;而RSA解密中RsaTrans的作用是对密文Q进行解密(求密文对私钥的乘方的模)得到明文P,即P=Q D mod N。
5 如何可以实现对10进制或2进制数据的加密和解密?(选做)
答:只要对输入输出的全部数值采用十进制,也就是使用Get和Put方法时采用十进制的即可。
需要修改的代码如下:
方法void CRSADlg::OnButtonGet()中语句:
N.Get(m_N,10);
D.Get(m_D,10);
E.Get(m_E,10);
方法void CRSADlg::OnButtonGet()中语句:
P.GetPrime(10);
Q.GetPrime(10);
N.Put(m_N,10);
D.Mov(10001);
E.Put(m_E,10);
方法void CRSADlg::OnOK()中语句:
P.Get(m_IN,10);
Q.Put(m_OUT,10);
方法void CRSADlg::OnDecrypt()中语句:
Q.Get(m_OUT,10);
P.Put(m_OUT,10);
实验例子结果截图如下:
对应的解密如下:
下面是随机N、E的例子截图:
五、附录
RSA加解密算法。