xor мультибайтовых строк

LotteB

Новичок
Здравствуйте, не понимаю как в php сделать xor мультибайтовых строк, в сети полно примеров, но все они не подойдут для русских букв.
Аналогичная задача во флэше (as3) решается без проблем и каких-то специальных решений.

Пытался оптимизировать примеры, но с русскими символами все равно не работает, они считаются неправильно, с англ все верно.

PHP:
function xorEncode($str, $key) {
    $strlen = mb_strlen($str);
    $keylen = mb_strlen($key);
    for ($i = 0; $i < $strlen; $i++) {
        $r = ordUTF8( $str{$i} ) ^ ordUTF8 $key{$i % $keylen} );
        $str{$i} = chr($r);
    }
    return $str;
}
 

Вурдалак

Продвинутый новичок
Потому что в PHP $str[$i] возвращает байт, а не символ. Собственно, замени просто mb_strlen на strlen, ordUTF8 на ord, попутно исправив синтаксическую ошибку, и всё будет работать.
 

LotteB

Новичок
Потому что в PHP $str[$i] возвращает байт, а не символ. Собственно, неясно зачем тебе именно так, замени просто mb_strlen на strlen, ordUTF8 на ord, попутно исправив синтаксическую ошибку, и всё будет работать.
Именно так, потому что я сравниваю результаты с другим языком программирования и получаю разные значения, обратная операция в php также показывает, что только русские буквы не читаются, в другом языке все ок.

Данный вариант НЕ РАБОТАЕТ с русскими буквами
PHP:
function xorEncode($str, $key) {
    $strlen = strlen($str);
    $keylen = strlen($key);
    for ($i = 0; $i < $strlen; $i++) {
        $r = ord( $str{$i} ) ^ ord( $key{$i % $keylen} );
        $str{$i} = chr($r);
    }
    return $str;
}
По поводу $str[$i] спасибо, не обратил внимание, что это байт, тогда действительно первый вариант работать не будет, т.к. цикл по кол-ву символов, а xor получается по байтам без учета кол-ва байтов в символе.
 

Вурдалак

Продвинутый новичок
Он должен работать, простой как топор. Другое дело, что результаты будут не такие, как на другом языке с другим алгоритмом. Если нужна совместимость с тем алгоритмом, то придётся заменить $str[$i] на mb_substr(), chr() на UTF8-аналог.

P.S. Только вот мне кажется, что не всегда валидный UTF-8 будет в итоге.
 
Сверху