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

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

7 голосов
/ 09 декабря 2011

У меня возникли проблемы при попытке установить связь между 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?

Ответы [ 3 ]

3 голосов
/ 03 января 2012

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

Вот пример кода, который можно расшифровать с помощью 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.

1 голос
/ 16 декабря 2011

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

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

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

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

0 голосов
/ 28 декабря 2015

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

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

...