【问题标题】:How can I encrypt with AES in C# so I can decrypt it in PHP?如何在 C# 中使用 AES 进行加密,以便在 PHP 中对其进行解密?
【发布时间】:2012-10-01 22:33:24
【问题描述】:

我已经找到了一些在 PHP 中加密和在 C# 中解密的答案,但目前还无法逆转这个过程......

背景是我想要的:

在 C# 中: AES 加密文件的内容。 将数据(可能通过 http 通过 POST)上传到服务器。

在 PHP 中: 接收并保存文件。

在 PHP 中(稍后): 解密文件。

我特别想在不使用 SSL/TLS 的情况下对其进行加密(尽管我可能也必须这样做),因为我需要知道文件在存储在服务器上时保持加密(并且可解密!)。

要在 C# 中加密,我正在使用:

Rijndael RijndaelAlg = Rijndael.Create();
RijndaelAlg.KeySize = 128;
RijndaelAlg.Mode = CipherMode.CBC;
CryptoStream cStream = new CryptoStream(fStream, RijndaelAlg.CreateEncryptor(Key, IV),
                                        CryptoStreamMode.Read);

并在 PHP 中解密:

 mcrypt_cbc(MCRYPT_RIJNDAEL_128, $key, $buffer, MCRYPT_DECRYPT, $iv);

【问题讨论】:

  • 您能否准确解释您遇到问题的地方,或者您的问题是什么?
  • 谷歌搜索 PHP AES 出现了phpaes.com,尽管我无法保证它的效果如何,因为我从未使用过它。不过可能对你有用。此外,mhash 扩展支持许多加密方法,尽管 AES 不在其中。如果允许您使用 AES 以外的加密方法,那么您最好的选择可能是选择同时存在于 C# 和 mhash 扩展中的方案。
  • 你能为我们构建一个测试用例吗?在 C# 中加密一个简单的字符串。然后,使用您当前在 PHP 中的 AES 实现加密相同的字符串并发布。也张贴你的钥匙。我可以与我的实现进行比较,并尝试找出哪个有效,哪个无效。
  • 我在 C# 中尝试了多种方法,能够“加密”文件,但从未设法在 php.ini 中成功解密。因此不确定哪一端不起作用。完美的答案是一行 c# 显示加密,一行 php 显示解密。
  • 您好,更准确地说,我需要一行 C# 代码,它可以加密以允许我在 PHP 中使用“mcrypt_cbc(MCRYPT_RIJNDAEL_128, $key, $buffer, MCRYPT_DECRYPT, $iv);”进行解密请问?

标签: c# php aes


【解决方案1】:

通常只取决于在双方选择正确的选项:

  • 纯文本字符格式

    位串中明文字符是如何编码的

  • Padding

    如何将明文填充为块大小的精确倍数

  • 密钥长度

    如果有选择必须同意

  • Key derivation

    如何创建用于密钥的位串

  • 模式

    使用哪种加密模式

  • Storage format

    我们如何存储密文

请参阅here 了解有关这些内容的大量信息。特别是填充似乎是大多数互操作性问题的根源,因为 PHP 的 mcrypt 默认使用 NULL-填充,并且没有内置支持任何其他填充模式,而例如.NET 甚至没有提供使用NULL-padding 的选项(因为它可能会在加密二进制数据时引起问题)。

【讨论】:

    【解决方案2】:

    我知道这是不久前被问到的,但我想我会为其他人发布我的解决方案。我用 PHP 和 C# 编写了一个快速代码示例,让您可以双向加密/解密。我在让双方的设置都得到解决时遇到了一些问题。填充的差异会让它以一种方式解密,但不能以另一种方式解密

    https://github.com/dchymko/.NET--PHP-encryption

    希望对一些人有所帮助。

    【讨论】:

      【解决方案3】:

      您是否对两者使用相同的模式? IE。您是否将 CBC 与两者(而不是 ECB)一起使用。如果您不明白我刚才所说的内容,请发表评论,我会详细解释,因为它具有相当大的安全影响。

      【讨论】:

      • 嗨,是的,我想我是,在 C# 中加密我正在使用:Rijndael RijndaelAlg = Rijndael.Create(); RijndaelAlg.KeySize = 128; RijndaelAlg.Mode = CipherMode.CBC; CryptoStream cStream = new CryptoStream(fStream, RijndaelAlg.CreateEncryptor(Key, IV), CryptoStreamMode.Read);并在 PHP 中解密: mcrypt_cbc(MCRYPT_RIJNDAEL_128, $key, $buffer, MCRYPT_DECRYPT, $iv);
      【解决方案4】:

      几个月前我遇到了类似的问题 - 我有一个项目必须使用 AES 加密,我必须确保在 C# 和 A C++ 组件之间使用完全相同的算法。我最终基于这篇 codeplex 文章中的 AES 加密包装器实现了双方都使用的共享 DLL 库:

      http://www.codeproject.com/KB/security/WinAESwithHMAC.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 2012-11-06
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多