加密通信C#< - > PHP使用RSA和AES

时间:2014-01-04 16:38:49

标签: c# php rsa

我需要在C#和PHP之间进行加密通信,遗憾的是无法在服务器端使用OpenSSL等模块。我找到了RSACryptoServiceProvider和this article

据说我无法使用RSACryptoServiceProvider来加密和解密某些内容,因此本文中有一个自己的实现。但我找到了provider.Encrypt(...)和provider.Decrypt(...),为什么不呢?

如果我在C#中有使用RSA的东西,我想到这样的事情: 如果php想要发送一些数据:

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

(倒退它或多或少相同) 这是可能的还是有任何安全问题?

1 个答案:

答案 0 :(得分:0)

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

E.g:

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

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

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