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;
}
}
}
运行结果:
来自一个小菜鸡的垃圾代码,不会函数调用,只好用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的问题,改了半天,卒。