標籤:南郵演算法分析與設計實驗
南郵演算法分析與設計實驗4 密碼演算法
實驗目的
瞭解現代密碼學的基本原理和數論的基礎知識,掌握非對稱密碼體制的著名代表RSA密碼編譯演算法的工作原理和流程,並設計實現一個簡單的密鑰系統。
實驗內容
瞭解加/解密的基本原理和工作過程,用公開金鑰組明文進行加密,並用私人金鑰組密文進行解密,構造一個簡單的 RSA 公開密鑰系統。
實驗原理
1、RSA演算法是由麻省理工學院的 Ron Rivest,Adi Shamir 和Len Adleman 於 1977 年研製並於1978 年首次發表的一種演算法,是第一個能同時用於加密和數位簽章的演算法,且易於理解和操作,因此作為一種通用公開祕密金鑰加密方式而受到推崇。RSA是一種分組密碼,其中明文和密文都是小於某個 n 的從0 到 n-1 的整數,則分組的
二進位值長度必須小於或等於log2n。若以 M 表示明文分組,而C 表示密文分組,則加密和解密的過程如下:
加密:C=M^e mod n
解密:M’=C^d mod n
發送方和接受方都必須知道n 的值。發送方知道 e 的值,而只有接受方知道d 的值。因此這是一種公開密鑰為{e,n},且私人密鑰為{d,n}的公開祕密金鑰加密演算法。此時演算法要能夠滿足公開祕密金鑰加密的要求,則必須滿足以下條件:
(1) 有可能找到 e、d、n的值,使得對所有 M<n 有
M^(ed) modn = M mod n。
(2)對於所有M<n 的值,要計算 M^e和C^d 相對來說是簡單的。
(3)在給定e 和 n 時,判斷出d 是不可行的。
2、重點考慮第一個條件:
由 Euler 定理的一個推論:給定兩個素數p和 q以及兩個整數 n 和m,使得 n=pq 而且0<m<n,並且對於任意整數k,下列關係成立:
m^(kΦ(n)+1)=m
k(p-1)(q-1)+1≡m mod n
其中Φ(n)是歐拉函數,也就是不超過n 且與 n 互素的整數個數。對於素數p 和 q,有Φ(pq)=(p-1)(q-1)。
因此得到需要的關係:ed=kΦ(n)+1,
等價於: ed≡1mod Φ(n) => d≡e-1mod Φ(n)
也就是說:d 和e 是以Φ(n)為模的乘法逆元。
根據模運算規則,它的必要條件是:d、e和Φ(n)是互素的,即gcd(Φ(n),d)=1。3、因此給出RSA 方案:
1. 選擇兩個大素數p,q(私人,選擇)
2. 計算乘積n = p q,得到Φ(n)=(p-1)(q-1)(公開,計算出)
3. 選擇隨機整數e,其中gcd(Φ(n),e)=1;0<e<Φ(n)(公開,選擇)
4. 計算d≡e-1mod Φ(n) (私人,計算出)
5. 私人密鑰由{d,n}組成,公開密鑰由{e,n}組成。
假設使用者 A 公布了它的公開密鑰,而使用者B 希望向 A 發送一個報文M,那麼 B 計算出C=M^e mod n 並傳輸 C。在收到這個密文時,使用者A 通過計算 M’=C^d mod n 進行解密。
3、編程一個簡單的RSA 加、解密系統。
(1)假設使用者A 選擇兩個素數 p 和q,計算得到 n=pq 和Φ(n)=(p-1)(q-1)。選擇一個加密金鑰e,它小於Φ(n)且與Φ(n)互素。計算解密密鑰d≡ e-1 mod Φ(n)。則使用者A 公布公開密鑰{e,n},自己擁有私人密鑰{d,n}。
(2)使用者B 使用使用者 A 的公開密鑰e 和 n 對報文M 進行加密,得到 C= M^e mod n,並發送給使用者A。
(3)使用者A 收到加密的報文後,使用自己的私人密鑰 d 和n 對加密報文 C 進行解密,恢複得到明文M=C^d mod n。
實驗代碼:
#include <iostream>using namespace std;int MOD;int extended_euclid(int a, int b, int &x, int &y) { if(b == 0) { x = 1; y = 0; return a; } int gcd = extended_euclid(b, a % b, x, y); int t = x % MOD; x = y % MOD; y = ((t - a / b * x) % MOD + MOD) % MOD; return gcd;}int main(){ int p, q, i, d; cout << "輸入一個質數p:"; cin >> p; cout << "輸入一個質數q:"; cin >> q; int n = p * q; cout<<"區塊編碼器時,每個分組的大小不能超過p*q="; cout << n << endl; //求得φ(n)=(p-1)*(q-1)的值 MOD = (p - 1) * (q - 1); cout << "模φ(n)=(p-1)*(q-1)="; cout << MOD << endl << endl; //選取與φ(n)互質的公開金鑰e int e; cout << "輸入與φ(n)互質的公開金鑰e:"; cin >> e; //由e和φ(n)產生私密金鑰d int x, y; extended_euclid(e, MOD, d, y); while(d < 0) d += MOD; cout << "通過調用擴充歐幾裡德演算法,求得密鑰d為:" << d << endl; //利用產生的公開金鑰{e,n}對明文M進行加密 int M, C; cout << "現在公開金鑰{e,n}、私密金鑰{d,n}均已產生完畢。\n\n請輸入需要傳輸的明文內容進行加密(如9726):"; cin >> M; C = 1; for(i = 1; i <= e; i++) C = C * M % n; cout << "明文M=" << M << "經加密後得到密文C=M^e(mod n):" << C << endl; //利用產生的私密金鑰私密金鑰{e,n}對密文C進行解密 M = 1; for(i = 1; i <= d; i++) M = M * C % n; cout << "密文C=" << C << "經解密後得到明文M=C^d(mod n):" << M << endl; return 0;}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
南郵演算法分析與設計實驗4 密碼演算法