使用预制的RSA密钥

时间:2018-09-11 08:42:56

标签: security encryption rsa

我正在尝试在自己制作的软件上设置许可系统。想法是,客户端收到我的软件的副本,该软件检查其硬件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作为New RSACryptoServiceProvider() 使用一组新的公钥和私钥创建一个新的RSA对象。但是由于我想将公共密钥嵌入客户端将收到的软件的副本中,因此我需要以某种方式创建一次密钥对,将其写下来,并使RSA在客户端计算机上接受该预制的公共密钥。正如我想象的那样,我必须在两台计算机上都创建该RSA对象,但是要告诉其中一台使用预制的公钥,同时告诉另一台使用预制的私钥。我已经多次使用RSA API,但找不到与该功能相关的任何方法。

我感到自己在某种程度上误解了整个过程以及实现目标所需要做的事情。有人可以帮我解决这个问题吗?我在互联网上发现了许多使用RSA的例子,但是没有一个例子说明如何在两台计算机之间共享RSA密钥。

2 个答案:

答案 0 :(得分:1)

让我尝试细分您的问题以供理解。

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

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

此外,以下代码项目文章应给您一些有关使用基于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公钥,则许可方案可能会失败。

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

答案 1 :(得分:0)

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

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