C#中的私钥参数

时间:2015-11-18 23:23:48

标签: c# encryption rsa private-key

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

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

问题是我想做快速测试,看看一切都好。

来自MSDN

  

RSA的安全性源于这样的事实:给定公钥{e,n},直接或通过将n分解为p和q来计算d在计算上是不可行的。因此,与d,p或q相关的密钥的任何部分都必须保密。

所以私钥最重要的参数是指数和素数(D,P,Q)。

我的测试是在加载私钥之前修改私钥。首先,我在第一个素数中改变了一个字符,然后我得到了一个坏键。只修改第二个素数中的一个字符时相同。

但是当我修改指数中的一个字符时,它仍然能够正确解码它。所以我的问题是,哪些东西可以从私钥改变,仍然能够解码,哪些是必不可少的?

1 个答案:

答案 0 :(得分:0)

虽然模数,指数和D都是技术上需要进行RSA所需的,但很少有实现使用D,因为RSA via the Chinese Remainder Theorem的效率要高得多。

虽然Windows CAPI(由RSACryptoServiceProvider使用)将往返任何导入的D值,但它实际上并未使用它。 Windows CNG(由RSACng使用)要求在导入私钥时提供D,然后迅速将其丢弃,在导出时重新计算(或者我想是导入)。

你可以通过OpenSSL生成一个RSA密钥来看到最后一个怪癖(通过d生成phi(这是维基百科提到的形式)并将其导入CNG,当导出已取代{ {1}}计算基于d(LCM(p-1,q-1))。

无论如何,所有这些都是因为"改变D是坏的"在实践中,它可以被执行实际数学的库忽略;而这似乎就是这种情况。但是你不应该这样做,因为它在通过PFX或其他私钥传输机制后可能无法很好地互操作。