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

本文介绍了如何使用C++编程语言实现RSA加密算法的关键步骤,包括计算最大公约数、欧拉函数、模反元素、平方乘法以及模重复平方解密算法,展示了从公钥生成到加密和解密的具体过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值