




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第C++實現(xiàn)RSA加密解密算法是示例代碼目錄一、什么是RSA算法1.對稱加密2.非對稱加密3.非對稱加密的應(yīng)用二、RSA算法的基礎(chǔ)操作步驟1.生成公鑰和私鑰2.用公鑰加密信息3.用私鑰解密信息三、AC代碼四、RSA算法的測試
一、什么是RSA算法
在計算機中常用的加密算法分為兩類:對稱加密算法和非對稱加密算法。
1.對稱加密
在對稱加密技術(shù)中,對信息的加密和解密都使用了相同的密鑰Key,也就是說使用同一個密鑰Key對數(shù)據(jù)進行加密和解密。這種加密方法可簡化加解密的處理過程,信息交換雙方都不必彼此研究和交換專用的加解米算法。如果在交換階段,密鑰Key沒有泄露,那么加密數(shù)據(jù)的機密性和報文的完整性就可以得到保證。
2.非對稱加密
在非對稱加密中,不再只有一個密鑰Key了。在非對稱加密算法中,密鑰被分解為一對,一個稱為公開密鑰,另一個稱為私有密鑰。對于公鑰,可以通過非保密方式向他人公開,而私鑰則由解密方保密,不對別人公開。
3.非對稱加密的應(yīng)用
由于非對稱加密方式可以使通信雙方無需事先交換密鑰就可以建立安全通信,因此被廣泛應(yīng)用于身份認證、數(shù)字簽名、等信息交換領(lǐng)域。其中最具有代表性的非對稱加密方式就是RSA公鑰密碼體制。
二、RSA算法的基礎(chǔ)操作步驟
1.生成公鑰和私鑰
生成公鑰PK和私鑰SK的步驟如下:
(1)隨意選擇兩個大的素數(shù)P、Q,P不等于Q。
此處在算法實現(xiàn)中需要快速的判斷P、Q是否為素數(shù),代碼如下:
llprimeNum(llnum)//判斷素數(shù)
if(num==1||num==0)
return0;
for(inti=2;i*i=num;i++)
if(num%i==0)
//不是素數(shù)返回0
return0;
return1;//是素數(shù)返回1
}
(2)將P、Q兩個素數(shù)相乘得到一個N,即N=PQ
(3)將P、Q分別減一,再相乘,得到一個數(shù)T,即T=(Q-1)*(P-1)
(4)選擇一個整數(shù)E,作為一個密鑰,使E與T互質(zhì)(即E與T的最大公約數(shù)為1),且E必須小于T
此處在算法實現(xiàn)中需要對E與T進行互質(zhì)的判斷(最大公約數(shù)為1)
//判斷兩個數(shù)是否互素
llcoprime(lla,llb)//判斷互質(zhì)
llt;
if(ab)
t=a;
a=b;
b=t;
while(a%b)
t=b;
b=a%b;
a=t;
//返回值為1,則a,b互素
returnb;
}
(5)根據(jù)公式DEmodT=1,計算出D的值,作為另一個密鑰。
此時根據(jù)算法,逆向求D
d=1;
//求e的乘法逆
while(((e*d)%t)!=1)
d++;
(6)通過以上的步驟就可以求出N,E,D這三個數(shù)據(jù),其中(N,E)作為公鑰,(N,D)作為私鑰。
(7)生成公鑰和私鑰后,就可以對外發(fā)布了,其中RSA算法的詳細的流程圖如下:
2.用公鑰加密信息
發(fā)送信息的一方收到公鑰PK后,就可以通過公鑰PK對數(shù)據(jù)進行加密,加密的操作步驟如下圖所示,其中明文為:M,密文為:C
明文:M
加密:
密文:C
其中加密的算法,先進行密文的取余運算在加密,代碼如下:
//計算密文
llcandp(llb,llp,llk)//b--明文或密文p--指數(shù)(e/d)k--模數(shù)
if(p==1)
returnb%k;
if(p==2)
returnb*b%k;
if(p%2==0)
llsum=candp(b,p/2,k);
returnsum*sum%k;
if(p%2==1)
llsun=candp(b,p/2,k);
returnsun*sun*b%k;
}
在進行加密運算
llencryption()
lln,e,x,y;
cout"請輸入公鑰(e,n)"endl;
cinen;
cout"請輸入明文:(明文需小于"n")"endl;//計算密文
cinx;
y=candp(x,e,n);
cout"密文為:"yendl;
return0;
3.用私鑰解密信息
接收方持有私鑰(N,D)在接受到密文C后,既可以通過私鑰解密,得到明文M,解密過程如下:
密文:C
解密:
明文:M
其中解密算法,先產(chǎn)生密鑰Key算法:
llkey()
llp,q,t,n,e,d;
cout"請輸入兩個素數(shù)p,q:"endl;//輸入兩個素數(shù)q,p
cinpq;
if(primeNum(p)==0||primeNum(q)==0)
cout"輸入的p或q不是素數(shù)"endl;
return0;
n=p*q;
//t為n的歐拉函數(shù)
t=(p-1)*(q-1);
cout"請輸入密鑰e:"endl;
cine;
d=1;
//求e的乘法逆
while(((e*d)%t)!=1)
d++;
cout"n=p*q="nendl;
cout"t=(p-1)*(q-1)="tendl;
cout("公鑰(e,n)為:(")e","n")"endl;
cout("私鑰(d,n)為:(")d","n")"endl;
return0;
}
在進行解密:
lldecode()
lln,d,x,y;
cout"請輸入私鑰(d,n)"endl;
cindn;
cout"請輸入密文:";//計算密文
ciny;
x=candp(y,d,n);
cout"明文為:"xendl;
return0;
三、AC代碼
新建一個頭文件RSA.h
#pragmaonce
#includestdio.h
#includeiostream
#includestdlib.h
#includealgorithm
#includecmath
usingnamespacestd;
typedeflonglongll;
//判斷素數(shù)
llprimeNum(llnum);
//判斷互質(zhì)
llcoprime(lla,llb);
//計算密文
llcandp(llb,llp,llk);
//生成密鑰
llkey();
llencryption();
lldecode();
//菜單
voidmenu();
將函數(shù)寫在RSA.cpp中,用于主函數(shù)RSA()的調(diào)用代碼如下:
#define_CRT_SECURE_NO_WARNINGS1
#include"RSA.h"
voidmenu()
printf("------------------------------------------\n");
printf("*****請選擇所需功能*****\n");
printf("*****1.生成鑰匙*****\n");
printf("*****2.加密*****\n");
printf("*****3.解密*****\n");
printf("*****4.退出*****\n");
printf("------------------------------------------\n");
llprimeNum(llnum)//判斷素數(shù)
if(num==1||num==0)
return0;
for(inti=2;i*i=num;i++)
if(num%i==0)
//不是素數(shù)返回0
return0;
return1;//是素數(shù)返回1
//判斷兩個數(shù)是否互素
llcoprime(lla,llb)//判斷互質(zhì)
llt;
if(ab)
t=a;
a=b;
b=t;
while(a%b)
t=b;
b=a%b;
a=t;
//返回值為1,則a,b互素
returnb;
//計算密文
llcandp(llb,llp,llk)//b--明文或密文p--指數(shù)(e/d)k--模數(shù)
if(p==1)
returnb%k;
if(p==2)
returnb*b%k;
if(p%2==0)
llsum=candp(b,p/2,k);
returnsum*sum%k;
if(p%2==1)
llsun=candp(b,p/2,k);
returnsun*sun*b%k;
//生成密鑰
llkey()
llp,q,t,n,e,d;
cout"請輸入兩個素數(shù)p,q:"endl;//輸入兩個素數(shù)q,p
cinpq;
if(primeNum(p)==0||primeNum(q)==0)
cout"輸入的p或q不是素數(shù)"endl;
return0;
n=p*q;
//t為n的歐拉函數(shù)
t=(p-1)*(q-1);
cout"請輸入密鑰e:"endl;
cine;
d=1;
//求e的乘法逆
while(((e*d)%t)!=1)
d++;
cout"n=p*q="nendl;
cout"t=(p-1)*(q-1)="tendl;
cout("公鑰(e,n)為:(")e","n")"endl;
cout("私鑰(d,n)為:(")d","n")"endl;
return0;
llencryption()
lln,e,x,y;
cout"請輸入公鑰(e,n)"endl;
cinen;
cout"請輸入明文:(明文需小于"n")"endl;//計算密文
cinx;
y=candp(x,e,n);
cout"密文為:"yendl;
return0;
lldecode()
lln,d,x,y;
cout"請輸入私鑰(d,n)"endl;
cindn;
cout"請輸入密文:";//計算密文
ciny;
x=candp(y,d,n);
cout"明文為:"xendl;
return0;
}
在寫出主函數(shù)test.c,對上面的函數(shù)進行調(diào)用即可:
#include"RSA.h"
voidRSA()
while(1)
menu();
lli=0;
cini;
switch(i)
case1:
key();
break;
case2:
encryption();
break;
case3:
decode();
break;
case4:
exit(0);
default:
cout"輸入錯誤,請重新輸入"endl;
voidmenu1()
printf("******************************************\n");
printf("******************************************\n");
printf("*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年計算機:IT.程序員職業(yè)技能資格知識考試題與答案
- 主題婚禮策劃與流程
- 全科醫(yī)學(xué)轉(zhuǎn)崗培訓(xùn)課件
- 宣傳信息工作培訓(xùn)
- 個人能力培訓(xùn)教程課件
- 物業(yè)安全人員崗前培訓(xùn)
- 園林景觀設(shè)計與施工培訓(xùn)課件
- 車輛維修報賬合同協(xié)議
- 《金融投資機構(gòu)介紹》課件
- 《臨床診斷膽石癥現(xiàn)象》課件
- XX公司事故隱患內(nèi)部報告獎勵制度1
- 附件6工貿(mào)高風(fēng)險企業(yè)高危領(lǐng)域較大以上安全風(fēng)險管控清單
- 國際貿(mào)易公司后勤管理崗位職責(zé)
- 中國礦業(yè)大學(xué)專職輔導(dǎo)員招聘真題2024
- 骨科手術(shù)切口感染的預(yù)防與控制
- 2025年保安證考試答題技巧與試題答案
- 透析營養(yǎng)不良相關(guān)知識
- 中級宏觀經(jīng)濟學(xué)知到課后答案智慧樹章節(jié)測試答案2025年春浙江大學(xué)
- 2025 ACC-AHA急性冠脈綜合征患者管理指南解讀課件
- 智慧樹知到《形勢與政策(北京大學(xué))》2025春期末答案
- 綠化工程施工專項施工方案
評論
0/150
提交評論