




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C++實(shí)現(xiàn)RSA加密解密算法是示例代碼目錄一、什么是RSA算法1.對(duì)稱加密2.非對(duì)稱加密3.非對(duì)稱加密的應(yīng)用二、RSA算法的基礎(chǔ)操作步驟1.生成公鑰和私鑰2.用公鑰加密信息3.用私鑰解密信息三、AC代碼四、RSA算法的測(cè)試
一、什么是RSA算法
在計(jì)算機(jī)中常用的加密算法分為兩類:對(duì)稱加密算法和非對(duì)稱加密算法。
1.對(duì)稱加密
在對(duì)稱加密技術(shù)中,對(duì)信息的加密和解密都使用了相同的密鑰Key,也就是說(shuō)使用同一個(gè)密鑰Key對(duì)數(shù)據(jù)進(jìn)行加密和解密。這種加密方法可簡(jiǎn)化加解密的處理過(guò)程,信息交換雙方都不必彼此研究和交換專用的加解米算法。如果在交換階段,密鑰Key沒(méi)有泄露,那么加密數(shù)據(jù)的機(jī)密性和報(bào)文的完整性就可以得到保證。
2.非對(duì)稱加密
在非對(duì)稱加密中,不再只有一個(gè)密鑰Key了。在非對(duì)稱加密算法中,密鑰被分解為一對(duì),一個(gè)稱為公開(kāi)密鑰,另一個(gè)稱為私有密鑰。對(duì)于公鑰,可以通過(guò)非保密方式向他人公開(kāi),而私鑰則由解密方保密,不對(duì)別人公開(kāi)。
3.非對(duì)稱加密的應(yīng)用
由于非對(duì)稱加密方式可以使通信雙方無(wú)需事先交換密鑰就可以建立安全通信,因此被廣泛應(yīng)用于身份認(rèn)證、數(shù)字簽名、等信息交換領(lǐng)域。其中最具有代表性的非對(duì)稱加密方式就是RSA公鑰密碼體制。
二、RSA算法的基礎(chǔ)操作步驟
1.生成公鑰和私鑰
生成公鑰PK和私鑰SK的步驟如下:
(1)隨意選擇兩個(gè)大的素?cái)?shù)P、Q,P不等于Q。
此處在算法實(shí)現(xiàn)中需要快速的判斷P、Q是否為素?cái)?shù),代碼如下:
llprimeNum(llnum)//判斷素?cái)?shù)
if(num==1||num==0)
return0;
for(inti=2;i*i=num;i++)
if(num%i==0)
//不是素?cái)?shù)返回0
return0;
return1;//是素?cái)?shù)返回1
}
(2)將P、Q兩個(gè)素?cái)?shù)相乘得到一個(gè)N,即N=PQ
(3)將P、Q分別減一,再相乘,得到一個(gè)數(shù)T,即T=(Q-1)*(P-1)
(4)選擇一個(gè)整數(shù)E,作為一個(gè)密鑰,使E與T互質(zhì)(即E與T的最大公約數(shù)為1),且E必須小于T
此處在算法實(shí)現(xiàn)中需要對(duì)E與T進(jìn)行互質(zhì)的判斷(最大公約數(shù)為1)
//判斷兩個(gè)數(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,計(jì)算出D的值,作為另一個(gè)密鑰。
此時(shí)根據(jù)算法,逆向求D
d=1;
//求e的乘法逆
while(((e*d)%t)!=1)
d++;
(6)通過(guò)以上的步驟就可以求出N,E,D這三個(gè)數(shù)據(jù),其中(N,E)作為公鑰,(N,D)作為私鑰。
(7)生成公鑰和私鑰后,就可以對(duì)外發(fā)布了,其中RSA算法的詳細(xì)的流程圖如下:
2.用公鑰加密信息
發(fā)送信息的一方收到公鑰PK后,就可以通過(guò)公鑰PK對(duì)數(shù)據(jù)進(jìn)行加密,加密的操作步驟如下圖所示,其中明文為:M,密文為:C
明文:M
加密:
密文:C
其中加密的算法,先進(jìn)行密文的取余運(yùn)算在加密,代碼如下:
//計(jì)算密文
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;
}
在進(jìn)行加密運(yùn)算
llencryption()
lln,e,x,y;
cout"請(qǐng)輸入公鑰(e,n)"endl;
cinen;
cout"請(qǐng)輸入明文:(明文需小于"n")"endl;//計(jì)算密文
cinx;
y=candp(x,e,n);
cout"密文為:"yendl;
return0;
3.用私鑰解密信息
接收方持有私鑰(N,D)在接受到密文C后,既可以通過(guò)私鑰解密,得到明文M,解密過(guò)程如下:
密文:C
解密:
明文:M
其中解密算法,先產(chǎn)生密鑰Key算法:
llkey()
llp,q,t,n,e,d;
cout"請(qǐng)輸入兩個(gè)素?cái)?shù)p,q:"endl;//輸入兩個(gè)素?cái)?shù)q,p
cinpq;
if(primeNum(p)==0||primeNum(q)==0)
cout"輸入的p或q不是素?cái)?shù)"endl;
return0;
n=p*q;
//t為n的歐拉函數(shù)
t=(p-1)*(q-1);
cout"請(qǐng)輸入密鑰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;
}
在進(jìn)行解密:
lldecode()
lln,d,x,y;
cout"請(qǐng)輸入私鑰(d,n)"endl;
cindn;
cout"請(qǐng)輸入密文:";//計(jì)算密文
ciny;
x=candp(y,d,n);
cout"明文為:"xendl;
return0;
三、AC代碼
新建一個(gè)頭文件RSA.h
#pragmaonce
#includestdio.h
#includeiostream
#includestdlib.h
#includealgorithm
#includecmath
usingnamespacestd;
typedeflonglongll;
//判斷素?cái)?shù)
llprimeNum(llnum);
//判斷互質(zhì)
llcoprime(lla,llb);
//計(jì)算密文
llcandp(llb,llp,llk);
//生成密鑰
llkey();
llencryption();
lldecode();
//菜單
voidmenu();
將函數(shù)寫(xiě)在RSA.cpp中,用于主函數(shù)RSA()的調(diào)用代碼如下:
#define_CRT_SECURE_NO_WARNINGS1
#include"RSA.h"
voidmenu()
printf("------------------------------------------\n");
printf("*****請(qǐng)選擇所需功能*****\n");
printf("*****1.生成鑰匙*****\n");
printf("*****2.加密*****\n");
printf("*****3.解密*****\n");
printf("*****4.退出*****\n");
printf("------------------------------------------\n");
llprimeNum(llnum)//判斷素?cái)?shù)
if(num==1||num==0)
return0;
for(inti=2;i*i=num;i++)
if(num%i==0)
//不是素?cái)?shù)返回0
return0;
return1;//是素?cái)?shù)返回1
//判斷兩個(gè)數(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;
//計(jì)算密文
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"請(qǐng)輸入兩個(gè)素?cái)?shù)p,q:"endl;//輸入兩個(gè)素?cái)?shù)q,p
cinpq;
if(primeNum(p)==0||primeNum(q)==0)
cout"輸入的p或q不是素?cái)?shù)"endl;
return0;
n=p*q;
//t為n的歐拉函數(shù)
t=(p-1)*(q-1);
cout"請(qǐng)輸入密鑰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"請(qǐng)輸入公鑰(e,n)"endl;
cinen;
cout"請(qǐng)輸入明文:(明文需小于"n")"endl;//計(jì)算密文
cinx;
y=candp(x,e,n);
cout"密文為:"yendl;
return0;
lldecode()
lln,d,x,y;
cout"請(qǐng)輸入私鑰(d,n)"endl;
cindn;
cout"請(qǐng)輸入密文:";//計(jì)算密文
ciny;
x=candp(y,d,n);
cout"明文為:"xendl;
return0;
}
在寫(xiě)出主函數(shù)test.c,對(duì)上面的函數(shù)進(jìn)行調(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"輸入錯(cuò)誤,請(qǐng)重新輸入"endl;
voidmenu1()
printf("******************************************\n");
printf("******************************************\n");
printf("*
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 油氣回收系統(tǒng)管理制度樣本
- 優(yōu)化橡膠產(chǎn)品成型技術(shù)操作流程
- 企業(yè)培訓(xùn)員工的課件
- 沉井施工勞務(wù)合作及質(zhì)量檢測(cè)服務(wù)合同
- 智能化個(gè)人信用貸款服務(wù)合同樣本
- 跨境電商采購(gòu)合同風(fēng)險(xiǎn)分析與應(yīng)對(duì)措施
- 年度銷售計(jì)劃方案
- 樓盤(pán)垃圾清理方案
- 餐飲業(yè)品牌授權(quán)入股合作框架協(xié)議
- 離婚協(xié)議書(shū)范本:財(cái)產(chǎn)分割與子女撫養(yǎng)協(xié)議細(xì)則
- TD/T 1044-2014生產(chǎn)項(xiàng)目土地復(fù)墾驗(yàn)收規(guī)程
- 2024北京重點(diǎn)校高一(下)期末數(shù)學(xué)匯編:三角函數(shù)章節(jié)綜合(填空題)
- T/CAAM 0002-2022針灸臨床研究不良事件記錄規(guī)范
- 2025年北京市西城區(qū)中考二模英語(yǔ)試題(含答案)
- DL/T5210.1-2012電力建設(shè)施工質(zhì)量驗(yàn)收及評(píng)定附表全套-
- 2025年化學(xué)專業(yè)課程期末考試試題及答案
- 消防心理測(cè)試題目及答案2024
- 魔鏡洞察-數(shù)字解密 藥食同源生意下最香的成分與賽道終版
- 《剖析智能穿戴設(shè)備營(yíng)銷》課件
- 過(guò)敏性哮喘課件
- 變電站電氣安裝合同
評(píng)論
0/150
提交評(píng)論