【问题标题】:Crypto++ RSA - Encrypt and sign with the same key pairCrypto++ RSA - 使用相同的密钥对加密和签名
【发布时间】:2016-05-17 10:21:33
【问题描述】:

我有一个程序 A 需要向程序 B1 发送消息。消息必须加密并签名。也就是说只有 B1 可以解码,他必须确定消息来自 A。

此外,B1 不应该能够加密消息并在同一程序的另一个实例 B2 中扮演 A 的角色。

理论上,应该可以使用单个 RSA 密钥对,一个密钥用于 A,一个密钥用于 B1。一旦被 B 解码,如果恢复的消息经过验证(例如通过散列函数),则它一定是由 A 发送的,而 A 没有向任何人透露其密钥。在这种情况下,两个密钥都是私有的(这意味着它们必须在安全通道中交换)

1) 是否建议这样做,或者是否有强烈的论据支持使用独立的密钥对进行单独的加密和签名步骤?

2) 实际上,在 Crypto++ 库中,PrivateKey 类也包含公钥。有没有办法只加载私钥?

【问题讨论】:

  • 在这里试试:security.stackexchange.com
  • 尝试安全堆栈交换似乎是个好主意。当然,为了让 RSA 工作,公钥需要完全公开。如果双方都知道私钥-公钥对,那么PrivateKey 类也包含公钥又有什么关系呢?我没有发现任何重大的安全漏洞——但这一切似乎都没有动机。即使安全,使用 RSA 作为对称密钥密码也不会很有效。
  • @JohnColeman :不应允许 B 创建任何这些消息。他应该只能解密和验证它们。我将此添加到问题中,因为这显然会增加不对称性。
  • 在那种情况下,我不知道您所说的“两个密钥都是私有的(这意味着它们必须在安全通道中交换)”是什么意思,所以密钥不是毕竟都是在安全通道上交换的?无论如何-您确实应该在此处删除此问题并将其发布到安全堆栈交换。对于安全问题,您需要的东西比程序员的即兴预感更好。
  • 第三方应该无法解密来自 A 的消息。这意味着 B 的密钥(解密密钥)是私有的。但是第三方不应该能够向 B 发送消息并扮演 A 的角色。这意味着 A 的密钥(签名)也是私有的。

标签: encryption rsa signing crypto++


【解决方案1】:

这是推荐的还是有强烈的论据支持使用独立的密钥对进行单独的加密和签名步骤?

这是一个广泛的话题。根据您的威胁模型和风险状况,您可以做很多事情。您可能应该从研究key management and separation 开始。

既然您似乎选择了 RSA,那么您可能需要查看 Crypto.SE 上的 Bleichenbacher 1998 “Million message attack” on RSA 并关注其对 30,000 条消息 (IIRC) 的改进。这就是您的威胁模型和风险态势影响因素的地方。


实际上,在 Crypto++ 库中,PrivateKey 类也包含公钥。有没有办法只加载私钥?

我认为您对密钥有误解。公钥不能从私钥中泄露出来。

公钥是{n,e} 对,私钥是{n,e,d}{n,e,d,p,q,dp,dp,u}。如果您删除ne,则私钥将不起作用。如果您单独删除e,则需要考虑n 以恢复e。另请参阅 Stack Overflow 上的 RSA function generates public key (e) always to 17

【讨论】:

  • 好吧,我认为由于私有操作只使用n和d,所以私钥可能只是{n,d},因此您无法在不分解的情况下从私钥导出公钥。但是因为选择了e,所以去掉e显然是没有用的。
猜你喜欢
  • 2018-01-09
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2012-04-07
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多