南郵演算法分析與設計實驗4 密碼演算法

來源:互聯網
上載者:User

標籤:南郵演算法分析與設計實驗

南郵演算法分析與設計實驗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 密碼演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.