C++實現RSA加密解密
RSA演算法的描述
1、選取長度相等的兩個大素數p和q,計算其乘積:
n = pq
然後隨機選取加密金鑰e,使e和(p–1)(q–1)互素。
最後用歐幾里德擴充套件演算法計算解密金鑰d,以滿足
ed = 1(mod(p–1) ( q–1))即d = e–1 mod((p–1)(q–1))
e和n是公鑰,d是私鑰
2、加密公式如下:
ci = mi^e(mod n)
3、解密時,取每一密文分組ci並計算:
mi = ci^d(mod n) Ci^d =(mi^e)^d = mi^(ed) = mi^[k(p–1)(q–1)+1 ] = mi mi^[k(p–1)(q–1)] = mi *1 = mi
4、訊息也可以用d加密用e解密
#include <iostream>
#include <stdio.h>
#define p 43
#define q 59
#define e 13
int candp(int a,int b,int c); //資料處理函式,實現冪的取餘運算
int fun(int x,int y); //公鑰e與t的互素判斷
int main()
{
int d,m,n,t,c,r;
int m_t = 0;
int m_i;
int m_j;
int ciphertext[100]; //存放密文的陣列
int proclaimedtext[100]; //存放明文的陣列
n=p*q;
t=(p-1)*(q-1); //求n的尤拉數
d = 1;
while(((e * d) % t) != 1)
{
d++; //由公鑰e求出私鑰d
}
while(1)
{
printf("加密請輸入 1 解密請輸入 2\n"); //加密或解密選擇
scanf("%d",&r);
switch(r)
{
case 1: printf("請輸入密文 m: ");
scanf("%d",&m);
m_i = 0;
while(m / 100)
{
m_t = m % 100;
ciphertext[m_i] = m_t;
proclaimedtext[m_i] = candp(m_t,e,n);
m /= 100;
m_i++;
}
ciphertext[m_i] = m;
proclaimedtext[m_i] = candp(m,e,n);
printf("明文為:\n");
for(int i = 0 ; i <= m_i ;i++)
{
printf("%d ",proclaimedtext[i]);
}
printf("\n");
break;
case 2: printf("明文為 c: ");
for(int i = 0 ; i <= m_i ;i++)
{
printf("%d ",proclaimedtext[i]);
}
printf("\n");
m_j = 0;
while(m_i--)
{
ciphertext[m_j] = candp(proclaimedtext[m_j],d,n);
m_j++;
}
printf("密文為:\n");
for(int i = m_j ; i >= 0 ;i--)
{
printf("%d",ciphertext[i]);
}
printf("\n");
break;
}
}
}
int candp(int a,int b,int c) //資料處理函式,實現冪的取餘運算
{ int r=1;
b=b+1;
while(b!=1)
{
r=r*a;
r=r%c;
b--;
}
return r;
}
int fun(int x,int y) //公鑰e與t的互素判斷
{
int t;
while(y)
{
t=x;
x=y;
y=t%y;
}
if(x == 1)
return 0; //x與y互素時返回0
else
return 1; //x與y不互素時返回1
}
測試倆組資料
第一組,密文為123456789,得出的明文485 2044 1570 2475 1
通過明文485 2044 1570 2475 1得出密文為123456789
第二組,密文為987456123,得出的明文41 1438 1570 560 1864
通過明文41 1438 1570 560 1864 得出密文為987456123
圖片參考:
總結:
加密演算法通常分為對稱性加密演算法和非對稱性加密演算法:
對於對稱性加密演算法,資訊接收雙方都需事先知道密匙和加解密演算法且其密匙是相同的,之後便是對資料進行 加解密了。
非對稱演算法與之不同,傳送雙方A,B事先均生成一堆密匙,然後A將自己的公有密匙傳送給B,B將自己的公有密匙傳送給A,如果A要給B傳送訊息,則先需要用B的公有密匙進行訊息加密,然後傳送給B端,此時B端再用自己的私有密匙進行訊息解密,B向A傳送訊息時為同樣的道理。
RSA演算法基於一個十分簡單的數論事實:將兩個大素數相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密金鑰。RSA可以實現的功能:
1.機密性:通訊報文采用rsa演算法加密,不可讀,加密的訊息只要收方能夠解密
2.防篡改:收方驗證訊息簽名,能夠發先任何更改
3.防抵賴:收方收到到的訊息簽名由發方的私鑰運算生成,其他人無法生成對應資訊
4.身份認證:收方能夠解密資訊,發方預設收方身份合法
RSA數字簽名機制:用私鑰進行簽名,用公鑰進行驗籤。認為私鑰只有可信任對方一家有,所以保證身份認證和防止抵賴。
RSA加密解密機制:用公鑰進行加密,用私鑰進行解密。認為只有我的私鑰可以解密,所以保證資料機密性不被別人偷窺、篡改。