Разница в PHP-шифровании от iOS и .NET

У меня проблема при общении между 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 ==

определенно коротким (или другим – длинным) … снова искать ошибки.