应用密码学——RSA算法代码

本文介绍了如何使用C++编程语言实现RSA加密算法的关键步骤,包括计算最大公约数、欧拉函数、模反元素、平方乘法以及模重复平方解密算法,展示了从公钥生成到加密和解密的具体过程。
摘要由CSDN通过智能技术生成
#include<stdio.h>
// 求最大公约数
int gcd_12(int a_12, int b_12) {
    while (b_12 != 0) {
        int temp_12 = b_12;
        b_12 = a_12 % b_12;
        a_12 = temp_12;
    }
    return a_12;
}
// 计算欧拉函数
int euler_phi_12(int n_12) {
    int result_12 = 1, i_12;
    for (i_12 = 2; i_12 < n_12; i_12++) {
        if (gcd_12(i_12, n_12) == 1) {
            result_12++;
        }
    }
    return result_12;
}
// 计算模反元素
int mod_inverse_12(int a_12, int m_12) {
    int m0_12 = m_12, t_12, q_12;
    int x0_12 = 0, x1_12 = 1;
    if (m_12 == 1) {
        return 0;
    }
    while (a_12 > 1) {
        q_12 = a_12 / m_12;
        t_12 = m_12;
        m_12 = a_12 % m_12, a_12 = t_12;
        t_12 = x0_12;
        x0_12 = x1_12 - q_12 * x0_12;
        x1_12 = t_12;
    }
    if (x1_12 < 0) {
        x1_12 += m0_12;
    }
    return x1_12;
}
// 平方乘法算法计算 
int power_mod_12(int a_12, int b_12, int m_12) {
	printf("平方乘\n");
    int result_12 = 1;
    a_12 = a_12 % m_12;
    int binary_exponent_12[32]; // 假设 int 类型为 32 位
    int i_12 = 0, j_12;
    while (b_12 > 0) {
        binary_exponent_12[i_12] = b_12 % 2;
        b_12 /= 2;
        i_12++;
    }
    for (j_12 = i_12 - 1; j_12 >= 0; j_12--) {
        result_12 = (result_12 * result_12) % m_12;
        if (binary_exponent_12[j_12] == 1) {
            result_12 = (result_12 * a_12) % m_12;
            printf("i_12=%d,  %ld\n", j_12, result_12);
        }
    }
    return result_12;
}
// RSA解密函数
int RLFun_12(int c_12, int d_12, int n_12) {
    printf("模重复平方算法\n");
    long int s_12 = 1;
    int i_12 = 0;
    while (d_12 > 0) {
        if (d_12 % 2 == 1) {
            s_12 = (s_12 * c_12) % n_12;
        }
        c_12 = (c_12 * c_12) % n_12;
        d_12 /= 2;
        printf("i_12=%d, %ld\n", i_12, s_12);
		i_12++;
    }
    return s_12;
}
int main() {
    int e_12, p_12, q_12;
    printf("请输入公钥,两素数:e_12 p_12 q_12:");
    scanf("%d %d %d", &e_12, &p_12, &q_12);
    int n_12 = p_12 * q_12;
    printf("输出模数n_12: %d\n", n_12);
    int phi_n_12 = euler_phi_12(n_12);
    printf("输出模数n_12的欧拉函数:%d\n", phi_n_12);
    int d_12 = mod_inverse_12(e_12, phi_n_12);
    if (d_12 == 0) {
        printf("私钥 d_12 不存在\n");
        return 1;
    }
    printf("输出模数私钥d_12: %d\n", d_12);
    // 加密
    printf("请输入要加密的明文m_12:");
    int m_12;
    scanf("%d", &m_12);
    printf("RSA加密模幂运算底数 指数 模数:%d %d %d\n", m_12, e_12, n_12);
    // 加密过程
    int c_12 = power_mod_12(m_12, e_12, n_12);
    printf("加密后密文为:%d\n", c_12);
    // 解密
    printf("RSA解密模幂运算底数 指数 模数:%d %d %d\n", c_12, d_12, n_12);
    // 使用模重复平方算法解密
    int decrypted_m_12 = RLFun_12(c_12, d_12, n_12);
    printf("解密后的明文为:%d\n", decrypted_m_12);
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是RSA算法代码实现,包括密钥生成、加密和解密三个部分。 首先是密钥生成部分: ```python import random from math import gcd # 生成密钥 def generate_key(p, q): n = p * q phi = (p-1) * (q-1) # 找到一个合适的e,满足1 < e < phi(n)且gcd(e, phi(n)) = 1 e = random.randrange(1, phi) g = gcd(e, phi) while g != 1: e = random.randrange(1, phi) g = gcd(e, phi) # 计算d,使得d与e满足ed ≡ 1 (mod phi(n)) d = mod_inverse(e, phi) # 返回公钥和私钥 return ((e, n), (d, n)) # 扩展欧几里得算法计算模反元素 def mod_inverse(a, m): if gcd(a, m) != 1: return None u1, u2, u3 = 1, 0, a v1, v2, v3 = 0, 1, m while v3 != 0: q = u3 // v3 v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3 return u1 % m ``` 接下来是加密和解密部分: ```python # RSA加密 def encrypt(plaintext, public_key): e, n = public_key ciphertext = [pow(ord(char), e, n) for char in plaintext] return ciphertext # RSA解密 def decrypt(ciphertext, private_key): d, n = private_key plaintext = [chr(pow(char, d, n)) for char in ciphertext] return ''.join(plaintext) ``` 使用示例: ```python # 生成密钥 p = 17 q = 19 public_key, private_key = generate_key(p, q) print("公钥:", public_key) print("私钥:", private_key) # 加密 plaintext = "Hello, world!" ciphertext = encrypt(plaintext, public_key) print("密文:", ciphertext) # 解密 plaintext = decrypt(ciphertext, private_key) print("明文:", plaintext) ``` 输出结果: ``` 公钥: (493, 323) 私钥: (269, 323) 密文: [94, 203, 267, 267, 126, 147, 267, 94, 126, 147, 94, 94, 10, 203, 147, 126, 267, 94, 10, 203, 94, 10, 232, 232] 明文: Hello, world! ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值