-
-
Save patsuckow/3f8ff1a041eedec10f2f80388d36c462 to your computer and use it in GitHub Desktop.
RC4 encryption in javascript and php
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * RC4 symmetric cipher encryption/decryption | |
| * @see https://gist.github.com/farhadi/2185197 and https://en.wikipedia.org/wiki/RC4 | |
| * @license Public Domain | |
| * | |
| * @param key - secret key for encryption/decryption | |
| * @param str - string to be encrypted/decrypted | |
| * @return string | |
| */ | |
| function rc4(key, str){ | |
| let s = []; | |
| let j = 0; | |
| let x; | |
| for (let i = 0; i < 255; i++){ | |
| s[i] = i; | |
| } | |
| for (let i = 0; i < 255; i++) { | |
| // charCodeAt() - возвращает числовое значение Юникода для символа по указанному индексу (за исключением кодовых точек Юникода, больших 0x10000). | |
| // key.length - содержит количество юникодных символов в строке. Для пустой строки, length равно 0. | |
| j = (j + s[i] + key.charCodeAt(i % key.length)) % 256; // n = 8 ; 2^8 = 256 | |
| // меняем местами i и j | |
| x = s[i]; | |
| s[i] = s[j]; | |
| s[j] = x; | |
| } | |
| // Генерация псевдо-случайного слова (для n = 8 будет сгенерирован один байт) | |
| let i = 0; | |
| j = 0; | |
| let res = ''; | |
| for (let y = 0; y < str.length; y++) { | |
| i = (i + 1) % 256; | |
| j = (j + s[i]) % 256; | |
| x = s[i]; | |
| s[i] = s[j]; | |
| s[j] = x; | |
| // charCodeAt() - возвращает числовое значение Юникода для символа по указанному индексу (за исключением кодовых точек Юникода, больших 0x10000). | |
| // String.fromCharCode() - возвращает строку, созданную из указанной последовательности значений Юникода. Этот метод возвращает примитивную строку, а не объект String. | |
| res += String.fromCharCode(str.charCodeAt(y) ^ s[(s[i] + s[j]) % 256]); | |
| } | |
| return res; | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| /** | |
| * RC4 symmetric cipher encryption/decryption | |
| * @see https://gist.github.com/farhadi/2185197 and https://en.wikipedia.org/wiki/RC4 | |
| * @license Public Domain | |
| * | |
| * @param $key - secret key for encryption/decryption | |
| * @param $str - string to be encrypted/decrypted | |
| * @return string | |
| */ | |
| function rc4($key, $str){ | |
| // Инициализация S-блока | |
| $s = []; | |
| $j = 0; | |
| for ($i = 0; $i < 255; $i++){ | |
| $s[$i] = $i; | |
| } | |
| for ($i = 0; $i < 255; $i++){ | |
| // ord() - Возвращает ASCII-код символа в виде целого числа | |
| // strlen() — Возвращает длину строки (0, если string пустая). Возвратит количество байт, а не число символов в строке! | |
| $j = ($j + $s[$i] + ord($key[$i % strlen($key)])) % 256; // n = 8 ; 2^8 = 256 | |
| // меняем местами $i и $j | |
| $x = $s[$i]; | |
| $s[$i] = $s[$j]; | |
| $s[$j] = $x; | |
| } | |
| // Генерация псевдо-случайного слова (для n = 8 будет сгенерирован один байт) | |
| $i = 0; | |
| $j = 0; | |
| $res = ''; | |
| for ($y = 0; $y < strlen($str); $y++){ | |
| $i = ($i + 1) % 256; | |
| $j = ($j + $s[$i]) % 256; | |
| // меняем местами $s[$i] и $s[$j] | |
| $x = $s[$i]; | |
| $s[$i] = $s[$j]; | |
| $s[$j] = $x; | |
| // Конкатенируем результат | |
| // chr - Возвращает символ по его коду | |
| // ^ побитовая операция - "Исключающее ИЛИ" (http://php.net/manual/ru/language.operators.bitwise.php) | |
| // $str[$y] - это не обращение к символу с индексом $y в строке $str, это обращение к байту | |
| $res .= $str[$y] ^ chr($s[($s[$i] + $s[$j]) % 256]); | |
| } | |
| return $res; | |
| } | |
| ?> |
Author
Author
Ещё варианты этого RC4 алгоритма шифрования:
https://www.npmjs.com/package/simple-rc4
https://www.npmjs.com/package/rc4a -> https://github.com/iLeonidze/RC4A.php/blob/master/rc4a.php
https://www.npmjs.com/package/spritzjs -> https://github.com/therealjampers/spritzjs -> https://github.com/therealjampers/spritzjs/tree/master/doc
https://www.npmjs.com/package/rc4 -> https://github.com/phadej/rc4
https://www.npmjs.com/package/arc4 -> https://github.com/hex7c0/arc4
Other (known) Implementations:
https://github.com/relrod/spritz
https://github.com/msgodf/spritz-clojure
https://github.com/codahale/spritz
https://github.com/dgryski/go-spritz
https://github.com/coderslagoon/estreamJ
https://github.com/jedisct1/spritz
https://github.com/k5okc/Spritz
https://github.com/skeeto/emacs-spritz
Author
c = s.charCodeAt(i); <---> $c = ord($s[$i]);
r += String.fromCharCode(c); <---> $r .= chr($c);
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Из-за разной реализации, эти методы не получится использовать в связке, т.е. при попытке сгенерировать секретный текст на php и потом попытаться его расшифровать в js - ничего не получится.