【问题标题】:How to encrypt with private key and decrypt with public key in DotNet core RSA如何在 DotNet 核心 RSA 中使用私钥加密和使用公钥解密
【发布时间】:2018-12-14 14:02:42
【问题描述】:

我找到了几种解决方案,我可以使用 RSA Provider 使用公钥加密消息并使用私钥解密。

但我想要的是用私钥加密并用公钥解密。

我想将公钥存储在我的应用程序中,并使用私钥在我的开发机器上加密许可证,将其发送到应用程序并让信息使用公钥解密。

我怎样才能做到这一点?

【问题讨论】:

  • 加密可以用公钥解密的东西有什么用??
  • 您应该解释为什么按预期使用 RSA(即唯一可靠的方法)不适合目的,以便您可以就如何做到这一点获得建议。
  • 最好将此场景称为 RSA“签名”和“验证”,而不是 RSA 加密和解密。使用正确的术语还可以帮助您找到正确的类、正确的文档和正确的示例。
  • 是否有多个应用程序?或者您只想在开发机器和应用程序之间进行通信?

标签: encryption .net-core rsa


【解决方案1】:

这里有两种主要的可能性:

1)您实际上是指签名(私钥操作)和验证(公钥操作)。

在 RSA 签名中,输入消息被摘要,摘要与填充方案相结合,然后将私钥应用于填充数据。

在RSA验证中,对候选消息进行摘要,公钥用于撤消私钥应用,然后摘要用于验证填充消息。 (在 PKCS#1 签名中,“看看它是否是正确的答案”,对于 PSS,它更复杂)。

如果这是你的意思,那么你想要

  • 签约
    • RSA.SignData(散列数据,然后调用 SignHash)
    • RSA.SignHash(完成操作,是公开的,以防您已经对数据进行哈希处理并希望节省冗余)
  • 验证
    • RSA.VerifyData(散列数据,然后调用 VerifyHash)
    • RSA.VerifyHash(同上)

2) 您想使用私钥将任意数据封装在转换中。

RSA PKCS#1 标准和/或 RFC 没有说明这意味着什么。在 RSA 中,“加密”是指将选定的填充方案应用于数据(PKCS#1 或 OAEP),然后使用公钥执行 RSA 操作。 “解密”是指使用私钥执行 RSA 操作,然后去掉填充。

内置的 Encrypt 和 Decrypt 方法正在执行这些操作,包括知道要使用哪个密钥。

向后应用密钥会在数学上产生合理的结果,但在实践中没有意义。假设我们保持“私有”的意思是“只有一方知道的密钥”,这意味着您拥有一个人生成的任何人都可以读取的数据。如果想法是“我希望读者知道它是由 [私钥持有者] 生成的”,那么签名是一种更好的操作:它将数据保留为纯格式,让读者进行更优化的读取。

RSA 加密进一步仅定义为一次性操作,这意味着因此它被限制为内容字节总数小于 RSA 模数中的字节数(PKCS 少 11 个字节) #1,以及 OAEP 的更大减少,具体取决于所选的 OAEP 哈希算法)。因为首先对哈希进行签名,所以在 RSA 中处理的数据量是固定大小的。在正常的 RSA 加密情况下,被加密的东西是对称 (AES) 密钥,或某种构建 AES 密钥的方法……而且要小得多。

最后,这条路径的结论是“不,.NET 不允许你这样做”。


如果您要运输许可证,行业标准的方法是对其进行签名。请记住包含一种随时间推移替换许可证颁发者密钥的机制,例如记下签名证书。或者使用诸如 PKCS#7/CMS 签名数据之类的东西,由 System.Security.Cryptography.Pkcs.SignedCms 在 .NET 中公开,因为它是用于传输数据、签名和签名证书的预定义格式——只需检查 @ 987654321@ 是可以接受的,然后如果CheckSignature(true) 不抛出,你就可以走了。

【讨论】:

    【解决方案2】:

    用私钥加密就是签名。一些提供者有一个验证功能,它提供解密的签名,而不仅仅是验证它。

    【讨论】:

    • 当然,纯文本必须足够短才能被所选密钥加密,包括所选填充,并且签名功能应该允许用户提供消息而不是为他做散列。我曾经使用过这样的提供商。但是 OP 真正需要的是使用 openssl rsautl -sign 之类的东西签署许可证,并使用 openssl rsautl -verify 等输出恢复数据的方式对其进行验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2013-06-08
    • 2013-05-07
    • 1970-01-01
    • 2013-10-15
    • 2015-03-21
    • 1970-01-01
    相关资源
    最近更新 更多