Java C中的私钥加密和公钥解密#

Java C中的私钥加密和公钥解密#,java,c#,security,encryption,cryptography,Java,C#,Security,Encryption,Cryptography,我有一个C#桌面应用程序,它需要许可证才能启动应用程序,因此它将调用运行在云上的Java应用程序,该应用程序将生成许可证 因此,我考虑使用RSA加密和解密许可证信息,如许可证有效性 我推荐了以下链接:- 问题是我想用Java用私钥加密许可证信息,用C#用公钥解密 是的,这是相反的场景,我将把公钥放在客户端拥有的桌面应用程序中。它可以读取数据,我不想透露私钥,因为任何人都可以使用私钥生成许可证。我没有任何解决方案可以帮助跨平台实现这一点 可能吗?我也可以使用AES,但同样的加密和解密密钥 编辑

我有一个C#桌面应用程序,它需要许可证才能启动应用程序,因此它将调用运行在云上的Java应用程序,该应用程序将生成许可证

因此,我考虑使用RSA加密和解密许可证信息,如许可证有效性

我推荐了以下链接:-

问题是我想用Java用私钥加密许可证信息,用C#用公钥解密

是的,这是相反的场景,我将把公钥放在客户端拥有的桌面应用程序中。它可以读取数据,我不想透露私钥,因为任何人都可以使用私钥生成许可证。我没有任何解决方案可以帮助跨平台实现这一点

可能吗?我也可以使用AES,但同样的加密和解密密钥

编辑:

我的申请目前正在进行:-

它需要一些唯一的机器id和生成许可证(从Java发送到桌面),在许可证中我们有这个唯一id。所以当应用程序启动时,我们检查许可证中的机器id和当前系统的机器id是否相同

我不确定在这种情况下数字签名将如何工作?你能给我举个代码例子吗。(可以跨平台工作)

RSA(或任何其他非对称加密方案)不能以这种方式工作。您总是使用公钥加密,使用私钥解密

您可能希望对许可证应用数字签名,而不是对其进行加密。这样的签名是使用私钥创建的,并且可以在客户机中仅使用公钥进行验证

使用签名的工作原理如下:

<license>
 <hardwareId>someValue</hardwareId>
 <serial>123456789</serial>
 <feature1 enabled="true" someOtherFeatureParameter="42"/>
</license>
  • 您在服务器上构建许可证文件(如您所说,其中包含机器id和唯一id,可能是某些日期)
  • 您可以使用私钥计算该文件的签名
  • 您将许可证和签名发送到桌面应用程序
  • 桌面应用程序将公钥用于它已经验证的服务器密钥,即签名是否真的签署了它收到的许可证
  • 如果此签名验证成功,它可以接受许可证文件的值进行验证,并解析和使用这些值
  • 例如:

    假设您有这样的许可证:

    <license>
     <hardwareId>someValue</hardwareId>
     <serial>123456789</serial>
     <feature1 enabled="true" someOtherFeatureParameter="42"/>
    </license>
    
    
    一些价值
    123456789
    
    您可以将其放入一个普通的xml文件中,存储在机器的已知路径中(您的安装目录…用户配置文件…任何内容)

    现在,虽然这是很好的和闪亮的,存储了所有与许可证相关的信息,但它并不能保护您免受恶意用户编辑(或首先创建)所述文件、启用他们没有付费的功能(甚至创建他们没有付费的许可证文件)的攻击

    这和数字签名有什么关系。。。数字签名正是使篡改许可证变得更难的原因

    将公钥嵌入到应用程序中,并将签名放在第二个文件中(或将签名与许可证一起放在xml文件中)

    关于数字签名的问题是:

    如果仅更改签名数据的一位,签名将无效

    因此,应用程序所要做的就是验证签名是否有效,然后才获取许可证文件中的信息

    要创建签名,您需要与签名将使用的公钥相对应的私钥。由于您的应用程序没有附带私钥,因此用户没有


    当然,用一个新的公钥替换嵌入的publik密钥可能会破坏这个系统,但这比编辑一个文本/xml文件要费劲一些…

    公钥只能加密,您无法了解文件的实际上下文

    但是,您可以在客户端应用程序中实现加密,每个clie,t都会生成自己的私钥和公钥

    然后应用程序向服务器发送公钥请求,并向服务器发送自己的公钥(可能是加密的)。现在两者都只能对信息进行加密和解密。 您只需确保实现simething即可向客户端验证服务器


    lg

    那么,为什么必须对许可证进行加密呢?你们读过数字签名吗?谢谢回复,我在编辑部分添加了一些信息。谢谢回复,我在编辑部分添加了一些信息。