代码之家  ›  专栏  ›  技术社区  ›  Daren Thomas

我可以使用程序集publickey来解密用相应的privatekey加密的字符串吗?

  •  2
  • Daren Thomas  · 技术社区  · 15 年前

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

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

    到目前为止我读过的文件( e.g. )似乎意味着只有另一种方法是可能的:我必须使用公钥进行加密,使用私钥进行解密-但我不想在程序集中包含这一点,是吗?

    我想只要我在这根绳子上签名就行了。但是怎么做呢?

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

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

    用例 :我正在为即将发布给beta测试人员的软件设计一个轻量级的许可方案。因为软件可能是免费的,所以我们真正想要的是

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

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

    编辑 好吧,所以我还没有找到我问题的全部答案。但看起来.NET并不能很容易地使用私钥进行加密(如果可能的话,答案并不完全一致)。

    我要走的路线是(基于我的用例):

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

    非常感谢你的回答。

    7 回复  |  直到 15 年前
        1
  •  0
  •   Lasse V. Karlsen    15 年前

    不在.NET中。

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

    然而,在.NET中,RSA的实现已经被破坏了,当签名只会生成输入的摘要,而不是完整处理的信息。

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

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

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

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

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

        2
  •  1
  •   Tor Haugen    15 年前

    无法使用公钥解密。这样,“公众”的全部观点就会消失。

    (但是,您可以使用私钥对某个内容进行签名,然后使用公钥验证签名。这就是框架使用键的目的——程序集已签名,公钥用于验证签名。)

        3
  •  1
  •   DW.    15 年前

    这可以使用signedXML完成。 http://msdn.microsoft.com/en-us/library/ms229745.aspx . 在较低的级别上,您可以探测使用rsapkcs1签名格式设置器和rsapkcs1签名格式。这些方法的工作原理是加密数据的散列,然后将数据与另一端的(解密的)散列进行比较。我相信使用散列是因为私钥加密只能处理小数据。不确定是否要重用程序集公钥,如果它导致了问题,只需使用单独的密钥对。

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

    这种方法易受使用reflexil篡改的签名验证代码的攻击,但这是另一回事。

    我写了以下内容,但我认为你已经得到了:你不是真的试图加密或隐藏用户的数据,你想阻止他们创建或篡改许可证。可以使用公钥-私钥加密算法来实现这一点,这是正确的。这被称为 签署 使用私钥(服务器端许可证生成)。以及使用公共密钥验证签名(应用程序中的许可证检查)。我提到这个术语是因为它有助于研究。

        4
  •  0
  •   Indeed is Trash    15 年前

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

        5
  •  0
  •   MZB    15 年前

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

    因此,您可以使用公钥作为加密密钥并使用私钥进行解密,或者使用私钥作为加密密钥并使用公钥进行解密。

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

    但正如@lasse v.karlsen指出的,.net可能会使它比应该的更困难…

        6
  •  -1
  •   martin    15 年前

    我认为这两个方向都可以用public加密,用private解密,用private密钥加密。第二个问题是数字签名的工作方式。

        7
  •  -1
  •   AnthonyWJones    15 年前

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

    公钥可用于:

    • 加密只能用私钥解密的内容
    • 验证用私钥签名的内容

    它不能用来解密要用私钥加密的内容。因此,公钥/私钥系统被称为非对称系统。