




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人類疾病學(xué)概論考試題含答案
- 2025應(yīng)屆生在簽訂勞動(dòng)合同過(guò)程中應(yīng)注意什么細(xì)節(jié)
- 代理銷售協(xié)議規(guī)定
- 浙江國(guó)企招聘2025寧波前灣產(chǎn)業(yè)集團(tuán)有限公司第1批次招聘10人筆試參考題庫(kù)附帶答案詳解
- 2025貴州高速公路集團(tuán)有限公司招聘77人筆試參考題庫(kù)附帶答案詳解
- 2025招商新檢及成員公司招聘(53人)筆試參考題庫(kù)附帶答案詳解
- 2025山東滕州市悟通香料有限責(zé)任公司省博士后創(chuàng)新實(shí)踐基地招聘筆試參考題庫(kù)附帶答案詳解
- 2025上半年貴州畢節(jié)市納雍縣鴿子花農(nóng)業(yè)有限公司招聘10人筆試參考題庫(kù)附帶答案詳解
- 紡織檢測(cè)領(lǐng)域的發(fā)展趨勢(shì)試題及答案
- 紡織工程師證書(shū)考試常見(jiàn)誤區(qū)試題及答案
- 《基于AAO-MBR工藝某縣城5萬(wàn)立方米日處理量污水處理廠工程設(shè)計(jì)》13000字(論文)
- 免疫組庫(kù)臨床應(yīng)用
- 新版人教版一年級(jí)數(shù)學(xué)下冊(cè)第五單元100以內(nèi)的筆算加減法
- 內(nèi)控檢查報(bào)告范文
- 2024屆高考生物一輪復(fù)習(xí)必考重點(diǎn)大全寶典
- 《延續(xù)性護(hù)理在永久性腸造口患者中的應(yīng)用研究》4600字(論文)
- 戒毒所運(yùn)動(dòng)康復(fù)
- 康復(fù)人才培養(yǎng)
- 清華大學(xué)課程結(jié)構(gòu)與教學(xué)模式
- 【MOOC】航空航天材料概論-南京航空航天大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 《幼兒園保育教育質(zhì)量評(píng)估指南》圖文詳解課件
評(píng)論
0/150
提交評(píng)論