第三次作业(密码学)

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

}

相关推荐
MMjeaty14 分钟前
数据结构——栈和队列
数据结构·算法
无敌最俊朗@15 分钟前
MQTT 关键特性详解
java·前端·物联网
JAVA学习通15 分钟前
微服务项目->在线oj系统(Java-Spring)----[前端]
java·开发语言·前端
瓜瓜怪兽亚18 分钟前
前端基础知识---10 Node.js(三)
数据结构·数据库·node.js
拾贰_C22 分钟前
【SpringBoot】前后端联动实现条件查询操作
java·spring boot·后端
GUIQU.2 小时前
【QT】嵌入式开发:从零开始,让硬件“活”起来的魔法之旅
java·数据库·c++·qt
机器学习之心5 小时前
多目标鲸鱼优化算法(NSWOA),含46种测试函数和9个评价指标,MATLAB实现
算法·matlab·多目标鲸鱼优化算法·46种测试函数·9个评价指标
古译汉书6 小时前
嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
数据结构·笔记·stm32·单片机·嵌入式硬件·个人开发
max5006006 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama
callJJ6 小时前
从 0 开始理解 Spring 的核心思想 —— IoC 和 DI(2)
java·开发语言·后端·spring·ioc·di