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

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

На заднем плане я хочу:

В C #: AES шифрует содержимое файла. Загрузите данные (скорее всего через http через 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); 

Solutions Collecting From Web of "Как я могу зашифровать AES в C #, чтобы расшифровать его в PHP?"

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

  • Формат символа Plaintext

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

  • набивка

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

  • Длина ключа

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

  • Вывод ключей

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

  • Режим

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

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

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

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

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

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

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

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

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

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