Как я могу зашифровать с помощью AES на С#, чтобы я мог расшифровать его на PHP?

Я нашел несколько ответов на шифрование в PHP и расшифровку в С#, но пока не смог отменить процесс...

Фон я хочу:

В C#: AES шифрует содержимое файла. Загрузите данные (вероятно, через http через POST) на сервер.

В PHP: получите и сохраните файл.

И в PHP (позже): расшифровать файл.

Я специально хочу зашифровать его без использования SSL/TLS (хотя мне, возможно, придется это сделать), так как мне нужно знать, что файл остается зашифрованным (и расшифровываемым!) при сохранении на сервере.

Для шифрования на С# я использую:

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

person Tim    schedule 16.11.2010    source источник
comment
Можете ли вы объяснить, где именно у вас возникли проблемы, или каков ваш вопрос?   -  person ZoFreX    schedule 16.11.2010
comment
Поиск в Google для PHP AES обнаружил phpaes.com, хотя я не могу поручиться за то, насколько хорошо он работает, как мне кажется. я никогда не использовал его. Хотя может быть полезно для вас. Кроме того, расширение mhash поддерживает множество методов шифрования, хотя AES не входит в их число. Если вам разрешено использовать метод шифрования, отличный от AES, то, вероятно, лучше всего выбрать схему, которая присутствует как в C#, так и в расширении mhash.   -  person GordonM    schedule 16.11.2010
comment
Можете ли вы создать тестовый пример для нас? Зашифровать простую строку на C#. Затем зашифруйте ту же строку с помощью вашей текущей реализации AES в PHP и опубликуйте ее. Выложите и свои ключи. Я могу сравнить свои реализации и попытаться выяснить, какая из них работает, а какая нет.   -  person Brad    schedule 16.11.2010
comment
Я пробовал несколько подходов на С#, смог «зашифровать» файл, но мне так и не удалось успешно расшифровать его в php. Поэтому не уверен, какой конец не работает. Идеальным ответом будет одна строка С#, показывающая шифрование, и одна строка php, показывающая расшифровку.   -  person Tim    schedule 21.11.2010
comment
Привет, если быть более точным, мне нужна строка кода C #, которая будет шифровать, чтобы позволить мне расшифровывать в PHP с помощью mcrypt_cbc (MCRYPT_RIJNDAEL_128, $key, $buffer, MCRYPT_DECRYPT, $iv); пожалуйста?   -  person Tim    schedule 22.11.2010


Ответы (4)


Как правило, это зависит только от выбора правильных параметров с обеих сторон:

  • Формат обычного текста

    как символы открытого текста кодируются в битовой строке

  • Заполнение

    как дополнить открытый текст, чтобы он был точным кратным размеру блока

  • Длина ключа

    должны быть согласованы, если есть выбор

  • Вывод ключа

    как создать битовую строку, которая будет использоваться для ключа

  • Режим

    какой режим шифрования использовать

  • Формат хранения

    как мы храним зашифрованный текст

Подробнее об этом см. здесь. В частности, заполнение кажется корнем большинства проблем с совместимостью, поскольку PHP mcrypt по умолчанию использует NULL-заполнение и не имеет встроенной поддержки для любого другого режима заполнения, в то время как, например. .NET даже не предоставляет возможность использовать NULL-заполнение (поскольку это может вызвать проблемы при шифровании двоичных данных).

person Stefan Gehrig    schedule 16.11.2010

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

https://github.com/dchymko/.NET--PHP-шифрование

надеюсь, что это поможет некоторым людям.

person DarylChymko    schedule 27.08.2011

Вы используете один и тот же режим с обоими? т.е. вы используете CBC с обоими (а не с ECB). Если вы не понимаете, что я только что сказал, оставьте комментарий, и я подробно объясню, поскольку это имеет довольно серьезные последствия для безопасности.

person ZoFreX    schedule 16.11.2010
comment
Привет, да, кажется, да, для шифрования на C# я использую: Rijndael RijndaelAlg = Rijndael.Create(); RijndaelAlg.KeySize = 128; RijndaelAlg.Mode = CipherMode.CBC; CryptoStream cStream = новый CryptoStream(fStream, RijndaelAlg.CreateEncryptor(Key, IV), CryptoStreamMode.Read); и для расшифровки в PHP: mcrypt_cbc(MCRYPT_RIJNDAEL_128, $key, $buffer, MCRYPT_DECRYPT, $iv); - person Tim; 23.11.2010

У меня была аналогичная проблема несколько месяцев назад - у меня был проект, который должен был использовать шифрование AES, и мне нужно было убедиться, что между компонентами C# и A C++ используется один и тот же алгоритм. В итоге я реализовал общую библиотеку DLL, используемую обоими, на основе криптооболочки AES из этой статьи codeplex:

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

person BrokenGlass    schedule 16.11.2010