提问者:小点点

C#中的RSA实现


我正在尝试在C#中实现RSA算法。下面的代码在p和q很小时有效,但在试图复制p和q非常大的RSA-100或更大时无效。

例如当:

p = 61, q = 53, n = 3233, phi(n) = 3120, e = 17, d = 2753

一旦解密,我得到了正确的原始消息。我从RSA维基百科页面获得了这些值。该代码也适用于p和q的其他小值。

然而,当使用RSA-100或更大时,我无法得到我的原始消息。我尝试使用不同的指数值(e),并确保它与phi(n)互质,但我无法得到正确的结果。我错过了一些简单/明显的东西吗?

提前感谢您的帮助!

//p and q for RSA-100
//string p = "37975227936943673922808872755445627854565536638199";
//string q = "40094690950920881030683735292761468389214899724061";

string p = "61";
string q = "53";

//Convert string to BigInteger
BigInteger rsa_p = BigInteger.Parse(p);
BigInteger rsa_q = BigInteger.Parse(q);

//n = p * q
BigInteger rsa_n = BigInteger.Multiply(rsa_p, rsa_q);

//phi(n) = (p-1)*(q-1)
BigInteger rsa_fn = BigInteger.Multiply((rsa_p - 1), (rsa_q - 1));

BigInteger rsa_e = 17;

//Compute d
BigInteger rsa_d = BigInteger.ModPow(rsa_e, (rsa_fn - 1), rsa_fn);

//Encrypt the message, in this case 3007
//C = (3007^rsa_e) mod rsa_n
BigInteger C = BigInteger.ModPow(3007, rsa_e, rsa_n);

//Decrypt the message, M should equal 3007
//M = (3007^rsa_d) mod rsa_n
BigInteger M = BigInteger.ModPow(C, rsa_d, rsa_n);

共2个答案

匿名用户

d=e^(phi(n)-1)mod phi(n)在我看来是错误的。您要么需要d=e^(phi(phi(n))-1)mod phi(n),要么您可以使用扩展的欧几里得。

匿名用户

我看到你已经接受了这个解决方案。然而,我想给你指出一篇文章,它展示了一个关于C#中RSA加密的更复杂的例子。检查这篇文章(也有可用的源代码):http://xmight.blogspot.com/2011/07/multithreaded-rsa-encryption-with-keys.html