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());
}
答案 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空字符来解决,因此不是二进制安全实现。我对此代码不承担任何责任,也没有在不同的环境中对其进行测试,但我觉得它可以帮助有人填补空白。