Отличия в шифровании PHP от iOS и .NET - PullRequest
1 голос
/ 10 декабря 2010

У меня проблема при обмене данными в зашифрованном виде между 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

Я надеюсь, что кто-то может помочь мне определить, где я что-то упускаю или у меня есть какие-то другие параметры значений. Я смотрел на это в течение нескольких часов, и больше ничего не могу попробовать.

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

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

EDIT после комментария OP:

В PHP нет встроенной поддержки других режимов заполнения, кроме NULL.По крайней мере .Net позволяет вам задавать заполнение NULL (я думаю), другой вариант - реализовать заполнение PKCS # 7 в 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);
0 голосов
/ 09 октября 2012

После долгих тестов, я думаю, этот метод шифрования будет правильным для тестов:

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 = Но если я попытаюсь расшифровать (см. Выше), я получил (ноль)

С другой стороны, если я зашифровал на iOS, я получил это: UUfn34iyNlSK40VaehloaQ ==

определенно для короткой (или другой для длинной) ... снова поиск ошибок.

...