在C#中加密字符串并在Delphi中解密

时间:2011-06-02 19:12:01

标签: c# security delphi encryption

我正在ASP.Net中编写一个Web应用程序,它为使用Delphi编写的Windows应用程序创建许可证密钥。为简单起见,我将使用电子邮件地址和日期。

我想在C#中加密它并将该信息通过电子邮件发送给该人,然后当Windows应用启动时,该用户输入加密字符串。

每次Windows应用程序启动时,都会通过解密并与今天的日期进行比较来检查该许可证。

如何确保C#加密在Delphi中成功解决?

4 个答案:

答案 0 :(得分:8)

答案 1 :(得分:8)

  
    

"the world was full of bad security systems designed by people who read Applied Cryptography"

  

虽然简单的答案是'使用相同的算法并确保你有相同的密钥和初始向量',但这个答案只暴露了你将要遇到的真正问题:你如何保护加密键?将其与许可证一起邮寄?将它嵌入应用程序?事实是,没有任何协议可以通过信任根来引导自己,无论是公共信任机构还是共享机密。共享密钥很容易编码,但在实践中完全没用(这意味着AES,3DES,XDES或任何其他类似的密码答案),因此您需要一个基于公钥启动的方案加密。为此,要为许可证的受益人加密某些内容,您需要所述受益人的公钥,这将使配置变得困难(许可证站点发送公钥,您加密许可证,发送电子邮件等)。最好以明文形式发送许可证,但使用您的私钥签名。然后,您的应用程序可以验证许可证上的签名并使用它,如果没有被篡改的话。

S-MIME就是这样一个计划。 PGP同样出色。在C#和Delphi中编写自己的代码是可能的,但强烈建议不要这样做。请参阅Cryptographic Signatures

答案 2 :(得分:2)

您可以使用标准RSA或DSA签名算法来执行您想要的操作。对于C#,这些是运行时内置的标准算法。对于Delphi,您有一些选择。请参阅Free Encryption library for Delphi

为Delphi选择加密库后,您现在可以执行以下操作:

  1. C#服务器使用您选择的签名算法和您的私钥对用户的电子邮件地址和日期进行签名。
  2. Delphi客户端使用相同的签名算法验证许可证。
  3. 一旦Delphi客户端知道签名有效,您就可以测试电子邮件地址/日期并决定是否允许您的程序运行。
  4. 我使用DSA算法,LockBox和C#完成了您想要/需要的签名验证。

    需要注意的一点是,C#加密使用大端数字,而LockBox / Windows CryptoAPI使用小端数字。这可能意味着您需要在将公钥变量和签名本身发送到Delphi客户端进行验证之前,将其反转为endian-ness。检查加密库文档。

    最后一点:其他人建议使用AES / 3DES等对称加密算法。这种方法的问题在于您的“秘密”加密密钥在服务器和客户端之间共享。有人可能通过对已编译的EXE进行逆向工程来恢复密钥,然后创建“密钥生成器” - 最糟糕的情况是伪造的激活服务器传递“真实”加密许可证。通过使用不对称加密并保密私钥,您将不会遇到此问题。用户必须破解EXE的每个新版本或者传递签名的正版许可证 - 更加不方便。

答案 3 :(得分:-1)

在delphi和c#中使用相同的加密/解密算法。

您可以找到C#加密算法的代码,然后将解密算法中的代码转换为Delphi。可能如果您选择一种流行的加密技术,您将能够找到许多不同语言的加密和解密算法。