我有一个应用程序,在C#中,使用RSACryptoServiceProvider,我从XML加载一个公钥,然后我加密一个哈希值并保存它。
在另一个应用程序中,我加载了私钥,然后我就能正确解密信息。
问题是我想做快速测试,看看一切都好。
来自MSDN,
RSA的安全性源于这样的事实:给定公钥{e,n},直接或通过将n分解为p和q来计算d在计算上是不可行的。因此,与d,p或q相关的密钥的任何部分都必须保密。
所以私钥最重要的参数是指数和素数(D,P,Q)。
我的测试是在加载私钥之前修改私钥。首先,我在第一个素数中改变了一个字符,然后我得到了一个坏键。只修改第二个素数中的一个字符时相同。
但是当我修改指数中的一个字符时,它仍然能够正确解码它。所以我的问题是,哪些东西可以从私钥改变,仍然能够解码,哪些是必不可少的?
答案 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或其他私钥传输机制后可能无法很好地互操作。