RC4 encrypt/decrypt на php

netdog

net @
RC4 encrypt/decrypt на php

мот у кого-нить есть сабж, или знает где мона достать.
 

valyala

Новичок
мот у кого-нить есть сабж, или знает где мона достать.
Net Dog, за $200 напишу эксклюзивную версию специально для тебя. Если заплатишь больше, могу создать библиотеку для PHP, написанную на Си.
 

netdog

net @
Автор оригинала: valyala
Net Dog, за $200 напишу эксклюзивную версию специально для тебя. Если заплатишь больше, могу создать библиотеку для PHP, написанную на Си.
valyala за $200 я сам для себя напишу библиотеку на Си ;)

Лучше подскажи Что за ECB Mode такой, при шифровке, в часности в том же rc4
;)
 

valyala

Новичок
valyala за $200 я сам для себя напишу библиотеку на Си
Пиши ;)
Лучше подскажи Что за ECB Mode такой, при шифровке, в часности в том же rc4
ECB (Electronic CodeBook) - режим простой замены. Обычно используется совместно с блочными алгоритмами шифрования. В этом режиме каждый блок открытого текста шифруется независимо от других блоков. Другими словами, ключ шифрования K задает обратимое отображение E(K): P -> P на множестве всевозможных блоков P. Это означает, что одинаковые блоки открытого текста заменяются одинаковыми блоками шифртекста.
RC4 - синхронный потоковый криптоалгоритм, в котором используется режим OFB (Output FeedBack) - обратной связи по выходу.
Кроме ECB и OFB существуют и другие режимы шифрования. Наиболее распространены CBC (Cipher Block Chaining) - режим сцепления блоков шифртекста и CFB (Cipher FeedBack) - гаммирование с обратной связью.

Net Dog, раз ты такой скупой, что не захотел дать мне $200, будешь должен бутылку пива ;) Вот то, что ты просил:
PHP:
/**
    функция rc4_init_s($key)
    инициализирует S-блок, необходимый для работы 8-битового
    криптоалгоритма rc4, с помощью ключа $key
    Возвращает инициализированнй S-блок
*/
function rc4_init_s($key) {
    // инициализация вспомогательного массива $k
    $k = unpack('C*', $key);
    array_unshift($k, array_shift($k));
    $n = sizeof($k);
    $i = $n;
    for ($i = $n; $i < 0x100; $i++) $k[$i] = $k[$i % $n];
    for ($i--; $i >= 0x100; $i--) $k[$i & 0xff] ^= $k[$i];
    // предварительное заполнение S-блока
    $s = array();
    for ($i = 0; $i < 0x100; $i++) $s[$i] = $i;
    $j = 0;
    // инициализация S-блока
    for ($i = 0; $i < 0x100; $i++) {
        $j = ($j + $s[$i] + $k[$i]) & 0xff;
        // перестановка $s[$i] и $s[$j]
        $tmp = $s[$i];
        $s[$i] = $s[$j];
        $s[$j] = $tmp;
    }
    return $s;
}

/**
    функция rc4_crypt($text, $key)
    выполняет шифрование/расшифрование текста/шифртекста $text
    с помощью 8-битного потокового криптоалгоритма rc4, используя
    в качестве ключа шифрования строку $key
    Возвращает зашифрованный/расшифрованный текст/шифртекст
*/
function rc4_crypt($text1, $key) {
    $s = rc4_init_s($key); // инициализация s-блока
    $n = strlen($text1);
    $text2 = '';
    $i = $j = 0;
    for ($k = 0; $k < $n; $k++) {
        $i = ($i + 1) & 0xff;
        $j = ($j + $s[$i]) & 0xff;
        // перестановка $s[i] и $s[$j]
        $tmp = $s[$i];
        $s[$i] = $s[$j];
        $s[$j] = $tmp;
        // наложение/снятие гаммы
        $text2 .= $text1{$k} ^ chr($s[$i] + $s[$j]);
    }
    return $text2;
}

/**
    функция rc4_encrypt($plain_text, $password)
    зашифровывает строку $plain_text с помощью 8-битового алгоритма
    шифрования rc4, используя в качестве пароля строку $password
    Возвращает base64-encoded шифртекст
*/
function rc4_encrypt($plain_text, $password) {
    return base64_encode(rc4_crypt($plain_text, $password));
}

/**
    функция rc4_decrypt($enc_text, $password)
    расшифровывает base64-encoded шифртекст $enc_text с помощью
    8-битового алгоритма шифрования rc4, используя в качестве
    пароля строку $password
*/
function rc4_decrypt($enc_text, $password) {
    return rc4_crypt(base64_decode($enc_text), $password);
}
-~{}~ 20.04.04 15:08:

Прочитал свои объяснения, что такое ECB, и ничего не понял. Попытаюсь объяснить более доступным языком. ;)
Пусть:
n – длина блока
P(i)i-й блок открытого текста,
C(i)i-й блок шифртекста
Ek(X) – функция шифрования блока X
Dk(Y) – функция дешифрования блока Y
X ^ Y – побитовая операция сложения по модулю 2 над блоками X и Y
X << b – логический сдвиг влево блока X на b бит
X >> b – логический сдвиг вправо блока X на b бит
X % Y – остаток от целочисленного деления числа X на Y
X | Y – побитовая операция логического ИЛИ над блоками X и Y.

Тогда режим ECB можно представить так:
зашифрование: C(i) = Ek(P(i))
дешифрование: P(i) = Dk(C(i))
CBC:
зашифрование: C(i) = Ek(P(i) ^ C(i – 1))
дешифрование: P(i) = Dk(C(i)) ^ C(i – 1)
b-битовый OFB (b <= n):
зашифрование:
C(i) = (Ek(X) >> (n - b)) ^ P(i)
X = ((X << b) | C(i) ^ P(i)) % (1 << n)

дешифрование:
P(i) = (Ek(X) >> (n - b)) ^ C(i)
X = ((X << b) | C(i) ^ P(i)) % (1 << n)
b-битовый CFB (b <= n):
зашифрование:
C(i) = (Ek(X) >> (n – b)) ^ P(i)
X = ((X << b) | C(i)) % (1 << n)

дешифрование:
P(i) = (Ek(X) >> (n – b)) ^ C(i)
X = ((X << b) | C(i)) % (1 << n)
Режим простой замены (ECB) применяется для шифрования высокоэнтропийных данных (сессионные ключи, случайные или сжатые данные), для которых трудно реализовать атаку на основе открытого текста.

Режим сцепления блоков шифртекста (CBC) применяется в случаях, когда необходимо скрыть структуру открытого текста. Используется в большинстве современных программ шифрования файлов.

С помощью режима обратной связи по шифртексту (CFB) блочный шифр преобразуется в самосинхронизирующийся потоковый шифр. Используется в тех случаях, когда размер шифруемых данных может быть меньше размера блока шифртекста. Например, при защищенной передаче информации по открытым каналам связи (vpn).

С помощью режима обратной связи по выходу (OFB) блочный шифр преобразуется в синхронный потоковый шифр. Используется в случаях, когда необходима предварительная генерация гаммы (псевдослучайной последовательности, которая зависит только от ключа шифрования, накладываемой на открытый текст с помощью побитовой операции сложения по модулю 2).
 
Сверху