第三次作业(密码学)

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

}

相关推荐
会飞的架狗师2 分钟前
【面试题】如何保证MQ的消息不丢失、不重复
java·面试·kafka·java-rocketmq
-qOVOp-9 分钟前
408第一季 - 数据结构 - 树与二叉树
数据结构
朝朝又沐沐24 分钟前
基于算法竞赛的c++编程(28)结构体的进阶应用
开发语言·c++·算法
蔡蓝37 分钟前
设计模式-备忘录模式
java·设计模式·备忘录模式
豪斯有话说38 分钟前
C++_红黑树
开发语言·数据结构·c++
迢迢星万里灬41 分钟前
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
java·spring boot·spring·mybatis·spring mvc·面试指南
只有干货44 分钟前
java若依 excel 导出高度自适应
java·excel
风痕~~1 小时前
java实现word末尾添加图片的两种方式
java·word
随缘而动,随遇而安1 小时前
第七十七篇 数据结构基石:数组——数字世界与生活智慧的无声交响曲
大数据·数据结构·后端
qqxhb1 小时前
零基础设计模式——行为型模式 - 迭代器模式
java·设计模式·go·迭代器模式