rsa算法加密解密c语言实验报告,c语言RSA算法实验报告

实验报告(RSA)

管杰

1. 题目和问题陈述

请编写程序实现RSA算法的下述过程

(1) 输入两个素数p=3, q=11;

(2) 计算 n=p x q, fn=(p-1) x (q-1);

(3) 输入e=3 , e是不大于fn且与fn互素的数, e用于对数据进行加密, 得到密文;

(4) 计算d=?, 使(e x d) mod fn = 1 , d用于对密文进行解密,还原出明文, 也就是得公钥(e,n), 私钥(d,n);

(5) 分别输入明文11,05,25, 得到相应的密文输出:11,26,16;

(6) 分别输入密文11,26,16, 得到相应的明文输出:11,05,25。

2. 问题分析,要点及主要数据的设置

程序变量主要有:两个素数p和q, p和q的乘积n,以及f,另外还与f互质的数e.其中p, q, e都是输入的,n, f是简单计算出来的.明文代码用m1,m2,m3来表示,密文代码用c1,c2,c3 来表示.另外求密文求明文和求出d的过程分别使用三个外部函数.分别用find _c和find _m和find _d来表示.

3系统设计,流程图

结束

d=find _d(e ,f)

输出m1 m2 m3

输出c1 c2 c3

M1=find _m(c1)

M2=find _m(c2)

M3=find _(c3)

C1=find _c(m1)

C2=find _c(m2)

C3=find _c(m3)

输入c1 c2 c3

输入m1 m2 m3

n=p*q

f=(p-1)(q-1)

输入p q e

Q

开始

4.C代码

5. 测试结果,拷屏输出

6.总结

(1)首先在理解RSA算法时,仅看老师上课留下来的文档时,没有看懂,还好查点资料,对涉及的数学知识了解了下,大概能了解了起算法.

(2)在算法上只有d的算法较难,其他的还好,但是似乎本题输入的条件过多了,导致本题难度减少很多.还行.

(3)程序在语法上基本没有问题了,算法也在积累中,这次也多次使用调试找出了若干问题,很好.

展开阅读全文

RSA算法是一种非对称加密算法,它的加密和密使用的是不同的密钥,其中公钥用于加密,私钥用于密。RSA算法是目前应用最广泛的公钥加密算法之一。 RSA算法的加密过程如下: 1. 首先选择两个质数p和q,并计算它们的乘积n=p*q; 2. 选择一个整数e,使得e与(p-1)*(q-1)互质; 3. 计算d,使得d*e ≡ 1 (mod (p-1)*(q-1)); 4. 将n和e作为公钥,n和d作为私钥; 5. 要加密明文m,计算c ≡ m^e (mod n),得到密文c。 RSA算法密过程如下: 1. 使用私钥(n,d)密密文c,得到明文m ≡ c^d (mod n)。 下面是RSA算法的加密示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> // 计算a^b mod n int mod_pow(int a, int b, int n) { int result = 1; a = a % n; while (b > 0) { if (b & 1) { result = (result * a) % n; } b >>= 1; a = (a * a) % n; } return result; } // 求最大公约数 int gcd(int a, int b) { if (b == 0) { return a; } return gcd(b, a % b); } // 计算d*e ≡ 1 (mod (p-1)*(q-1)) int calc_d(int e, int p, int q) { int fn = (p - 1) * (q - 1); int d = 0; while (1) { d++; if ((d * e) % fn == 1) { break; } } return d; } // 加密 int encrypt(int m, int e, int n) { return mod_pow(m, e, n); } // 密 int decrypt(int c, int d, int n) { return mod_pow(c, d, n); } int main() { int p = 61, q = 53; // 选择两个质数p和q int n = p * q; // 计算n int fn = (p - 1) * (q - 1); // 计算(p-1)*(q-1) int e = 17; // 选择e,使得e与fn互质 int d = calc_d(e, p, q); // 计算d printf("公钥:(%d,%d)\n", n, e); printf("私钥:(%d,%d)\n", n, d); // 加密明文m int m = 12345; int c = encrypt(m, e, n); printf("明文:%d,密文:%d\n", m, c); // 密密文c int dm = decrypt(c, d, n); printf("密密文:%d\n", dm); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值