-
-
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
patsuckow
commented
Sep 8, 2017
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment