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