C#中的私钥参数

3

我有一个使用RSACryptoServiceProvider的C#应用程序,从XML中加载公钥,然后加密散列值并保存。

在另一个应用程序中,我加载了私钥,然后能够正确解密信息。

问题是,我想快速测试一下是否一切正常。

根据MSDN

RSA的安全性源于公钥{e, n}无法直接计算d,也无法通过将n分解为p和q来直接计算d。因此,与d、p或q相关的密钥部分必须保密。

因此,私钥的最重要参数是指数和质数(D、P、Q),这些参数必须保密。

我的测试是在加载私钥之前修改它。首先,我更改了第一个质数中的一个字符,得到了一个错误的密钥。当我只修改第二个质数中的一个字符时,也出现了同样的情况。但是,当我修改指数中的一个字符时,仍能正确解码。所以我的问题是,哪些内容可以从私钥中更改而仍能正常解码,哪些内容是必不可少的?


当您更改私钥指数时,即使只有一位,也不应能够解密。私钥指数用于解密过程:m = c ^ d (mod n),其中c是密文,d是私钥指数,n是模数。(m是解密数据) - Oguz Ozgul
d,是解密中最重要的部分,你只需要拥有一个由n(模数,p x q)和d(私钥指数)组成的私钥。你不必知道p和q来进行解密,只是如果知道这些会显著加快解密过程。 - Oguz Ozgul
1
也许,如果p和q存在,则解密算法不使用密钥中的d,而是重新计算它。这是我能想到的唯一合乎逻辑的解释。 - Oguz Ozgul
请向我们展示您用于进行此实验的实际值,以及您测试它所使用的代码。这就是stackoverflow的工作方式。 - President James K. Polk
@JamesKPolk 我只是使用 RSACryptoServiceProvider 的 Encrypt、Decrypt、ToXMLString 和 FromXMLString 方法,并手动修改保存的私钥。你认为写一些快速的伪代码会有帮助吗? - Mauricio
为什么不能展示最小完整可运行示例(MCVE) - President James K. Polk
1个回答

0

虽然在技术上执行RSA只需要模数、指数和D,但实际上很少有实现使用D,因为通过中国剩余定理执行RSA更加高效。

Windows CAPI(由RSACryptoServiceProvider使用)可以往返导入的任何D值,但实际上并不使用它。Windows CNG(由RSACng使用)要求在导入私钥时提供D,然后立即丢弃它,在导出(或导入)时重新计算。

您可以通过使用OpenSSL生成RSA密钥(它通过phi生成d,这是维基百科提到的形式),然后将其导入CNG来查看最后一个奇怪行为,当导出时,CNG已经用基于lambda(LCM(p-1, q-1))的计算替换了d。

无论如何,所有这些都意味着,虽然“更改D是不好的”,但在实践中,实际进行数学运算的库可以忽略它;而且在这种情况下似乎是这样的。但是你不应该这样做,因为经过PFX或其他私钥传输机制后可能无法很好地互操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接