加密:RSA算法

Bar*_*Das 7 c encryption

我正在实现加密和解密的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代的帮助和建议.

Jer*_*myP 0

我没有答案,但是如果用两个不同的编译器编译的相同代码给出了不同的答案,我会猜测某些类型的大小不同,或者您隐式依赖于某处未定义的行为。

您应该做的第一件事是,给定相同的素数对,检查您生成的所有常量在两种实现中的结果是否相同。如果不是,则您的密钥对生成算法有问题。

接下来的事情是确保您的加密输入数据在两个系统上完全相同。请特别注意如何处理行尾字符。请记住,在 Windows 上,行结束符是,\r\n而在 Linux 上则是\n。如果作为 的模式参数提供,大多数 Windows 库实现将在读入文件时转换\r\n为。您的实现可能有所不同。\n"r"fopen()

最后,无论问题是什么,绝对不要使用gets() 它。如果你发现自己想再次使用它,你应该用冰锥去除你大脑的额叶。