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

时间:2010-11-16 09:27:09

标签: c# php aes

我在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);

4 个答案:

答案 0 :(得分:1)

一般来说,只取决于双方选择正确的选项:

  • 明文字符格式

    如何在位串中编码明文字符

  • Padding

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

  • 密钥长度

    如果有选择

  • ,必须同意

  • Key derivation

    如何创建用于密钥的位串

  • <强>模式

    使用哪种加密模式

  • Storage format

    我们如何存储密文

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

答案 1 :(得分:1)

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

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

希望能帮助一些人。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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