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

时间:2009-12-04 14:40:55

标签: c# php rsa encryption-asymmetric license-key

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

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

我到目前为止所阅读的文档(e.g.)似乎暗示只有相反的方式是可能的:我必须使用公钥加密和私钥解密 - 但我我真的不想在集会中加入它。我是。

我想如果我刚签了字符串就行了。但是如何?

我有点不知道如何开始这个。有没有人有代码片段?

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

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

  1. 知道谁安装了软件(电子邮件地址)
  2. 让软件在一段时间后过期,之后用户必须获得新的许可证
    • 这就像填写表单并等待带有密钥的自动电子邮件一样简单
    • 我们正在努力减少旧版本回来咬我们声誉/困扰我们的可能性
  3. 能够加密元组(到期日期,指纹)并在启动时解密它将构成一个简单的许可模块:第一次启动应用程序时,会要求用户提供电子邮件地址,姓名和组织。此信息将与一些系统信息(计算机名称,程序集主要版本和次要版本)的md5指纹一起发布到Web服务器。网络服务器通过电子邮件(检查电子邮件地址的有效性)回复加密版本的元组(有效期,指纹),然后将其保存到磁盘。启动时,可以将其解密并与当前日期和重新生成的指纹进行比较。

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

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

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

    非常感谢您的回答。

7 个答案:

答案 0 :(得分:1)

您无法使用公钥解密。这样,“公共”的整个观点就会丢失。

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

不在.NET中。

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

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

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

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

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

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

典型的实现不允许人们对私有到公共的数据进行完全编码,只能通过散列数据,但 RSA背后的数学完全允许这个

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:-1)

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

公钥可用于: -

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

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

答案 6 :(得分:-1)

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