在.NET中签署一个组件涉及公共/私钥对。据我所知,我从我阅读的内容中使用了.NET使用RSA算法和私钥来签名组件,并使用嵌入式公钥对其进行检查。

我知道如何检索公钥(Assembly.PublicKey)。我想知道,该键是否可以用于解密一个简短的字符串,其中包含一些用私钥加密的数据。

到目前为止,我读过的文档(例如)似乎意味着只有反过来才有可能:我必须使用公共密钥来加密和解密的私钥 - 但我真的不想将其包括在大会上。

我想如果我只是签署了字符串,那会没关系。但是如何?

我有点不知所措。有人有代码段吗?

此外,理想情况下,小字符串的加密 /签名将在PHP中发生,因为我想将其卸载到Web服务器上,到目前为止,我们所拥有的只是您的通用PHP / MySQL托管网站。

用例: :我试图为我们将要发布给Beta测试人员的软件轻量级许可方案。由于该软件可能是免费软件,因此我们真正想要实现的只是

  1. 知道谁安装了软件(电子邮件地址)
  2. 让软件在给定期间后到期,然后用户必须获得新的许可证
    • 这很容易填写表格并等待带有钥匙到达的自动电子邮件
    • 我们正在努力减少旧版本的可能性,以咬住我们的声誉 /困扰我们

能够对元组进行加密(到期日期,指纹)和解密,并解密在启动时将使一个简单的许可模块:首次启动应用程序时,要求用户提供电子邮件地址,名称,组织。此信息与某些系统信息(NIC,计算机名称,汇编专业和次要版本)的MD5指纹一起发布给Web服务器。 Web服务器通过电子邮件(检查电子邮件地址的有效性)与元组的加密版本(过期日期,指纹)回答,然后将其保存到磁盘上。在启动时,可以将其解密并与当前日期和再生指纹进行比较。

编辑: :好的,所以我还没有所有问题的答案。但是看起来.NET并不容易使用私钥进行加密(如果有可能的话,答案并不是真正同意的)。

我要采取的路线是(根据我的用例):

  • 我将使用私钥签署许可证。
  • 我将使用公共密钥来验证许可证是由私钥签署的
  • 我将发布另一个针对PHP开发人员的问题,涉及如何使用.NET键(由 sn.exe)签署一些文字
  • 我并不是真的担心用户看到许可证,因为无论如何它都是哈希,并根据他已经知道的东西进行了计算。我只想让您的典型建筑师不知不觉地复制我的软件,这太困难了(请记住,该软件将是免费软件 - 我想要的只是一条纸质踪迹,是谁安装了它... )

非常感谢您的回答。

有帮助吗?

解决方案

不在.NET中。

在许多传统的公钥加密算法(例如RSA)中,您可以加密和解密这两种方式,通常一种方式称为“加密”,而另一种方式也称为“签名”,即使您实际上最终获得了两种方式的加密版本。

但是,在.NET中,RSA实现已被削弱,签名只会产生输入的消化,而不是完整的处理信息。

似乎对RSA可以做什么和不能做的事情存在一些分歧,因此让我编辑我的答案以更具体。

我说的是RSA数学,而不是任何特定的RSA实现。

RSA数学允许您编码两个键(私有或公共)中的信息,并且只能用两个键中的另一个进行编码数据。

通常,您使用公共密钥编码,对信息进行加密,并用私钥对其进行解码,并解密信息。或者,您将信息进行哈希,用私钥对其进行编码,签名哈希,并用公共密钥对哈希进行解码,以比较和验证签名。

典型的实现不允许一个人仅通过哈希数据来完成从私人到公共的数据的完整编码,但是 RSA背后的数学完全允许.

其他提示

您不能使用公共密钥解密。这样,“公共”的全部要点就会丢失。

(但是,您可以使用私钥签名,然后使用公共密钥验证签名。这就是框架使用键 - 签名的键,并且使用公共密钥来验证签名。 )

这可以使用signedxml完成 http://msdn.microsoft.com/en-us/library/ms229745.aspx. 。在较低的级别上,您可以使用RSAPKCS1SignatureDeformatter和RSAPKCS1Signatureformatter。这些工作是通过加密数据的加密,然后将数据与(解密的)哈希进行比较。我相信使用哈希是因为私钥加密只能处理小数据。不确定要重复使用程序集公共密钥,如果引起问题,只需使用单独的密钥对即可。

警告,请查看此信息,因为这些课程可能会导致20秒挂起! http://www.pcreview.co.uk/forums/thread-3428177.php

这种方法容易受到使用Reflexil篡改的签名验证代码的影响,但这是另一回事。

我写了以下文章,但重新读书我认为您已经得到了:您并没有真正试图对用户加密或隐藏数据,而是要阻止他们创建或篡改许可证。正确的是,可以将公共密钥加密算法用于此算法。这被称为 签名 使用私钥(服务器端许可证生成)。并使用公共密钥验证签名(在应用程序中检查许可证)。我提到此术语,因为它将有助于研究。

在RSA公共密钥中,用于加密,使用私钥进行解密。您不能使用公共密钥解密任何内容...

在RSA中,公共密钥和私钥之间的唯一实际区别是您保密哪一个。

因此,您可以将公共密钥用作加密密钥,并使用私钥解密,或使用私钥作为加密密钥,并用公共密钥解密。

使用私钥加密用于数字签名(任何人都可以用公共密钥来解码)。

但是,正如@lasse V. Karlsen指出的那样,.NET可能会使它比应有的困难更加困难。

我认为这两个方向都可以通过公共加密,并用私人加密并使用私钥进行加密。第二个是数字签名的工作方式。

警告!这个答案是错误的,但是我将把它留在这里,因为所附的一系列评论是,我认为他人足够的兴趣可以保留答案。好的,这让我看起来像个白痴,但这对我来说并不新鲜;)按照您的意愿投票。

公共密钥可用于: -

  • 加密只能用私钥解密的东西
  • 身份验证用私钥签名的东西

它不能用来解密由私钥加密的东西。因此,公共/私钥系统称为不对法系统。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top