如何在C#中使用AES加密,以便我可以在PHP中解密它?

我在PHP中找到了一些加密的答案,在C#中找到了Decrypt的答案,但目前还无法扭转这个过程……

背景是我想:

在C#中:AES加密文件的内容。 将数据(可能通过POST通过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的mcrypt默认使用NULL -padding并且没有内置支持任何其他填充模式,而例如.NET甚至不提供使用NULL的选项-padding(因为它可能在加密二进制数据时导致问题)。

我知道这是前一段时间被问到的,但我想我会为别人发布我的解决方案。 我在PHP和C#中编写了一个快速代码示例,它允许您以两种方式加密/解密。 我有一些问题,让双方的设置得以解决。 填充的差异会让它以一种方式解密,而不是另一种方式解密

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

希望能帮助一些人。

你和两者使用相同的模式吗? 即你使用CBC(而不是ECB)。 如果您不理解我刚才所说的内容,请发表评论,我会详细解释,因为它有相当大的安全影响。

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

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