Я нашел несколько ответов на шифрование в 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);
Как правило, это зависит только от выбора правильных вариантов с обеих сторон:
Формат символа Plaintext
как символы открытого текста кодируются в битовой строке
набивка
как заполнить открытый текст, чтобы быть точным кратным размеру блока
Длина ключа
должны быть согласованы, если есть выбор
Вывод ключей
как создать битовую строку, которая будет использоваться для ключа
Режим
какой режим шифрования использовать
Формат хранения
как мы храним зашифрованный текст
Пожалуйста, смотрите здесь много информации об этих вещах. Особенно простыни, по-видимому, являются корнем большинства проблем взаимодействия, поскольку mcrypt
PHP использует по умолчанию NULL
пэддинг и не имеет встроенной поддержки для любого другого режима дополнений, в то время как, например, .NET даже не дает возможности использовать NULL
-память (поскольку это может вызвать проблемы при шифровании двоичных данных).
Я знаю, что это было задано некоторое время назад, но я думал, что отправлю решение для других. Я написал быстрый пример кода в PHP и C #, который позволяет шифровать / расшифровывать оба пути. У меня было несколько проблем с получением настроек с обеих сторон для разработки. Разница в заполнении позволит расшифровать один путь, но не другой
https://github.com/dchymko/.NET–PHP-encryption
надеюсь, что это поможет некоторым людям.
Вы используете один и тот же режим с обоими? Т.е. вы используете CBC с обоими (а не с ECB). Если вы не понимаете, что я только что сказал, отбросьте комментарий, и я объясню подробно, поскольку он имеет серьезные серьезные последствия для безопасности.
У меня была аналогичная проблема несколько месяцев назад – у меня был проект, который должен был использовать шифрование AES, и я должен был убедиться, что тот же самый алгоритм используется между компонентом C # и A C ++. Я закончил реализацию общей библиотеки DLL, используемой как на основе криптографической оболочки AES из этой статьи с кодом: