在C#中“向后”公钥/私钥加密,我该如何解决这个问题?

时间:2011-07-16 01:45:57

标签: c# .net encryption cryptography rsa

我希望我的客户端应用程序能够解密服务器端生成的某些数据,但无法对数据进行加密,以便它可以再次对其进行解密。

因此服务器可以加密和解密,客户端只能解密。

RSA显然不能用于此,因为拥有私钥(解密)意味着您还必须拥有公钥。

我需要能够确保我从服务器收到的数据确实来自服务器并且不是由第三方生成的。为客户端应用程序提供公钥意味着您无法执行此操作。

任何关于最佳方法的建议都是最受欢迎的。

2 个答案:

答案 0 :(得分:4)

简单:您使用私钥加密,然后任何人都可以使用公钥解密。这是证书签署的基础。

通常你只会加密一个哈希,而不加密整个数据块,因为这样会更快。

答案 1 :(得分:0)

创建两个RSA密钥对 - 一个(A)用于加密(并将私钥放入客户端应用程序),另一个(B)用于签名(私钥保留在服务器上) 。现在,当您将数据发送到客户端时,使用密钥对A中的公钥对其进行加密,并使用密钥对B中的私钥对其进行签名。通过计算数据哈希上的加密签名来完成签名(以便于处理和处理提高它的速度)。由于非对称加密的速度非常低,因此通常不对数据本身进行签名。

此过程是标准的,并且得到所有RSA实现的支持(如果值得至少一分钱)。如果您打算使用X.509证书,那么PKCS#7(后来演变为CMS和CAdES)标准就是您的朋友。如果你使用普通的RSA密钥,那么你需要发明自己的格式(但这不是一个大麻烦)。

但有一件事需要考虑:您正在将私钥传递给应用程序,这意味着它也可供用户使用,并且可以通过这种方式泄漏数据。你有没有考虑过这种副作用?