Skip to content

Instantly share code, notes, and snippets.

@patsuckow
Forked from farhadi/rc4.js
Last active September 8, 2017 13:12
Show Gist options
  • Select an option

  • Save patsuckow/3f8ff1a041eedec10f2f80388d36c462 to your computer and use it in GitHub Desktop.

Select an option

Save patsuckow/3f8ff1a041eedec10f2f80388d36c462 to your computer and use it in GitHub Desktop.
RC4 encryption in javascript and 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){
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;
}
<?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;
}
?>
@patsuckow
Copy link
Author

patsuckow commented Aug 29, 2017

Из-за разной реализации, эти методы не получится использовать в связке, т.е. при попытке сгенерировать секретный текст на php и потом попытаться его расшифровать в js - ничего не получится.

@patsuckow
Copy link
Author

patsuckow commented Aug 29, 2017

Ещё варианты этого 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

@patsuckow
Copy link
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