【问题标题】:Public Private Key Crypto - PHP & C#公钥私钥加密 - PHP & C#
【发布时间】:2011-11-24 19:50:22
【问题描述】:

谁能指出我正确的方向。

我正在尝试使用私钥加密字符串服务器端 (PHP),然后使用公钥解密它的客户端 (c#) 以验证所发送消息的真实性。

谢谢

【问题讨论】:

  • 你用的是什么加密方式,有证书吗?大多数加密问题都可以用 bouncycastle 解决。 bouncycastle.org/csharp
  • 使用 RSA,仅此而已))
  • 还没有使用任何类型的加密,宁愿使用不是证书的东西,如果可能的话只使用基于密钥的东西
  • 您的意思是用 public 密钥对其进行加密,然后用 private 密钥对其进行解密,这就是非对称加密通常的工作方式。
  • @Nacereddine:签名正好相反。这显然是 OP 正在寻找的内容(“……验证所发送消息的真实性”)。

标签: c# php cryptography public-key-encryption private-key


【解决方案1】:

请勿尝试基于 RSA 等基本加密算法提出自定义加密方案。安全协议很难正确;您不仅需要考虑对数据进行加密或签名,还需要考虑中间人攻击、重放攻击、填充预言机攻击等等。

我建议您使用易于使用和理解的标准化、经过充分测试的安全协议:使用 HTTPS。

【讨论】:

  • 但是我必须购买一个非常昂贵的证书
  • 您可以使用随应用程序提供的自签名证书。
  • @JamieHunt 只有从“更受认可的”权威机构购买它们才会真正昂贵。有很多便宜的可以同样满足您的目的。
  • @Jamie 实际上,与其使用自签名证书,不如拥有自己的 CA,其自签名证书由您发送,谁将签署服务器实际使用的证书。这样您就可以更轻松地更改服务器的密钥,而无需重新部署您的客户端应用程序。
【解决方案2】:

您要做的通常称为签名,而不是加密

即使在教科书中 RSA 签名被解释为“用私钥加密,用公钥解密”,实际上它使用的过程略有不同(在实际“加密”之前的部分),因此你有不同的功能用于签名而不是用于加密。

对于PHP中的签名,看起来你可以使用openssl_sign函数。

要检查 C# 中的签名,您可以使用 .NET 的 RSACryptoServiceProvider 类及其 VerifyData 方法。

当然,如果您的目标只是互联网中两个实体之间的经过身份验证的传输(即从服务器到客户端),请使用 SSL/TLS,这是标准解决方案。如果您将根证书与您的应用程序一起分发,您可以使用自己的证书(或您自己的 CA 的证书)而不是昂贵的商业 CA 证书。

【讨论】:

  • 你说的这两个功能兼容吗?
  • 您可能必须探索为这些函数(或类)中的每一个赋予哪些算法名称以使其兼容。我没有使用任何一种,所以我还不能作证。
  • 看起来这是一个相当艰难的转换,我找到了几种方法来做到这一点,但不是那么干净。
【解决方案3】:

.NET 包含用于 RSA 加密/解密的标准函数。

要在 PHP 中使用 RSA,您可以通过 Google 找到很多实现。

你以后会遇到的唯一问题是在 PHP 和 .NET 程序之间传输数据:

  • 您可能必须使用 base64 字符串
  • 如果你想通过 GET 或 POST 发送数据,你必须使用this 解决方案

添加

RSA 是一种简单的算法,不难手动实现。

this 解决方案呢?

herehere 讨论了同一主题。

【讨论】:

  • 你能推荐任何 RSA php 实现吗?我似乎找不到一个好的,它们都要求我在服务器上安装一个 PHP 模块,或者非常慢、过时和无人维护。
  • 我建议使用 RSA 的标准实现,而不是自制的。正如我在回答中解释的那样,您需要签名,而不是加密。
  • stevish.com RSA 实现只能与自身互操作,因此容易受到大量攻击。我的建议:使用phpseclib.sourceforge.net。它实现了 PKCS#1 v2.1 加密标准——与 OpenSSL 使用的标准相同。这意味着(与 steivsh.com 实现不同)它是可互操作的并可以防止此处描述的攻击:en.wikipedia.org/wiki/…
猜你喜欢
  • 1970-01-01
  • 2018-02-27
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2013-04-06
相关资源
最近更新 更多