【问题标题】:RSA: how to generate RSA public and private keys based on a passphrase (.net)RSA:如何根据密码(.net)生成 RSA 公钥和私钥
【发布时间】:2011-03-24 07:42:41
【问题描述】:

我在 .net 环境(所有版本)中工作并使用 vb.net。我想根据密码生成 RSA 公钥和私钥。

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

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

尽管我使用的是 vb.net,但欢迎任何使用 c#、c、c++ 或任何 .net 兼容语言解决方案的人提供贡献,因为我可以通过 p/invoke 或 dll 参考访问解决方案。

提前致谢!

【问题讨论】:

  • 您到底为什么要根据密码生成 RSA 密钥?
  • 在不先交换发送方和接收方的公钥的情况下进行 RSA 加密和解密。
  • 您不想为此使用 RSA。您需要使用基于密码的密钥派生功能(如 PBKDF2)的对称加密。
  • @CodeInChaos,对此感到抱歉。我在发布我的问题之前进行了搜索,但我错过了那个问题。但是,这个问题也没有解决方案。

标签: .net vb.net rsa


【解决方案1】:

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

【讨论】:

  • +1 对称密钥加密正是您在仅基于密码短语创建公钥时所获得的。想想看,你打算如何分享密码?将此安全通道用于随机创建的对称密钥。
  • @Stephan B,该密码还包含用户私有的唯一数据、用户的 PC 硬件和预装软件的特定数据。
  • @Stephan B:假设我把问题转过来:与使用基于密码的对称加密保护它相比,每次根据密码重新生成私钥有什么问题? (除了明显的,它慢得多,慢得多)。想象一下,像早期的智能手机这样没有易于使用的长期存储的设备。
  • @GregS:没有存储的设备,那将是唯一使用这种设置的地方。我仍然相信对称密钥会更合适:它们需要更少的熵来获得相同的安全性,计算速度更快,而且你不需要发明自己的加密函数。此外,哪款没有存储的早期智能手机可以在适当的时候生成合理大小的 rsa 密钥? ; )
【解决方案2】:

考虑到您需要大约 2048 位随机性才能开始您的素性测试(每个潜在素数 1024 位),并且您的潜在素数可能无法通过素性测试,您的密码需要非常长以提供足够的熵来生成好的密钥。

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

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

您认为您的用户在被要求输入 300 多个字符的密码时会有什么感受?请记住,这是在乐观假设下,即用户将随机点击 94 个符号中的每一个;这对我来说似乎不太可能。我认为 40 多个字符将是人们创造力的真正限制:26 个字母、10 位数字以及 不需要 需要移位的标点键。您的密码大约有 384 个字符。

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

【讨论】:

  • 感谢您的回复。用于根据密码生成 RSA 公钥/私钥的函数将由我的班级内部使用,而不是供最终用户使用。
  • @sarnold,补充一点,随机性和密码长度的问题可以安全地忽略,因为我的课程可以确保所需的任何长度,并且可以通过 .net 提供的另一个加密服务来确保随机性
  • 我希望这些密钥永远不会在野外使用; MITRE has a small list of programs that didn't properly generate their keys
  • @Gens,那么这些密钥在什么意义上“基于”密码?我的意思是,如果您想要求用户向池中投入一些熵,这一切都很好,但似乎并不是一种特别有效的获取熵的方法。
  • @Gens,在看到您所做的其他更新后,我认为 mgrobner 的回答可能最适合您的需求。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      最近更新 更多