RSA公鑰密碼的實現(xiàn)
實驗目的:
(1)幫助學生掌握RSA公鑰系統(tǒng)的密鑰生成、加密和解密的過程,能夠利用所學過的編程語言熟悉RSA公鑰加密算法流程與編程實現(xiàn)加密算法。掌握編程實現(xiàn)實際中問題的方法,提高解決問題的能力。
(2)要求學生掌握算法的程序?qū)崿F(xiàn)的方法,能應用密碼算法的特點,設計合適的交互界面,并能正確實現(xiàn)應用編程。
(3)要求學生掌握用規(guī)范的方法書寫實驗報告。
?
實驗儀器設備/實驗環(huán)境
PC Windows操作系統(tǒng),使用Java語言編程,或者使用數(shù)學軟件MATLAB、Maple編程,以下使用的是Visual C++ 6.0
?
實驗原理
RSA公鑰密碼原理
?
實驗內(nèi)容
解密:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
????int p,q;//定義p,q
????cout<<"輸入p、q (p、q為質(zhì)數(shù),不支持過大)"<< endl;//輸出"輸入p、q (p、q為質(zhì)數(shù),不支持過大),并且換行
????cin>>p>>q;//輸入p,q
????int m=p*q;//定義m=p*q
????int n=(p-1)*(q-1);//定義n=(p-1)*(q-1)
????int e;//定義e
????cout<<"輸入e (e與"<<n<<"互質(zhì)) 且 1<e<"<<n<<endl;//輸出 "輸入e (e與"<<n<<"互質(zhì)) 且 1<e<
????cin>>e;//輸入e
????int d;//定義d
????for(d=1;;d++)
????{
????????if(d*e%n==1)
??????????break;
????}
//循環(huán) 找出d使得ed=1(mod n)
????cout<<endl<<endl;
?
????cout<<"{ "<<e<<","<<m<<" }"<<"為公鑰"<<endl;
????cout<<"{ "<<d<<","<<m<<" }"<<"為私鑰"<<endl;
?
????cout<<endl<<endl;
????int after;
????cout<<"輸入密文"<<endl;
????cin>>after;
????int before;
????int i;
????before=after%n;
????for(i=1;i<d;i++)
????????before=(before*after)%m;
????//計算C^d=m(mod n)
????cout<<"明文為"<<endl;
????cout<<before<<endl;
}
結(jié)果:

加密:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
????int p,q;//定義p,q
????cout<<"輸入p、q (p、q為質(zhì)數(shù),不支持過大)"<< endl;//輸出"輸入p、q (p、q為質(zhì)數(shù),不支持過大),并且換行
????cin>>p>>q;//輸入p,q
????int m=p*q;//定義m=p*q
????int n=(p-1)*(q-1);//定義n=(p-1)*(q-1)
????int e;//定義e
????cout<<"輸入e (e與"<<n<<"互質(zhì)) 且 1<e<"<<n<<endl;//輸出 "輸入e (e與"<<n<<"互質(zhì)) 且 1<e<
????cin>>e;//輸入e
????int d;//定義d
????for(d=1;;d++)
????{
????????if(d*e%n==1)
??????????break;
????}
//循環(huán) 找出d使得ed=1(mod n)
????cout<<endl<<endl;
?
????cout<<"{ "<<e<<","<<m<<" }"<<"為公鑰"<<endl;
????cout<<"{ "<<d<<","<<m<<" }"<<"為私鑰"<<endl;
?
????cout<<endl<<endl;
????int before;
????cout<<"輸入明文"<<endl;
????cin>>before;
????int after;
????int i;
????after=before%n;
????for(i=1;i<e;i++)
????????after=(after*before)%m;
????//計算m^e=C(mod n)
????cout<<"密文為"<<endl;
????cout<<after<<endl;
}
結(jié)果:

實驗心得
RSA算法基于一個十分簡單的數(shù)論事實:將兩個大素數(shù)相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
整個加密解密的過程大概是;首先假設甲方要向乙方發(fā)送消息,那么甲方需要對消息加密,乙方需要對消息解密,加密算法分為對稱性和非對稱性2種算法,根據(jù)加密解密所使用的秘鑰相不相同來區(qū)分,我們要討論的RSA算法就是非對稱性的,也就是加密的公鑰和解密的私鑰是不同的。由于公鑰是公開的,可以給別人看到所以不需要保護,只需要保護好私鑰不被竊取即可,通常私鑰的竊取都是在傳輸?shù)倪^程中進行的,所以只要防止私鑰的傳輸就好了。因此甲方發(fā)送消息給乙方,所以乙方產(chǎn)生公鑰和私鑰,之后將公鑰公開,用于甲方對消息加密,然后乙方自己擁有私鑰,只需要使用私鑰解密即可。