【離散數學】密碼學

古典密碼學

已知最早使用密碼學的人之一是尤利烏斯 凱撒,他通過將字母表中的字母向後平移三個單位長度來實現加密(模26的平移),我們使用數學語言描述如下。

我們使用一個枚舉類型0-25來代表26個字母,使用符號Z表示,定義一個函數f,定義域爲非負整數p,我們有

f(p) = (p+3) mod 26

相對地,解密的過程就是將字母向前平移三個單位實現,同樣是模26計算

f^(-1)(p) = (p-3) mod 26

同理,我們在加密和解密過程中可以規定任意的平移長度,令平移長度爲k,則得到

f(p) = (p+k) mod 26

f^(-1)(p) = (p-k) mod 26

下面使用c語言來描述這個加密解密過程。我們令平移長度k=3,將"HELLO"進行加密和解密

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10

//加密函數,返回 加密後的字符串 
//注意,因爲是字符是ASCII碼值,所以我們在加密過程中需要進行一定的變化 
char *encryption(char *str, int k, int length){
	char *encoding;
	for(int i=0; i<length; i++){
		if(str[i]>=65 && str[i]<=90){
			//大寫字母
			encoding[i] = ((str[i]-65)+k) % 26 + 65; 
		} else if(str[i]>=97 && str[i]<=122){
			//小寫字母
			encoding[i] = ((str[i]-97)+k) % 26 + 97;
		} else {
			printf("error:not a letter\n");
		}
	}
	return encoding;
} 

//解密函數 
char *decryption(char *str, int k, int length){
	char *encoding;
	for(int i=0; i<length; i++){
		if(str[i]>=65 && str[i]<=90){
			//大寫字母
			encoding[i] = ((str[i]-65)-k) % 26 + 65; 
		} else if(str[i]>=97 && str[i]<=122){
			//小寫字母
			encoding[i] = ((str[i]-97)-k) % 26 + 97;
		} else {
			printf("error:not a letter\n");
		}
	}
	return encoding;
} 


int main(){
	char *str = "HELLO";
	char *c = encryption(str, 3, 5);
	printf("加密後的結果:%s\n", c);
	c = decryption(c, 3, 5);
	printf("解密後的結果:%s\n", c);
	return 0;
}

運行的結果如下

RSA加密算法

RSA加密算法是一種非對稱加密算法,當兩臺主機進行RSA加密通信的時候,需要一個公鑰e和一個私鑰d。

加密解密按照如下步驟進行:

1)找到互爲素數的兩個數p和q

2)令n = p*q

3)計算歐拉函數φ(n) = (p-1)*(q-1)

根據歐拉定理我們知道,任意一個與n互質的數a都有 a^n在模n計算中都與1互質

4)尋找一個公鑰e,滿足 1<e<φ(n) 且e與φ(n)互質

     尋找一個私鑰d,滿足ed 除以 φ(n)的餘數爲1

5)假設發送方要發送的數據爲m,求得 m^e 除以n的餘數C,C即爲要發送的加密數據

6)接收方收到數據C後,計算C^d除以n的餘數,這個餘數就是發送方發送的數據m

下面我們用公式描述一下加密解密的過程

                            

                            

                             

由步驟4)我們得到

                              

由(3)和(4)得到

                               

由費米-歐拉定理得到

                               

聯立(5)(6)兩式得到

                                

化簡(7)式得到

                             

通過(8)式我們就很清晰的看到c^d除以n的餘數爲m

下面我們舉一個RSA加密解密的例子

1)p = 43, q = 59

2)n = p*q = 2537

3)計算歐拉函數φ(n) = (p-1)*(q-1) = 2436

4)取公鑰e = 13

5)取私鑰d = 937  (這一步相對困難)

假設我們要發送的數據爲1819 1415

我們計算C1 = pow(1819, 13) mod 2537 = 2081 C2 = pow(1415, 13) mod 2537 = 2182

發送方發送的數據爲2081 2182

接收方接收到數據後解密

M1 = pow(2081, 937) mod 2537 = 1819

M2 = pow(2182, 937) mod 2537 = 1415

至此,RSA加密解密過程就完成啦

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章