RSA算法 是一種公鑰加密算法,RSA算法相比別的算法思路很是清晰,可是想要破解的難度很是大。RSA算法基於一個很是簡單的數論事實:兩個素數相乘獲得一個大數很容易,可是由一個大數分解爲兩個素數相乘卻很是難。這種算法是在1978年首次亮相,它是第一個既能用於數據加密也能夠用於數字簽名的算法,並且理解起來簡單容易。早在1973,就有密碼學家發現了相似的算法,可是一直被列爲絕密直到1998年才被正式公開出來。c++
RSA算法是一種非對稱的算法,該算法須要一對密鑰使用其中一個加密另外一個就能夠進行解密。首先咱們來認識一下歐拉函數:算法
歐拉函數的通式形如:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),計算出來的值是小於x的天然數中素數的個數,關於正確性數論上有嚴格的證實。安全
在RSA算法中咱們的初始的兩個素數是p和q,而歐拉函數的參數x就是p*q,那麼歐拉函數就能夠變形爲:φ(p*q)=(p-1)*(q-1)函數
而後咱們須要如下兩個步驟來計算出一對能夠用來進行加密和解密的密鑰:加密
(1)找到任意一個數d,使得d和p*q互質,即gcd(d,p*q)=1(最大公約數 of greatest common divisor)spa
(2)計算出一個e,知足gcd(d*e,p*q)=1code
好比舉p=3,q=7爲例子,那麼假設使d=5知足gcd(21,5)=1,那麼對應的e就應該知足gcd(5*e,21)=1,得e=17,這樣一來咱們就獲得了一對公鑰和密鑰d,e。blog
假設要加密數據3,那麼就有(3)^d mod p*q=243mod21=12 因此加密以後咱們獲得的數據就是12數學
對於解密過程,咱們對加密後的數據 (12)^e mod p*q=12^17mod21=(12^5)mod21 * (12^5)mod 21 * (12^5)mod21 * (12)^2mod21=((7^3)mod21)*3mod21=3io
整個RSA加密解密算法的過程簡單的有些使人擔心他的安全性,可是上圖給了咱們一個確定的答覆,隨着RSA密鑰長度的增長,保密的年限會加速增加,在當今現代若是不考慮量子計算機暴力破解的話,RSA算法的加密的安全是能夠保證的,除非數學界會有發現新的方法能夠快速算出一個大數(能夠很是大)分爲兩個質數的乘積的算法。
有了以上的基礎咱們就能夠對長的數據進行分組從而完成加密處理:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 5 #define KEY_LEN_LIMIT 1024 6 7 #define TRUE 1 8 #define FALSE 0 9 10 unsigned prime1,prime2; 11 char buf[KEY_LEN_LIMIT]={}; 12 unsigned pub,sec=2; 13 14 15 void swap(unsigned*l,unsigned*r){ 16 unsigned tmp=*l; 17 *l=*r; 18 *r=tmp; 19 } 20 21 unsigned gcd(unsigned a,unsigned b){ 22 if(a<b)swap(&a,&b); 23 if(b==0)return a; 24 else return gcd(b,a%b); 25 } 26 27 28 void encrypt(char*p,unsigned key,unsigned mod){ 29 char tmp=*p; 30 for(unsigned i=2;i<=key;i++){ 31 tmp=(tmp*tmp)%mod; 32 } 33 *p=tmp; 34 } 35 36 void decrypt(char*p,unsigned key,unsigned mod){ 37 char tmp=*p; 38 for(unsigned i=2;i<=key;i++){ 39 tmp=(tmp*tmp)%mod; 40 } 41 *p=tmp; 42 } 43 44 int main(int argc,char*argv[]){ 45 printf("Input Your Primary Letter/Number 1st to Generate Key:"); 46 scanf("%u",&prime1); 47 printf("Input Your Primary Letter/Number 2nd to Generate Key:"); 48 scanf("%u",&prime2); 49 unsigned tmp1=(unsigned)prime1,tmp2=(unsigned)prime2; 50 unsigned mul=(tmp1-1)*(tmp2-1); 51 printf("Input Your 1st Public Key:"); 52 scanf("%u",&pub); 53 while(gcd(pub,mul)!=1){ 54 printf("Input Your 1st Public Key:(Illegal)"); 55 scanf("%u",&pub); 56 } 57 printf("Now The Secret Key is:"); 58 while(((pub*sec)%mul)!=1)sec++; 59 printf("%u\n",sec); 60 printf("Finally Input Your Plain Text to Encrypt:"); 61 scanf("%s",buf); 62 printf("The Encrypted Text is:"); 63 for(int i=0;i<KEY_LEN_LIMIT;i++){ 64 if(buf[i]==0)break; 65 else{ 66 encrypt(&buf[i],pub,mul); 67 printf("%u",buf[i]); 68 } 69 }putchar('\n'); 70 printf("The Decrypted Text is:"); 71 for(int i=0;i<KEY_LEN_LIMIT;i++){ 72 if(buf[i]==0)break; 73 else{ 74 decrypt(&buf[i],sec,mul); 75 printf("%c",buf[i]); 76 } 77 }putchar('\n'); 78 return 0; 79 }