PHP相当于.Net中的Rijndael AES加密/解密?

时间:2014-03-28 17:54:01

标签: php .net encryption cryptography rijndaelmanaged

PHP中是否存在可以与.Net Rijndael AES加密/解密互操作的等效函数? (加密.Net代码如下)。

基本上,如果我在.Net中加密,我可以用PHP解密,反之亦然吗?

string outStr = null;                       // Encrypted string to return
RijndaelManaged aesAlg = null;              // RijndaelManaged object used to encrypt the data.

// Generate the key from the shared secret and the salt.
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt);

// Create a RijndaelManaged object
aesAlg = new RijndaelManaged();
aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);

// Create a decryptor to perform the stream transform.
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
    // prepend the IV
    msEncrypt.Write(BitConverter.GetBytes(aesAlg.IV.Length), 0, sizeof(int));
    msEncrypt.Write(aesAlg.IV, 0, aesAlg.IV.Length);
    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
    {
        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
        {
            //Write all data to the stream.
            swEncrypt.Write(plainText);
        }
    }
    outStr = Convert.ToBase64String(msEncrypt.ToArray());
}

3 个答案:

答案 0 :(得分:1)

可以,也许,但我不能在良心上推荐它。

PHP提供了两个扩展,原则上可以完成这项工作。 OpenSSL不会被记录在函数原型之外,如果你碰巧不知道确切你正在做什么,那么Mcrypt就会成为一个绝对的雷区 。如果我可以逃脱它,我也不会使用它。

如果您尝试这样做,则需要自己实施身份验证。您需要自己实现填充。如果你搞砸了,即使图书馆非常清楚它已被要求做一些荒谬的事情,你也不会得到任何迹象,因为大多数情况下它会(默默地)猜测你的意思并继续(补丁为其中很多都是可用的,但还没有在主线上。)

一帆风顺。

答案 1 :(得分:0)

只要PHP和.Net遵循规范加密/解密就行了。您可以查看此主题以获取更多信息和示例Using PHP mcrypt with Rijndael/AES

答案 2 :(得分:0)

正如@Andrew所说,一旦你得到了相同规范中的所有内容,它就应该有效。 AES是一种非常好用的算法,因此两种语言的库都应该匹配。任何问题通常都与不同语言的密钥派生函数的密码有关。 This project试图解决.NET和PHP之间的相互通信问题。它使用带有1000次HMACSHA1迭代的pbkdf2在PHP中实现Rfc2898DeriveBytes(),我猜这是.NET默认使用的。

这是一个相当简单的AES字符串加密,因此没有身份验证。填充问题通过在解密时使用base64编码和rtrimming空字符来解决,因此不是二进制安全实现。我对此代码不承担任何责任,也没有在不同的环境中对其进行测试,但我觉得它可以帮助有人填补空白。