令人惊讶的是,网上关于使用Bouncy Castle的轻量级API的信息非常少。环顾四周后,我能够把一个基本的例子放在一起:
RSAKeyPairGenerator generator = new RSAKeyPairGenerator();
generator.init(new RSAKeyGenerationParameters
(
new BigInteger("10001", 16),//publicExponent
SecureRandom.getInstance("SHA1PRNG"),//prng
1024,//strength
80//certainty
));
AsymmetricCipherKeyPair keyPair = generator.generateKeyPair();
我对RSA和幕后发生的数学有基本的了解,所以我理解publicExponent
和strength
是什么。我认为publicExponent
指的是phi(pq)
的互质,只要使用适当的填充,我收集它就可以很小(如3)。但是,我不知道certainty
指的是什么(某些地方提到它可能指的是百分比,但我想确定)。使用SecureRandom
是不言自明的。 documentation of RSAKeyGenerationParameters完全没有价值(毫不奇怪)。我唯一的猜测是它与生成的键的准确性有关,但我想再次确定。所以我的问题是certainty
和publicExponent
的适当值是什么?
P.S。 请不要回复“这取决于具体情况 - 您希望信息的安全性”。假设最高程度的安全性(即4096位RSA密钥或更高)是非常安全的,除非另有说明......我还希望链接到能够提供使用Bouncy Castle轻量级API的良好示例的链接(我不是所有对JCA实施感兴趣或任何与之相关的例子。)
答案 0 :(得分:10)
您正在为两者使用正确的值。
publicExponent应为Fermat Number。 0x10001(F4)是当前推荐值。已知3(F1)也是安全的。
RSA密钥生成需要素数。但是,生成绝对素数是不可能的。与任何其他加密库一样,BC使用可能的素数。确定性表明你希望这个数字是多么肯定。高于80的任何东西都会大大降低密钥生成速度。
请注意,RSA算法仍然适用于素数不是真素数的不太可能的事件,因为BC检查相对素数。
答案 1 :(得分:8)
我必须深入研究他们的源代码是否“确定”,但我相信certainty
参数会直接传递给BigInteger
构造函数,后者说:“ new BigInteger
表示素数将超过(1 - 1/2 确定性)。此构造函数的执行时间与此参数的值成比例。“
因此,当值为80时,2 80 中的机会少于1,该数字将不是素数。注释表明素数生成时间相对于此参数是线性的,但您应该测试它以确定您是否选择增加它。使用与您使用的密钥大小一致的值可能是有意义的。例如,NIST表示1024位RSA密钥与80位对称密钥一样强。对于2048位RSA密钥,您可能希望使用112位的确定性(等效强度对称密钥大小),依此类推。
听起来你知道在特殊情况下使用3作为公共指数的漏洞。现在几乎普遍使用值65537。
答案 2 :(得分:3)
一个很好的参考是FIPS PUB 186-3。特别是,附录B第3节有许多安全参数,以及素数生成算法。certainty
是Miller-Rabin素性检验的迭代次数。
答案 3 :(得分:2)
See this answer on crypto.stackexchange.com了解有关如何计算确定性值的更多信息。
预览PaŭloEbermann的回答:
x位的确定性意味着某事物的概率(在此 案例p是素数)不是真的小于2-x。这是 与正确猜测随机x位值的概率相同 首先尝试,因此得名。
如何选择x?我们希望p(和q)的概率不是素数 要足够小,以至于此时的失败概率不是 比其他方式更大的系统可能被打破 - 就像猜测一样 对称密钥,分解模数等。
所以这里是对称和非对称密钥大小的对应表 应该有所帮助http://www.keylength.com/选择与您选择的相同的主要确定性 随公钥使用的对称密钥大小。