1. 程式人生 > >C++實現RSA加密解密

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加密解密機制:用公鑰進行加密,用私鑰進行解密。認為只有我的私鑰可以解密,所以保證資料機密性不被別人偷窺、篡改。