2

在 .NET 中对程序集进行签名涉及公钥/私钥对。据我所知,.NET 使用 RSA 算法和私钥对程序集进行签名,并使用嵌入的公钥对其进行检查。

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

到目前为止我读过的文档(例如)似乎暗示只有相反的方式是可能的:我必须使用公钥加密和私钥解密 - 但我真的不想包括在大会上,我做。

我想没关系,如果我只是签署了字符串。但是怎么做?

我有点不知所措如何开始。有人有代码片段吗?

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

用例:我正在尝试为我们即将发布给 beta 测试人员的软件提出一个轻量级的许可方案。由于该软件可能是免费软件,我们真正想要实现的是

  1. 知道谁安装了软件(电子邮件地址)
  2. 让软件在给定期限后过期,之后用户必须获得新的许可证
    • 这就像填写表格并等待带有密钥的自动电子邮件到达一样简单
    • 我们正在努力减少旧版本回来损害我们声誉/困扰我们的可能性

能够加密元组(到期日期、指纹)并在启动时对其进行解密将使许可模块变得简单:第一次启动应用程序时,会要求用户提供电子邮件地址、姓名、组织。此信息与一些系统信息(nic、计算机名称、程序集主要和次要版本)的 md5 指纹一起发布到网络服务器。网络服务器通过电子邮件回复(检查电子邮件地址的有效性),并使用加密版本的元组(到期日期、指纹),然后将其保存到磁盘。在启动时,可以将其解密并与当前日期和重新生成的指纹进行比较。

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

我将采取的路线是这样的(基于我的用例):

  • 我将使用私钥签署许可证。
  • 我将使用公钥来验证许可证是否由私钥签名
  • 我将发布另一个针对 PHP 开发人员的问题,关于如何使用 .NET 密钥(由 生成sn.exe)来签署一些文本
  • 我并不真的担心用户看到许可证,因为它无论如何都是一个哈希值,并且是根据他已经知道的东西计算出来的。我想要的只是让典型的建筑建筑师在我不知情的情况下复制我的软件变得太难了(请记住,该软件将是免费软件 - 我想要的只是谁安装了它的书面记录...... )

非常感谢您的回答。

4

7 回答 7

1

您无法使用公钥解密。这样一来,“公共”的全部意义就消失了。

(但是,您可能能够使用私钥对某些内容进行签名,然后使用公钥验证签名。这就是框架使用密钥的目的 - 对程序集进行签名,而公钥用于验证签名。 )

于 2009-12-04T14:46:34.693 回答
1

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

警告的话,看看这个,因为这些课程可能会导致 20 秒挂断!http://www.pcreview.co.uk/forums/thread-3428177.php

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

我写了以下内容,但重读我想你已经明白了:你并不是真的试图加密或隐藏用户的数据,你想阻止他们创建或篡改许可证。您是对的,可以为此使用公钥私钥加密算法。这称为使用私钥签名(服务器端许可证生成)。并使用公钥验证签名(应用程序中的许可证检查)。我提到这个术语是因为它有助于研究。

于 2009-12-04T19:18:19.837 回答
0

在 RSA 中,公钥用于加密,私钥用于解密。你不能使用公钥来解密任何东西......

于 2009-12-04T14:46:01.200 回答
0

不在 .NET 中。

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

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

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

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

RSA 数学允许您对两个密钥(私有或公共)中的任何一个进行编码,并且编码的数据只能使用两个密钥中的另一个进行解码。

通常,您使用公钥进行编码,对信息进行加密,然后使用私钥对其进行解码,对信息进行解密。或者,您获取信息的散列,用私钥对其进行编码,对散列进行签名,然后用公钥对散列进行解码,以便比较和验证签名。

典型的实现不允许仅通过散列数据来对从私有到公共的数据进行完全编码,但RSA 背后的数学完全允许这样做

于 2009-12-04T14:48:41.510 回答
0

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

所以你可以用公钥作为加密密钥,用私钥解密,或者用私钥作为加密密钥,用公钥解密。

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

但正如@Lasse V. Karlsen 指出的那样,.Net 可能会使它变得比应有的更困难......

于 2009-12-04T14:51:25.437 回答
-1

警告!这个答案是错误的,但我还是要把它留在这里,因为所附的一系列评论是,我认为其他人有足够的兴趣来保留答案。好吧,这让我看起来像个白痴,但这对我来说并不新鲜;)随心所欲地投票。

公钥可用于:-

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

它不能用于解密由私钥加密的东西。出于这个原因,公钥/私钥系统被称为不对称系统。

于 2009-12-04T14:46:43.410 回答
-1

我认为这两个方向都可以用公共加密和用私有解密并用私钥加密。第二个是数字签名的工作方式。

于 2009-12-04T14:51:38.970 回答