第三次作业(密码学)

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

}

相关推荐
信奥卷王9 小时前
[GESP202509 六级] 划分字符串(含视频)
数据结构·算法
酒醉的胡铁9 小时前
相似度搜索的常见算法
算法·ai
局部有解9 小时前
Leetcode Hot100 - 最长连续序列
算法·leetcode·职场和发展
m0_752035639 小时前
Redis 数据结构总结
数据结构·数据库·redis
希洛兔9 小时前
里氏替换原则详解:子类必须能透明替换基类(含继承风险演示 + 正确重构 + JDK 案例)
java·里氏替换原则
行者全栈架构师10 小时前
给开源 Rust 工具加一个新检查项,TRAE 帮我从想法跑到构建产物:全链路实战
前端·算法·架构
tachibana210 小时前
Go 语言的 Map 是否是并发安全的?
开发语言·数据结构·后端·golang·go·语言
kevien_G110 小时前
微服务之OpenFeign最佳实践
java·微服务·架构
江湖有缘10 小时前
Docker实战 | 使用Docker部署ShipShipShip自托管产品更新与功能投票系统
java·linux·服务器·docker
范什么特西10 小时前
亲和路由11
java