C# 加密产品密钥:公钥和私钥加密

C# 加密产品密钥:公钥和私钥加密,c#,encryption,rsa,license-key,public-key-encryption,C#,Encryption,Rsa,License Key,Public Key Encryption,我需要生成和验证产品密钥,并且一直在考虑使用公钥/私钥系统 我根据 客户端名称(可以是可变长度字符串) 一个6位数的序列号 如果产品密钥的长度可以管理(16个字符左右),那就好了 我需要在基地对它们进行加密,然后分发解密/验证系统。由于我们的系统是用托管代码(.NET)编写的,所以我们不想分发加密系统,只想分发解密。我需要一个公钥-私钥似乎是一个很好的方法,用我保存的一个密钥加密,然后分发解密/验证所需的另一个密钥 针对上述要求,什么是合适的机制 注意:这不是为了阻止盗版;这是为了减少新手用

我需要生成和验证产品密钥,并且一直在考虑使用公钥/私钥系统

我根据

  • 客户端名称(可以是可变长度字符串)
  • 一个6位数的序列号
如果产品密钥的长度可以管理(16个字符左右),那就好了

我需要在基地对它们进行加密,然后分发解密/验证系统。由于我们的系统是用托管代码(.NET)编写的,所以我们不想分发加密系统,只想分发解密。我需要一个公钥-私钥似乎是一个很好的方法,用我保存的一个密钥加密,然后分发解密/验证所需的另一个密钥

针对上述要求,什么是合适的机制


注意:这不是为了阻止盗版;这是为了减少新手用户安装他们不需要/未经授权使用的组件的可能性。

.NET以各种方式支持公钥加密,例如。话虽如此,您所获得的只是一些信心,即完全可以访问已发布代码的人将无法发布自己的产品密钥。所有这些都不能阻止他们修补客户端以接受任何有效密钥。这就是模糊处理的用武之地。

甚至不要试图对反盗版行为产生幻想。这不值得。我已经破解了无数的应用程序(嘘),到目前为止,.NET是最简单的。但实际上,只要有足够的经验,他们都相对容易。如果你不相信我,找个时间看看我


tl;这是一场失败的战斗。不要反抗。如果你真的想赢,起诉侵权公司——但即使这样你也会输。

我也做了类似的事情。但就我而言,这只是一个简单的电话授权码。用户将拨打一个号码,给出他们的公司名称和他们正在执行的操作,获取一个代码,将其输入到应用程序中,然后才能继续

我所做的是将一段数据序列化为二进制。这些数据包括散列的公司名称、操作代码/到期日期,并有空间用于将来的需求。然后,我将位分散在阵列周围,以使其混淆。然后,我将二进制数组的每5位映射到一个32字符的身份验证码字母表(0-9,a-z,不包括电话可读性的I/O/Q/S)

这产生了一个16个字符的优秀身份验证代码,显示为4x4块(#####-#-#-#)。它可以通过电话轻松读出,因为用户一次只需听四个字符,甚至可以通过短信发送


与您的问题一样,它并不是为了阻止代码破解者,而是足以阻止普通上班族在不遵循公司程序的情况下做一些事情。考虑到这个范围,它非常有效。

这不是我问题的答案。“未经授权的组件使用”听起来很像反盗版。我们有管理员和用户,软件不太可能被破解。我们不希望用户安装管理组件。----如果你不想回答这个问题,就不要回答。不要只是告诉提问者为什么他不该问这个问题。一个问题的答案越多,就越不可能得到真正的回答,因为人们看到它已经有了反对它的答案。我同意这些帖子的前提,但这个答案几乎与这个问题完全无关。请不要责怪这里的信使。相反,你的两个答案都对你的前提提出了质疑,并提供了一个替代课程。这并没有给我一个问题的答案,这个问题是“有什么合适的机制可以满足上述要求?”正如我所说,PKE与你的需求并不相关。如果您只是想阻止新手用户,只需隐藏安装选项,除非未记录的命令行选项启用它。然后仅为那些需要安装所需组件的用户记录此选项。当然,为了避免修补,有一种方法叫做代码签名。@Erik:既然我们在这里讨论的是.NET,我应该提到的是,强名称对于这类事情通常是不够的,因为您可以简单地用自己的密钥对所有模块重新签名。为什么要重新发明轮子?生成一个128位的数字,并在使用SHA-1散列连接的公司名称和相关信息时将其用作salt值。给他们输入的结果数字。另一方面,软件将执行相同的计算,并将其哈希值与用户输入的哈希值进行比较。在软件上运行模糊处理以隐藏共享机密。都做完了。这个方案是足够安全的,不需要任何努力,并且不需要任何新的算法,就你所知,这些算法可能会有巨大的漏洞。这个解决方案的问题是,你已经在你的代码中有效地包含了keygen。无需破解您的软件,新手破解者只需复制您的keygen并创建他们想要的所有许可证即可。公钥/私钥组合至少可以防止他们复制您的密钥,如果他们想破解您的软件,他们必须直接破解,并且可能在您每次发布更新时重新破解。