如何在DotNet核心RSA中使用私钥加密和使用公钥解密

时间:2018-12-14 14:02:42

标签: encryption .net-core rsa

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

但是我想要拥有的是使用私钥加密和使用公钥解密。

我想将公共密钥存储在我的应用程序中,例如使用私有密钥在我的开发机上加密许可证,将其发送到应用程序,然后使用公共密钥解密信息。

我该如何实现?

2 个答案:

答案 0 :(得分:0)

使用私钥加密正在签名。一些提供程序具有验证功能,该功能可以提供解密的签名,而不仅仅是验证它。

答案 1 :(得分:0)

这里主要有两种可能性:

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不允许您这样做”。


如果您要运输许可证,则按照行业标准方法进行签名。切记要包括一种随着时间的推移替换许可证颁发者密钥的机制,例如写下签名证书。或使用System.Security.Cryptography.Pkcs.SignedCms在.NET中公开的PKCS#7 / CMS签名数据之类的内容,因为它是用于传输数据,签名和签名证书的预定义格式,只需检查{ {1}}是可以接受的,然后如果cms.SignerInfos[0].Certificate不扔,那就很好了。

相关问题