iT邦幫忙

2024 iThome 鐵人賽

DAY 7
0
Security

資安概論及滲透測試工具研究系列 第 7

IT資訊鐵人賽30天 DAY 7 實作:使用C++寫出RSA

  • 分享至 

  • xImage
  •  

今天的實作包括密鑰生成、加密和解密功能。不過這是一個簡化版本,不應在實際的安全系統中使用。

首先,我們需要包含必要的頭文件,並定義一些輔助函數:

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <vector>

using namespace std;

// 輔助函數:最大公約數
long long gcd(long long a, long long b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

// 輔助函數:模逆元
long long mod_inverse(long long a, long long m) {
    for (long long x = 1; x < m; x++)
        if (((a % m) * (x % m)) % m == 1)
            return x;
    return -1;
}

// 輔助函數:快速冪模運算
long long mod_pow(long long base, long long exponent, long long modulus) {
    long long result = 1;
    while (exponent > 0) {
        if (exponent & 1)
            result = (result * base) % modulus;
        exponent = exponent >> 1;
        base = (base * base) % modulus;
    }
    return result;
}

// 輔助函數:生成質數
long long generate_prime(int bits) {
    long long num = rand() % (1 << bits);
    while (!is_prime(num)) {
        num = rand() % (1 << bits);
    }
    return num;
}

// 輔助函數:判斷是否為質數(使用簡單的試除法)
bool is_prime(long long n) {
    if (n <= 1) return false;
    for (long long i = 2; i * i <= n; i++) {
        if (n % i == 0) return false;
    }
    return true;
}

接下來,我們實現 RSA 的主要功能:

class RSA {
private:
    long long p, q, n, phi, e, d;

public:
    RSA(int bits) {
        generate_keys(bits);
    }

    void generate_keys(int bits) {
        srand(time(NULL));
        p = generate_prime(bits / 2);
        q = generate_prime(bits / 2);
        n = p * q;
        phi = (p - 1) * (q - 1);

        // 選擇公鑰 e
        do {
            e = rand() % (phi - 2) + 2;
        } while (gcd(e, phi) != 1);

        // 計算私鑰 d
        d = mod_inverse(e, phi);
    }

    long long encrypt(long long message) {
        return mod_pow(message, e, n);
    }

    long long decrypt(long long ciphertext) {
        return mod_pow(ciphertext, d, n);
    }

    void print_keys() {
        cout << "Public Key (e, n): (" << e << ", " << n << ")" << endl;
        cout << "Private Key (d, n): (" << d << ", " << n << ")" << endl;
    }
};

最後,我們可以使用這個 RSA 類來進行加密和解密:

int main() {
    RSA rsa(16);  // 使用 16 位的密鑰(注意:實際應用中應該使用更長的密鑰)
    rsa.print_keys();

    long long message = 123;
    cout << "Original message: " << message << endl;

    long long ciphertext = rsa.encrypt(message);
    cout << "Encrypted message: " << ciphertext << endl;

    long long decrypted_message = rsa.decrypt(ciphertext);
    cout << "Decrypted message: " << decrypted_message << endl;

    return 0;
}

這個實現包括以下幾個主要部分:

輔助函數:用於計算最大公約數、模逆元、快速冪模運算等。
RSA 類:包含密鑰生成、加密和解密方法。
主函數:演示如何使用 RSA 類進行加密和解密。
請注意,這個實現有以下限制:

使用的是較小的密鑰大小,實際應用中應該使用至少 2048 位的密鑰。
質數生成使用了簡單的方法,實際應用中應該使用更複雜和安全的方法。
沒有實現填充方案,這在實際應用中是必要的,以防止一些已知的攻擊。
這個實現主要用於教育目的,展示 RSA 的基本原理,不應在實際的安全系統中使用。
在實際應用中,建議使用經過充分測試和審核的密碼庫,如 OpenSSL 或 Crypto++,它們提供了更安全、更完整的 RSA 實現。


上一篇
IT 資訊鐵人賽30天 DAY 6 ECC加密演算法
下一篇
IT資訊鐵人賽30天 DAY 8 ELGamal 加密演算法
系列文
資安概論及滲透測試工具研究30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言