【问题标题】:Is it possible to generate a RSA key-pair from a password in Rust-openssl?是否可以从 Rust-openssl 中的密码生成 RSA 密钥对?
【发布时间】:2018-04-02 07:32:46
【问题描述】:

客户端将其私钥存储在本地,用于对发送到服务器的消息进行签名,服务器将用户的公钥存储在数据库中以验证来自客户端的消息。

这是我的问题,如果客户端由于某些意外(例如硬盘被破坏)丢失了它的私钥,它将永远无法连接到服务器(除非调用服务器管理员重置他的密钥)。

所以我在想,如果有一种算法可以从密码(可以保存在客户的人脑中)生成确定性的 RSA 密钥对,那么上面提到的问题就会被消除。

是否可以使用 Rust-openssl 实现这样的算法?

【问题讨论】:

  • 这应该是两个问题。一个是这样的算法是否存在(它确实存在)/它是如何工作的,一个是如何在 rust 中实现。
  • 要询问是否存在这样的算法,security.se 可能是一个更好的起点。但是在了解了算法是如何工作的之后,你不应该只在 * 上提问:你应该先尝试自己实现它,如果你有特定的问题,那么你可以在这里提问。只是问“我将如何实现这个算法?”在 * 上有点宽泛,因此离题。

标签: openssl cryptography rust rsa


【解决方案1】:

这样做基本上归结为使用密码作为输入来播种伪随机数生成器。相同的种子将产生相同的伪随机数。可以在here 中找到一个确定性地生成素数(最终将用于生成 RSA 密钥)的示例。如果这是一个单一用途的独立可执行文件,则可以执行RSA_generate_key_ex,否则编写一个 RSA 密钥生成器(使用 BN 函数)并导入密钥。

【讨论】:

  • 投反对票的原因?如果有什么不准确的地方,我想知道。
  • 为这些实现一个完整的引擎似乎太过分了。只需编写一个 RSA 密钥生成器(使用 BN 函数)并导入密钥。 rand 引擎处于错误的抽象级别,因为它是全局的,并且会影响过程中的其他所有内容,而不仅仅是单个密钥的生成。
  • @FlorianWeimer 好的,感谢您的解释。你当然是对的。难道你不能在播种 PRNG 之后执行RSA_generate_key_ex 吗?
  • OpenSSL 可能需要以非确定性方式为其他事物提供随机性。如果进程是多线程的,并且其他东西调用了消耗随机性的 OpenSSL 函数,它将无法工作。
  • 我认为它是一个独立的可执行文件,只是为了生成密钥(因为更大的应用程序显然是基于 Rust 的)但是,这取决于 OP
【解决方案2】:

查看 dOpenSSL:https://github.com/bernardoaraujor/dopenssl.rs

它包含一些 OpenSSL 功能的确定性实现,即:

  • 确定性大数生成
  • 确定性伪随机数生成
  • 确定性 RSA 密钥对生成

我开始这个存储库是为了练习。 我还在维护https://github.com/bernardoaraujor/dopenssl (fork),它是用 C 语言编写的。

我在 dopenssl.rs 中的目标是使用 bindgen 自动生成 Rust Wrappers。 dOpenSSL 的功能是稳定的,但 Rust Wrappers 还在开发中。

欢迎投稿。

【讨论】:

    最近更新 更多