【问题标题】:Using pre-made RSA keys使用预制的 RSA 密钥
【发布时间】:2019-02-15 17:29:11
【问题描述】:

我正在尝试在我制作的软件上设置许可系统。这个想法是客户端收到我的软件的副本,软件检查它的硬件 ID 或特定计算机的其他一些唯一标识符,然后使用带有公钥的非对称加密从该标识符生成激活码。然后客户端将激活码发送给我,我使用我的私钥创建一个签名,然后我将其发回给他,软件会确认它。它还会定期检查唯一标识符是否仍然正确。我希望我理解正确的部分。

this example 复制,我在VB 中编写了一个基本代码,用于创建签名(应该在我的计算机上完成)和检查签名(在客户端的计算机上完成):

    Function RSAoperations(hardwareID As String)
    Dim hashValue() As Byte = Encoding.UTF8.GetBytes(hardwareID)
    Dim sha256 As SHA256 = SHA256Managed.Create()
    Dim hash() As Byte = sha256.ComputeHash(hashValue)
    Dim RSA As New RSACryptoServiceProvider()

    'create signature
    Dim RSAFormatter As New RSAPKCS1SignatureFormatter(RSA)
    RSAFormatter.SetHashAlgorithm("SHA256")
    Dim SignedHash() As Byte
    SignedHash = RSAFormatter.CreateSignature(hash)

    'check signature
    Dim RSADeformatter = New RSAPKCS1SignatureDeformatter(RSA)
    RSADeformatter.SetHashAlgorithm("SHA256")
    If RSADeformatter.VerifySignature(hash, SignedHash) Then
        Console.WriteLine("The signature was verified.")
    Else
        Console.WriteLine("The signature was not verified.")
    End If

    Dim Parameters As New RSAParameters
    Parameters = RSA.ExportParameters(True)

    'display the private key. Base64 encode the text to make display easier

    Debug.Print("private key: " & Convert.ToBase64String(Parameters.D))

    'display the public key. Base64 encode the text to make display easier

    Debug.Print("public key: " & Convert.ToBase64String(Parameters.Modulus))
End Function

在每次运行此函数时,Dim RSA As New RSACryptoServiceProvider() 使用一组新的公钥和私钥创建一个新的 RSA 对象。但由于我想将公钥嵌入客户端将收到的软件副本中,我需要以某种方式创建一对密钥,将它们写下来,并让 RSA 接受客户端计算机上预先制作的公钥。正如我想象的那样,我必须在两台机器上创建那个 RSA 对象,但是告诉其中一台使用预先制作的公钥,同时告诉另一台使用预先制作的私钥。我多次使用 RSA API,但找不到与此类功能相关的任何方法。

我感觉我在某种程度上误解了整个过程以及我需要做些什么来实现我的目标。有人可以帮我解决这个问题吗?我在互联网上找到了许多使用 RSA 的示例,但没有一个解释如何在两台机器之间共享 RSA 密钥。

【问题讨论】:

    标签: security encryption rsa


    【解决方案1】:

    让我试着分解你的问题以便理解。

    • 您正在尝试按照以下步骤创建基于 RSA 的许可:
    • 您正在通过您的软件从客户端计算机获取一些详细信息(硬件 ID ... 等)并创建 SHA256 哈希
    • 然后使用 RSA 密钥对对哈希进行签名(现在,问题来了。您可以使用预制的 RSA 密钥对对哈希进行签名,但只需将您的 RSA 公钥/私钥嵌入到软件中并创建签名使用嵌入式 RSA 私钥。)
    • (与应用程序的公钥/私钥对一起,还将另一个公钥嵌入到您持有私钥的应用程序中。)
    • 收到签名和哈希值后,您可以使用您的私钥再次验证和签名(您必须确保它的安全并假设它只属于您自己拥有)。
    • 一旦软件收到您的个人私钥签名的哈希值,它可以使用存储的 RSA 公钥验证哈希值,并可以根据需要继续运行。

    我希望过程很清楚。无需每次都创建新的密钥对,因为您将无法以明文形式将它们传输/共享给您。否则,您加密密钥对然后将它们放入您的系统将有点过分(不建议这样做,因为任何好的逆向器都可以破解嵌入式密码。)还有其他方法,但我不想用不同的想法超载这个话题。

    此外,以下代码项目文章应该让您对使用基于 RSA 的产品许可/激活方法等有一些想法,

    https://www.codeproject.com/Articles/4940/Using-XML-Digital-Signatures-for-Application-Licen

    https://www.codeproject.com/Articles/16506/Product-Activation-Based-on-RSA-Signatures

    请注意,保护/许可与应用程序的二进制保护一样强大。如果您的可执行文件/程序中嵌入的 RSA 公钥可以更改,那么许可方案就可以失败。

    希望以上内容对您实现许可计划有所帮助。

    【讨论】:

    • 你不能用公钥签名。
    • 谢谢你的回答,苏瑞。我正在研究这些文章,我需要一些时间才能理解它们。你会评论詹姆斯所说的话吗?用公钥签名是真的吗?如果是这样,您建议的方法将如何发挥作用?
    • 谢谢。是的,没错。使用公钥,您可以加密数据而不是对其进行签名。您可以使用公钥加密数据,只有您才能使用私钥解密。然后您可以对数据进行签名并将其作为响应发送回
    • 谢谢。我设法让它工作。你很有帮助。
    • 是否愿意为您为他人的利益而遵循的过程编写一个简单的步骤?我相信它会对阅读此主题的任何人有所帮助。另外,如果您已经达到了您的预期,请将有用的答案标记为已解决。谢谢。
    【解决方案2】:

    如果我理解您的问题,您只需在服务器上生成一次密钥对并安全地保存它。此外,您需要调用ExportParameters(False),序列化生成的 RSAParameters 对象,然后对字节进行 base64 编码以创建字符串。然后在您的客户端软件中对该字符串进行硬编码,并在运行客户端时反转该过程:base64 解码字符串,将字节反序列化为 RSAParameters 对象,创建 RSA 对象并运行 ImportParameters 方法以导入公钥。

    请注意,我并不是说您的方案是安全的,只是说明您需要执行哪些步骤来执行它。要进行安全评估,您应该咨询专家并向他们提供完整的详细信息。

    【讨论】:

    • 感谢您的回答。在过去的几天里,我一直在试验这个。如果你不介意,我有一个问题。在客户端计算机上使用 RSA.ImportParameters(parameters) 时,我在 Parameters 中设置的唯一值是 Modulus(公钥)。但是,由于未设置其余值,ImportParameters 函数将失败。我是否必须事先使用 ExportParameters 来设置参数的所有值,并且只覆盖模数?这是使用 RSA 的正确和安全的方式吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多