Шифрование PHP iOS AES

У меня возникли проблемы с попыткой установить связь между PHP и моим приложением IOS с использованием шифрования AES.

До сих пор я рассмотрел два метода реализации. Первым было использование OpenSSL.
На стороне iOS я реализовал способ имитировать код, показанный здесь: http://saju.net.in/code/misc/openssl_aes.c.txt .

На стороне PHP я взял сгенерированный ключ и IV (из iPhone) и использовал его в качестве входа в шифрование PHP openssl.

Результаты отличаются по объему вывода …

Я также рассмотрел: http://iphonedevelopment.blogspot.com/2009/02/strong-encryption-for-cocoa-cocoa-touch.html

но это сообщение SO: расшифровка AESCrypt между iOS и PHP удержала меня.

Проект не привязан к AES, он просто выглядит как сильный алгоритм шифрования, который не будет слишком сложным для реализации.

Мой основной вопрос: какой самый простой способ реализовать хороший алгоритм шифрования, который можно легко использовать для связи между iOS и PHP?

Как сказано в комментариях, вам, вероятно, будет проще использовать HTTPS.

Я когда-то настраивал приложение для iPhone, которому приходилось общаться с PHP-сервером через HTTPS, и много часов пытался выяснить, почему iPhone не будет принимать зашифрованное соединение.

Как оказалось, это не сработало, потому что я использовал самозаверяющий сертификат на стороне сервера. Покупка сертификата SSL из центра сертификации разрешила все проблемы.

SSL-сертификаты, которые проверяют одно доменное имя без компании или расширенную проверку, действительно дешевы, поэтому я предлагаю вам попробовать!

Я просто прошел через этот проект. Я использовал библиотеку, на которую вы ссылались, в «также рассмотренной …»

Вот пример кода для расшифровки с помощью php:

$iv2 = ''; for($i=0;$i<16;$i++){ $iv2 .= "\0"; } $plain_text_CBC = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encrypted_text, MCRYPT_MODE_CBC, $iv2); var_dump($plain_text_CBC); 

Убедитесь, что ваши ключи оба 256-битные (32 символа, у меня еще не было проблем с кодировкой, но если вы это сделаете, помните, что вы шифруете байты, а не символы). Обратите внимание: 128 в MCRYPT_RIJNDAEL_128 – это размер блока, а не размер ключа, а в методе AES256DecryptWithKey 256 – это ссылка на размер ключа, а размер блока – 128. AES256DecryptWithKey работает в режиме CBC, но имеет нулевой вектор инициализации ( IV).

CBC означает, что каждый блок зависит от последнего блока, и поэтому он использует предварительно установленный, обычно случайный, «блок -1», называемый IV

ECB означает, что каждый блок зашифрован таким же образом, поэтому он показывает, когда два блока в одном сообщении одинаковы. В упомянутой библиотеке не используется, поэтому я упомянул об этом просто для контраста.

Использование нуля iv (0000000000000000 в байтах) считается небезопасным. Чтобы исправить это, вам нужно будет создать переменную NSData * iv для IV и изменить аргумент CCcrypt NSData + AESCrypt.m, чтобы добавить [iv bytes] для параметра iv (я еще не тестировал этот код), и вы бы необходимо сохранить этот iv и передать его на php вместе с вами. Но сначала я бы проверил и все работаю с нулевым iv.

Для прямого примера, мой проект с открытым исходным кодом «Техно Tap» содержит источник PHP и iOS, который успешно использует шифрование AES, не стесняйтесь посмотреть здесь

Шифрование на iOS выполняется в ScoreboardManager.m (с использованием NSData + AES), а дешифрование выполняется на стороне PHP в Scoreboard.php