PHP, эквивалентный шифрованию / дешифрованию Rijndael AES в .Net?

Есть ли в 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());
}

person Sarah Weinberger    schedule 28.03.2014    source источник
comment
Да, есть. Что вы пробовали на данный момент?   -  person ntoskrnl    schedule 28.03.2014


Ответы (3)


Вы можете, может быть, но я не могу с чистой совестью рекомендовать это.

PHP предлагает два расширения, которые, в принципе, могут выполнять эту работу. OpenSSL страдает от того, что его не документируют, кроме прототипов функций, а Mcrypt становится абсолютным минным полем, если вы случайно не знаете точно, что делаете. Я бы не стал использовать ни то, ни другое, если бы мне это сошло с рук.

Если вы все же попытаетесь это сделать, вам нужно будет самостоятельно реализовать аутентификацию. Вам нужно будет самостоятельно реализовать отступы. Если вы облажаетесь, вы не получите никаких указаний, даже если библиотека прекрасно знает, что ее просили сделать что-то абсурдное, по большей части она (молча!) Угадает, что вы имели в виду, и продолжит (патчи для большей части этого доступно, но еще не в основной версии).

Удачи.

person Alex    schedule 28.03.2014
comment
Я задаюсь вопросом, основываясь на двух ответах и ​​на том, что я сделал до сих пор, ни один из которых не имеет никакого значения, если мой подход был неправильным когда-то. Мой основной сайт находится и будет на ASP.Net. Все это работает. Я представил PHP, чтобы мои мобильные приложения DevExpress могли взаимодействовать с сервером. Вызов jsonp (strUrl, '‹data›'); в JavaScript позволяет безболезненно связаться с сервером, и PHP легко поддерживает json, но, вероятно, .Net тоже. У меня уже работает .Net, почему бы не использовать его? - person Sarah Weinberger; 29.03.2014
comment
Как бы то ни было, я нашел эту ссылку, lukieb.blogspot.com/2013/04/, который реализует метод Rfc2898DeriveBytes () в PHP, хотя и с двумя дополнительными параметрами. Лично я совершил ошибку, представив PHP, поэтому я просто буду использовать чисто .Net подход. - person Sarah Weinberger; 29.03.2014
comment
@SarahWeinberger Эта реализация php выглядит многообещающей. Для этих дополнительных двух параметров вы пытались установить для $ c значение 1000 и установить для $ kl любое целое число, которое вы использовали с getBytes? - person Phil; 29.05.2015

Пока PHP и .Net следуют спецификациям, шифрование / дешифрование должно работать. Вы можете проверить эту тему для получения дополнительной информации и примеров Использование PHP mcrypt с Rijndael / AES

person Andrew    schedule 28.03.2014

Как говорит @Andrew, как только вы получите все в той же спецификации, все должно работать. AES - довольно хорошо используемый алгоритм, поэтому библиотеки на обоих языках должны совпадать. Любые проблемы обычно связаны с паролем к функциям вывода ключей на разных языках. Этот проект пытается решить проблемы взаимодействия между .NET и PHP. Он реализует Rfc2898DeriveBytes() в PHP с использованием pbkdf2 с 1000 итерациями HMACSHA1, которые, я думаю, .NET использует по умолчанию.

Это довольно простое строковое шифрование AES, поэтому аутентификации нет. Проблема с заполнением решается за счет использования кодировки base64 и обрезки нулевых символов при расшифровке, поэтому это НЕ безопасная реализация для двоичного кода. Я не беру на себя ответственность за этот код и не тестировал его в разных средах, но я чувствую, что он может помочь кому-то заполнить пробелы.

person Phil    schedule 28.05.2015