【问题标题】:Encrypted communication C# <-> PHP using RSA and AES使用 RSA 和 AES 加密通信 C# <-> PHP
【发布时间】:2014-01-04 16:38:49
【问题描述】:

我需要 C# 和 PHP 之间的加密通信,不幸的是不能在服务器端使用 OpenSSL 等模块。我找到了 RSACryptoServiceProvider 和 this article

据说不能使用RSACryptoServiceProvider来加解密,所以文中有自己的实现。但是我找到了provider.Encrypt(...) 和provider.Decrypt(...),为什么不呢?

如果我想在 C# 中使用 RSA,我会考虑这样的事情: 如果php要发送一些数据:

  • php 将其公钥发送到 C#
  • C# 使用来自 php 的公钥加密 AES 的密钥并将其发送到 php
  • php 使用 AES 加密其消息并将其发送到 C#

(向后或多或少相同) 这可能吗?或者这有什么安全问题吗?

【问题讨论】:

标签: c# php rsa


【解决方案1】:

基本上,这是一种经典方法,但有一个重要警告:除非您以某种方式验证接收方的公钥 (PHP),否则您很容易受到 man-in-the-middle attacks 的攻击。

例如:

  • PHP 将其公钥发送到 C#
  • 攻击者截获此消息
  • 攻击者生成他自己的公钥并将其发送到C#
  • C# 使用接收到的密钥对 AES 的密钥进行加密并将其发送回,可能是 PHP,但实际上是发送给中间的攻击者
  • 攻击者接收并解密(使用他自己的私钥)AES 密钥,使用他从 PHP 收到的公钥对其进行重新加密,然后将其发送给 PHP
  • PHP 使用 AES 加密其消息并将其发送到 C#
  • 攻击者截获加密消息并能够对其进行解密,因为他知道 AES 密钥

为了解决这个问题,您需要确保公钥确实属于 PHP,而不是其他任何人。为此,在实践中使用了各种方法,最常见的是PKI,即发送一个certificate,而不是仅仅发送一个公钥,它基本上是一个由certification authority 签名的公钥(即一个井-具有已知公钥的已知实体)保证公钥的所有者。

关于您的第一个问题:绝对可以直接使用 RSA 加密/解密消息,只有技术和性能原因(AES 比 RSA 快得多)为什么 RSA 仅用于加密会话密钥而 AES 是用于加密/解密消息本身。

【讨论】:

  • 感谢您的回复。现在我也明白为什么 SSL 使用证书了。
  • 使用 SSH,您可以预先缓存密钥,并验证服务器提供给您的公钥是否与您存档的公钥相同。如果它不是弹出窗口或出现的内容太多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2015-03-16
  • 1970-01-01
相关资源
最近更新 更多