Как работает шифрование? - PullRequest
2 голосов
/ 22 мая 2011

Я нашел этот код дешифрования шифрования в основных классах CakePHP после отладки, почему он не работает на моем сервере .

Мне просто интересно, какая логика стоит за ним.Как именно это удается зашифровать и расшифровать?Почему for..loop с $ j и как оператор XOR ^ помогает в этом?

function cipher($text, $key) {
    if (!defined('CIPHER_SEED')) {
        //This is temporary will change later
        define('CIPHER_SEED', '76859309657453542496749683645');
    }
    srand(CIPHER_SEED);
    $out = '';

    for ($i = 0; $i < strlen($text); $i++) {
        for ($j = 0; $j < ord(substr($key, $i % strlen($key), 1)); $j++) {
            $toss = rand(0, 255);
        }
        $mask = rand(0, 255);
        $out .= chr(ord(substr($text, $i, 1)) ^ $mask);
    }
    return $out;
}

1 Ответ

2 голосов
/ 22 мая 2011

^ - это битовый оператор XOR . Таким образом, он шифрует каждый символ по очереди поразрядно , XOR его со "случайным" символом. Эта операция является собственной обратной, то есть (a ^ b) ^ b == a. Таким образом, до тех пор, пока вы генерируете ту же последовательность «случайных» символов маски во время дешифрования, что и во время шифрования, вы всегда будете возвращаться к тому, с чего начали.

Цикл $j выглядит так, как будто он использует $key для отбрасывания определенной части потока значений, генерируемых rand(). Это выглядит как дешевый способ получить много разных случайных потоков из одного и того же ГСЧ. Я не уверен, что это очень безопасный метод. Домашние попытки шифрования обычно имеют чрезвычайно серьезные недостатки по сравнению с установленными методами, такими как AES.

...