У меня проблема при общении между iOS и PHP. У меня есть приложение, которое шифрует строку и отправляет ее на сервер PHP, который расшифровывает его. Эта часть работает отлично. Теперь сервер PHP должен отправить зашифрованный ответ обратно в приложение, которое, кажется, вызывает немного более седые волосы.
Проблема в том, что когда я шифрую строку в PHP, она отличается от той же строки, зашифрованной в iOS и даже .NET – очевидно, что все места используют один и тот же алгоритм, ключ и IV.
Я использую Rijndael 128 в режиме CBC с IV, состоящим из пустых байтов (до сих пор).
PHP-шифрование выглядит так:
$encrypted = mcrypt_encrypt( MCRYPT_RIJNDAEL_128, $this->secret_key, $str, MCRYPT_MODE_CBC, $this->iv ); $encrypted = base64_encode( $encrypted );
В этом файле содержится шифрование iOS:
StringEncryption.m: http://pastie.org/1365766
Я надеюсь, что кто-то может помочь мне определить, где я что-то упускаю или имею несколько разных параметров ценностей. Я смотрел на это несколько часов и не могу найти ничего другого, чтобы попробовать.
Скорее всего, это проблема заполнения. Пожалуйста, смотрите здесь или здесь для получения дополнительной информации.
EDIT после комментария OP:
PHP не имеет встроенной поддержки для других режимов заполнения, кроме NULL
padding. По крайней мере .Net позволяет указать NULL-padding (я думаю), другим вариантом будет реализация PKCS # 7-padding в PHP, что не так сложно сделать.
Вставьте входную строку с отступом от 1 до 8 байтов, чтобы общая длина была кратной 8 байтам. Значение каждого байта строки заполнения устанавливается на количество добавленных байтов – т.е. 8 байтов значения 0x08, 7 байтов значения 0x07, …, 2 байта 0x02 или один байт значения 0x01.
$blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); $padding = $blockSize - (strlen($data) % $blockSize); $data .= str_repeat(chr($padding), $padding);
После долгого теста я считаю, что этот метод шифрования подходит для тестов:
function mc_encrypt($str = "Affe", $key = "12345678901234567890123456789012") { $str = "Affe"; $block = mcrypt_get_block_size('rijndael-256', 'cbc'); $pad = $block - (strlen($str) % $block); $str .= str_repeat(chr($pad), $pad); $encoded = base64_encode(mcrypt_encrypt('rijndael-256', $key, $str, 'cbc',$key)); file_put_contents("test.txt",$encoded); return $encoded; }
Я получил это на iOS: v + cB4woDYANTozUbOgxJ4rWKb59EfLf6NkRE / Ee0kYY = Но если я попытаюсь расшифровать (см. Выше), я получил (null)
На другом, если я зашифрую на iOS, я получил это: UUfn34iyNlSK40VaehloaQ ==
определенно коротким (или другим – длинным) … снова искать ошибки.