RSA现代非对称加密算法 P101 第6题

RSA现代非对称加密算法 P101 第6题C语言

纪念第一次自己写的信息安全上机代码?
课本:信息安全原理与实践(第二版)
【美】Mark Stamp 著
张戈 【译】

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
main()
{
	double N,e,d,M,C,S;
	int i;
	printf("请输入模数N:");
	scanf("%lf",&N);
	printf("请输入加密指数e:");
	scanf("%lf",&e);
	printf("请输入私钥d:");
	scanf("%lf",&d);
	while(1)
	{
		printf("请选择(整数):1、加密\t2、解密\t3、数字签名\t4、数字签名验证\t5、退出\n");
		scanf("%d",&i);
		if(i>5)
			printf("对不起,您输入的数据有误!\n");
		switch(i)
		{
		case 1:
			{
				printf("请输入要加密的明文M (整数):\n");
				scanf("%lf",&M);
				C=pow(M,e);
				C=fmod(C,N);
				printf("得到的密文为:\n%.0lf\n",C);
			}break;
		case 2:
			{
				printf("请输入要解密的密文C (整数):\n");
				scanf("%lf",&C);
				M=pow(C,d);
				M=fmod(M,N);
				printf("得到的明文为:\n%.0lf\n",M);
			}break;
		case 3:
			{
				printf("请输入要签名的数字M (整数):\n");
				scanf("%lf",&M);
				S=pow(M,d);
				S=fmod(S,N);
				printf("得到的签名为:\n%.0lf\n",S);
			}break;
		case 4:
			{
				printf("请输入要验证的签名S (整数):\n");
				scanf("%lf",&S);
				M=pow(S,e);
				M=fmod(M,N);
				printf("验证得到的数字为:\n%.0lf\n",M);
			}break;
		case 5:
			{
				printf("已退出,感谢您的使用!\n");
				return 0;
			}break;
		}
	}
}

运行结果:
这就是完全针对那个题写的程序,知道公钥(N,e)和私钥d的情况下的程序,嗯,就是这样
来自一个小菜鸡的垃圾代码,不会函数调用,只好用switch函数了。
第一次知道CSDN还是同学推荐的,用了好久,感觉也应该留下点东西,万一就有人需要了呢,我总不能总是受人恩惠吧。

然后记录一下激动的心情吧~~(还找某同学墨迹了半天问题)~~ :
自己的代码可能比不上网上找的,但思路更清晰,也会发现一些单纯照抄程序发现不了的问题,比如实验2取余,一直知道取余用%,但是在这个题中,pow是double型,用int型的话数大了会出现错误,用double不能用%,在这里困了好长时间,新开程序实验了多次,同时试图在网上找寻一些解决方案,然后发现了一个函数fmod(),可以针对double型取余,然后又经历了多次报错,结果为零等状况,成功得到正确的结果。
不过,在程序中一点小小的错误就可能影响整个的运行结果,还是需要细致一些,像double型与%lf对应,不能用%d(%d输出可以用强制类型转换,例如,设变量double a;输出可以用int(a)输出%d形式的a)。还有在switch()函数中case 4后边的程序结束后忘了break;导致每次运行完4之后直接运行5,还以为是5的问题,改了半天,卒。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值