RSA:如何基于密码(.net)生成RSA公钥和私钥

时间:2011-03-24 07:42:42

标签: .net vb.net rsa

我正在使用.net环境(所有版本)并使用vb.net。我想基于密码生成RSA公钥和私钥。

我对RSA算法的理解仅限于使用.net提供的类,即System.Security.Cryptography.RSACryptoServiceProvider类。我知道如何生成随机RSA公钥/私钥并执行加密/解密。

但是.net类不​​允许我们根据密码创建RSA公钥/私钥。

虽然我正在使用vb.net,但欢迎任何使用c#,c,c ++或任何.net兼容语言的解决方案做出贡献,因为我可以通过p / invoke或dll引用访问该解决方案。

提前致谢!

4 个答案:

答案 0 :(得分:5)

也许您应该考虑像AES这样的对称密钥加密,其中密码短语可以从中获取密钥。你提到这是供内部使用的,你真的需要RSA吗?如果是这样,或许您想要做的是保护RSA私钥文件,您可以通过AES加密该文件并使用密钥的密码来实现。您应始终使用旨在执行此操作的软件生成RSA公钥/私钥对。

答案 1 :(得分:3)

考虑到你需要大约2048位的随机性才能启动你的素数测试(每个势素数为1024位),并且你的潜在素数可能会失败他们的素数测试,你的密码短语需要很长才能提供足够的熵来生成好的密钥。

让我们假设键盘上大约有94个键可以生成字符,并进一步假设用户实际上会随机点击它们。 (不是一个好的假设,但请耐心等待。)

每个字符的log(94)/log(2) == 6.55位熵。要获得2048位熵,您需要要求长度为313个字符的密码:2048 / 6.55... == 312.45

您认为您的用户会被要求提供300多个字符的密码?请记住,这是乐观的假设,用户将随机点击94个符号中的每一个;这对我来说似乎不太可能。我认为40多个字符将成为人们创造力的真实限制:26个字母,10个数字,以及需要移位的标点符号键。你的密码就是384个字符。

请坚持随机生成的密钥,有人非常聪明地负责收集熵以播种伪随机数生成器。

答案 2 :(得分:2)

据我所知,Rsa密钥永远不会基于密码。您只能使用密码来保护rsa密钥。

答案 3 :(得分:2)

如果您不需要公钥加密,则不需要RSA。

使用基于密码的密钥派生函数的对称加密(例如AESPBKDF2)。它会更快,更安全。