第三次作业(密码学)

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

}

相关推荐
独自破碎E22 分钟前
判断链表是否为回文
数据结构·链表
你好,我叫C小白24 分钟前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
无妄无望25 分钟前
docker学习(4)容器的生命周期与资源控制
java·学习·docker
MC丶科1 小时前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
千码君20161 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
夜白宋2 小时前
【word多文档docx合并】
java·word
@yanyu6662 小时前
idea中配置tomcat
java·mysql·tomcat
2501_916766542 小时前
【项目部署】JavaWeb、MavenJavaWeb项目部署至 Tomcat 的实现方式
java·tomcat
RoboWizard2 小时前
扩容刚需 金士顿新款Canvas Plus存储卡
java·spring·缓存·电脑·金士顿
lang201509283 小时前
Spring Boot 入门:5分钟搭建Hello World
java·spring boot·后端