c语言编程笔录

首页 > C语言 > c语言

c语言

C++实现RSA加密解密算法是示例代码

更新时间:2023-08-09

前言

RSA是一种非对称加密算法,广泛应用于信息安全领域。它能够保护数据的机密性和完整性,同时还能实现数字签名和密钥交换的功能。下面是一个C++实现的RSA加密解密算法的示例代码。

示例代码

#include 
#include 
using namespace std;

// 判断一个数是否为质数
bool isPrime(int num) {
    if (num <= 1) {
        return false;
    }
    int sqrtNum = sqrt(num);
    for (int i = 2; i <= sqrtNum; i++) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}

// 求两个数的最大公约数
int gcd(int a, int b) {
    if (a == 0) {
        return b;
    }
    return gcd(b % a, a);
}

// 求模逆元
int modInverse(int a, int m) {
    int m0 = m, x = 0, y = 1;
    if (m == 1) {
        return 0;
    }
    while (a > 1) {
        int q = a / m;
        int t = m;
        m = a % m, a = t;
        t = x;
        x = y - q * x;
        y = t;
    }
    if (y < 0) {
        y += m0;
    }
    return y;
}

// 生成RSA密钥对
void generateRSAKeys(int p, int q, int& n, int& e, int& d) {
    if (!isPrime(p) || !isPrime(q)) {
        cout << "p和q必须是质数" << endl;
        return;
    }
    if (p == q) {
        cout << "p和q不能相等" << endl;
        return;
    }
    
    n = p * q;
    int phi = (p - 1) * (q - 1);
    
    for (e = 2; e < phi; e++) {
        if (gcd(e, phi) == 1) {
            break;
        }
    }
    
    d = modInverse(e, phi);
}

// RSA加密
int encrypt(int plaintext, int e, int n) {
    int ciphertext = 1;
    for (int i = 0; i < e; i++) {
        ciphertext = (ciphertext * plaintext) % n;
    }
    return ciphertext;
}

// RSA解密
int decrypt(int ciphertext, int d, int n) {
    int plaintext = 1;
    for (int i = 0; i < d; i++) {
        plaintext = (plaintext * ciphertext) % n;
    }
    return plaintext;
}

int main() {
    int p, q, n, e, d;
    p = 61;
    q = 53;
    
    generateRSAKeys(p, q, n, e, d);
    
    int plaintext = 123;
    int ciphertext = encrypt(plaintext, e, n);
    int decryptedPlaintext = decrypt(ciphertext, d, n);
    
    cout << "明文:" << plaintext << endl;
    cout << "密文:" << ciphertext << endl;
    cout << "解密后的明文:" << decryptedPlaintext << endl;
    
    return 0;
}

代码解释

以上示例代码实现了RSA加密解密算法。代码中定义了一些辅助函数和主要函数:

  • isPrime函数用于判断一个数是否为质数,通过遍历2到该数的平方根的方式进行判断。
  • gcd函数用于求两个数的最大公约数,使用辗转相除法递归实现。
  • modInverse函数用于求模逆元,即对于给定的数 am,求出满足 (a * x) % m = 1x 值。
  • generateRSAKeys函数用于生成RSA密钥对。输入两个质数 pq,输出模数 n、公钥 e 和私钥 d
  • encrypt函数用于RSA加密。输入明文 plaintext、公钥 e 和模数 n,输出密文 ciphertext
  • decrypt函数用于RSA解密。输入密文 ciphertext、私钥 d 和模数 n,输出解密后的明文 plaintext

总结

RSA是一种非对称加密算法,通过生成一对密钥(公钥和私钥)来实现加密和解密的过程。以上示例代码实现了RSA加密解密算法,并通过给定的质数 pq 生成了密钥对。在示例代码中,采用了模幂运算来加密和解密数据。

通过使用RSA加密解密算法,可以确保数据的保密性,即使密钥泄露也无法破解密文。同时,RSA还具备了数字签名和密钥交换的功能,为信息安全提供了重要的保障。

注意:在实际使用中,为了保证安全性,通常需要使用更大的质数和更复杂的算法参数。此处的示例代码仅用于演示RSA算法的基本原理和实现方法。