我正在实现加密和解密的RSA算法,如下所示:
http://www.di-mgt.com.au/rsa_alg.html
但无法理解密钥生成中的随机素数生成部分.所以我将两个素数作为用户的输入.我也很难产生e.所以我保持不变(e = 17)
一些素数输入在linux下的gcc中正常工作(即正确编码和解码),但在windows下的devcpp中没有.(例如53,61)
这是密钥生成代码:
/* Generates private and public keys and saves into two separate files */
void keygen()
{
int p,q,phi,d,e,n,s;
printf("\n Enter two prime numbers: ");
scanf("%d%d",&p,&q);
n = p*q;
phi=(p-1)*(q-1);
e=17;
// selec d such that d*e = 1+ k*phi for some integer k.
d = 0;
do
{
d++;
s = (d*e)%phi;
}while(s!=1);
printf("\n public key: { e=%d n=%d }",e,n);
printf("\n private key: { d=%d n=%d }\n",d,n);
}
Run Code Online (Sandbox Code Playgroud)
需要素数和e代的帮助和建议.
我没有答案,但是如果用两个不同的编译器编译的相同代码给出了不同的答案,我会猜测某些类型的大小不同,或者您隐式依赖于某处未定义的行为。
您应该做的第一件事是,给定相同的素数对,检查您生成的所有常量在两种实现中的结果是否相同。如果不是,则您的密钥对生成算法有问题。
接下来的事情是确保您的加密输入数据在两个系统上完全相同。请特别注意如何处理行尾字符。请记住,在 Windows 上,行结束符是,\r\n而在 Linux 上则是\n。如果作为 的模式参数提供,大多数 Windows 库实现将在读入文件时转换\r\n为。您的实现可能有所不同。\n"r"fopen()
最后,无论问题是什么,绝对不要使用gets() 它。如果你发现自己想再次使用它,你应该用冰锥去除你大脑的额叶。