Как я могу зашифровать с помощью AES в C #, чтобы я мог расшифровать его в PHP? - PullRequest
0 голосов
/ 16 ноября 2010

Я нашел несколько ответов на Encrypt в PHP и Decrypt на 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);

Ответы [ 4 ]

1 голос
/ 27 августа 2011

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

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

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

1 голос
/ 16 ноября 2010

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

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

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

  • Заполнение

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

  • Длина ключа

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

  • Ключвывод

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

  • Mode

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

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

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

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

0 голосов
/ 16 ноября 2010

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

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

0 голосов
/ 16 ноября 2010

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

...