第三次作业(密码学)

#include <stdio.h>

#include <stdlib.h>

// 计算最大公约数

int gcd(int a, int b) {

while (b != 0) {

int temp = b;

b = a % b;

a = temp;

}

return a;

}

// 计算模幂运算

int mod_pow(int base, int exponent, int modulus) {

int result = 1;

base = base % modulus;

while (exponent > 0) {

if (exponent % 2 == 1) {

result = (result * base) % modulus;

}

exponent = exponent >> 1;

base = (base * base) % modulus;

}

return result;

}

// 生成密钥

void generate_keys(int p, int q, int *e, int *d, int *n) {

*n = p * q;

int phi = (p - 1) * (q - 1);

// 选择e

for (*e = 2; *e < phi; (*e)++) {

if (gcd(*e, phi) == 1) {

break;

}

}

// 计算d

for (*d = 2; *d < phi; (*d)++) {

if ((*e * *d) % phi == 1) {

break;

}

}

}

// 加密

int encrypt(int plaintext, int e, int n) {

return mod_pow(plaintext, e, n);

}

// 解密

int decrypt(int ciphertext, int d, int n) {

return mod_pow(ciphertext, d, n);

}

int main() {

int p = 61;

int q = 53;

int e, d, n;

// 生成密钥

generate_keys(p, q, &e, &d, &n);

int plaintext = 65;

printf("明文: %d\n", plaintext);

// 加密

int ciphertext = encrypt(plaintext, e, n);

printf("密文: %d\n", ciphertext);

// 解密

int decrypted = decrypt(ciphertext, d, n);

printf("解密后的明文: %d\n", decrypted);

return 0;

}

相关推荐
灵感__idea3 小时前
Hello 算法:贪心的世界
前端·javascript·算法
camellias_4 小时前
【无标题】
java·tomcat
咸鱼2.04 小时前
【java入门到放弃】需要背诵
java·开发语言
澈2075 小时前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
椰猫子5 小时前
Java:异常(exception)
java·开发语言
ambition202425 小时前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_5 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
qiqsevenqiqiqiqi5 小时前
前缀和差分
算法·图论
代码旅人ing5 小时前
链表算法刷题指南
数据结构·算法·链表
Yungoal5 小时前
常见 时间复杂度计算
c++·算法