2014-01-08 41 views
3

OpenSSL提供了生成随机公钥/私钥对的工具。是否有任何机制来确定性地基于一些初始值生成一对?基于输入生成公钥/私钥对

例如,给定字符串'abcd',生成一个公钥/私钥对,以便可以使用相同的字符串再次生成相同的公钥/私钥对。

+1

我真心希望不会。这将使所有安全失效。 – EJP

+0

@EJP取决于密码的质量。但对于加密容器也是如此。加密容器的优点是你需要访问加密容器(例如PKCS#12文件)来破解私钥。使用密码,您可以尝试直到找到解密文件或生成签名的内容。 –

+0

@owlstead当然。理想情况下,密码长度与密钥长度相同,那么熵不会丢失。但那你就不需要密码了,对吧? – EJP

回答

2

当然,只需在PBKDF中使用您的密码来生成像字节数组(需要随机盐和高迭代次数)的密钥即可。然后使用这个字节数组作为PRNG的种子。确保你总是使用相同的PRNG!然后使用该PRNG作为RSA_generate_key的输入。确保生成密钥实现没有改变。

请在crypto.stackexchange.com上阅读关于Initialize a PRNG with a password的回答。请注意,通常私钥是加密的,例如,使用PKCS#12容器。请注意,PKCS#12容器和上述方法都容易受到强力攻击。大多数密码确实提供了非常有限的熵,使得这些暴力攻击更加可行。 PKCS#12容器的优点是您不必将其与密文一起存储,只有在签名生成或解密时才需要。使用128位十六进制值作为密码可以缓解暴力强制的问题,但您可能无法记住它。

请注意,RSA密钥对的生成需要很长时间(并且发现一个较大的素数具有非确定性的运行时间,因此对于特定的密钥对可能需要很长的时间)。 EC F(p)键将不太麻烦。

可行吗?当然。有用?有可能。充满危险?当然。

+2

如果你必须问如何做到这一点,那么你可能不应该这样做:P –

+0

不知何故,我觉得对于与密码学有关的任何事情都是如此。 – ntoskrnl

+0

@ntoskrnl是的,但是这是从磨损很严重的路径移动过来的。如果你松散的路径,你可能会遇到蜘蛛 - 而且意味着精灵。 –