从服务器加密,在客户端解密(但不在客户端加密)?

时间:2011-02-09 16:20:47

标签: c# encryption c#-4.0

我的服务器是否可以提供可在客户端解密的加密字符串,但不能在客户端重新加密?我知道这似乎有点倒退......这就是我的需要。

我有一个需要针对我们的远程服务器激活的软件密钥。服务器需要向客户端提供“您处于活动状态”的信息并包含诸如有效日期之前的信息,许可证数量等等。但是,我需要防止它被轻易篡改以增加许可证计数或日期(即,使用在解编译的二进制文件中找到的键或w / e,使用新日期重新加密值)。

是否可以使用公钥/私钥?或者哈希?

修改

或者,服务器是否可以提供客户端可以验证的哈希值,而不是让客户端能够欺骗或自己生成哈希值?

提前致谢。

2 个答案:

答案 0 :(得分:1)

公钥/私钥加密应该满足您的需求。哈希是单向函数;一个好的哈希函数将无法检索原始值。

在这种情况下,服务器具有公钥/私钥对,并且客户端具有公钥/私钥对。服务器的公钥嵌入到客户端中,服务器也具有客户端的公钥。服务器现在可以使用它的私钥和客户端的公钥来加密您的有效负载。当客户端想要解密有效负载时,它使用它的私钥和服务器的公钥。如果不访问服务器的私钥,客户端就无法重新加密数据。

http://en.wikipedia.org/wiki/Public-key_cryptography - 解释一切是如何运作的

http://msdn.microsoft.com/en-us/library/e970bs09.aspx - 作为.Net类的起点,使其更容易

答案 1 :(得分:1)

不确定。使用RSA等非对称密钥算法。两个密钥都需要从明文到明文;一个将加密,另一个将解密。您不能使用加密的相同密钥进行解密,反之亦然。因此,客户端无法获得密文,解密,然后使用它所拥有的任何信息来提供相同的密文。

但是,非对称密钥算法在加密和解密密钥用于加密之前不会区分加密密钥和解密密钥。它们只需要使用另一个密钥来解密由第一个加密的消息。因此,理论上,您的客户端可以使用其“解密”密钥“重新加密”消息,该密钥可由服务器使用其“加密密钥”进行解密。我不知道一种不允许这样做的算法;你只需要通过省略任何方式将解密密钥用于除解密之外的任何方式,将其构建到通信库中。