C#中使用证书加密和解密

encryption and decryption using certificates in C#

我有一个很大的 XML 需要在一台服务器上加密(通过一个 c# 应用程序),并需要在另一台服务器上解密(通过另一个 c# 应用程序)。 XML 包含需要对其进行加密的关键信息。

我真正需要的是我的加密服务器应该只有知道public密钥,私钥只有进行加密的服务器知道解密。另外,这个私钥应该存放在服务器上的安全区域,比如证书。

可以帮助我实现这一目标的步骤是什么?

  1. 我能否生成私钥并将其存储在证书中,或者证书会自行生成私钥?
  2. 另外,如果证书生成public和私钥,是否可以将public密钥从证书中分离出来,导出到需要加密的服务器?

非对称加密非常占用处理器资源,因此速度非常慢。因此,它通常不用于加密大量数据。

通常的做法是使用对称加密来加密大量数据,使用非对称加密(public 密钥)来加密对称加密中使用的密钥。

加密密钥与加密数据一起传输。密钥被解密(私钥),然后使用对称密钥解密批量数据。

  1. 如何生成密钥对和证书取决于所使用的软件。

  2. 私钥可以通过证书获取

一般的方法是用AES等对称加密算法加密数据,用RSA或EC等非对称加密算法和public密钥对对称密钥进行加密。这样做有两个原因: 1. 与对称加密相比,非对称加密非常慢。 2.非对称加密的数据长度受密钥大小限制:典型的密钥大小为2048位,这将数据长度限制为245字节。

通常没有办法在服务器上安全地存储私钥(或任何东西),除非服务器在没有 HSM 或访问 TPM 的情况下是安全的。使服务器安全的主要步骤是双因素身份验证。但如果它在共享计算机上,请注意服务器其他用户的 root 升级漏洞。

HSM - Hardware Encryption Module
TPM - Trusted Platform Module

我就是这样实现的。 在我的服务器 2 上,我使用 'makecert.exe' 命令生成证书 (.cer) 和私钥 (.pvk)。然后,使用 'pvk2pfx.exe',我生成了一个 .pfx 文件。这是现在将包含证书和私钥的文件。 现在,我仅使用 public 密钥将证书导出到服务器 1,我在服务器 1 上加密数据,并在服务器 2 上使用证书的私钥解密数据。