Skip to content

Instantly share code, notes, and snippets.

@bellbind
Created July 19, 2011 15:18
Show Gist options
  • Save bellbind/1092724 to your computer and use it in GitHub Desktop.
Save bellbind/1092724 to your computer and use it in GitHub Desktop.
[javascript]arcfour aka RC4 enc/decript function
// arcfour aka RC4 enc/decrypt function
// see: http://en.wikipedia.org/wiki/RC4
arcfour = (function () {
"use strict";
var swap = function (a, i, j) {
var tmp = a[i];
a[i] = a[j];
a[j] = tmp;
};
var ksa = function (key) {
var buf = [];
for (var i = 0; i < 256; i++) {
buf[i] = i;
}
var j = 0;
for (var i = 0; i < 256; i++) {
j = (j + buf[i] + key[i % key.length]) % 256;
swap(buf, i, j);
}
return buf;
};
var prga = function (buf) {
var i = 0;
var j = 0;
return function () {
i = (i + 1) % 256;
j = (j + buf[i]) % 256;
swap(buf, i, j);
return buf[(buf[i] + buf[j]) % 256];
};
};
return function (data, key) {
var keybuf = ksa(key);
var keygen = prga(keybuf);
var result = [];
for (var i = 0; i < data.length; i++) {
result[i] = data[i] ^ keygen();
}
return result;
};
})();
// run example with node.js: node example.js
require("./arcfour");
require("./utf8");
// example
var key = UTF8.toBytes("JavaScript");
var src = UTF8.toBytes("Hello Word!こんにちは世界");
var enc = arcfour(src, key);
var dec = arcfour(enc, key);
console.log(src);
console.log(enc);
console.log(dec);
console.log(UTF8.toText(dec));
// UTF8 codec
UTF8 = (function () {
"use strict";
var fromCharCode = function (code) {
if (code <= 0x7F) return [code];
var tail = [];
var hmask = 0x02;
while (code > 0x3F) {
tail.unshift(0x80 | (0x3F & code));
code = code >> 6;
hmask = (hmask | 0x01) << 1;
}
return [hmask << (6 - tail.length) | code].concat(tail);
};
var toCharCode = function (buf) {
var h = buf.shift();
if ((0x80 & h) === 0) return h;
var code = 0;
var shift = 0;
var mask = 0x3F;
while ((0x80 & (h << (shift + 1))) !== 0) {
code = (code << 6) | (0x3F & buf.shift());
shift += 1;
mask = mask >> 1;
}
return ((h & mask) << (6 * shift)) | code;
};
return {
toBytes: function (text) {
var result = [];
for (var i = 0; i < text.length; i++) {
var code = text.charCodeAt(i);
result = result.concat(fromCharCode(code));
}
return result;
},
toText: function (bytes) {
bytes = bytes.slice();
var result = "";
while (bytes.length > 0) {
var code = toCharCode(bytes);
result += String.fromCharCode(code);
}
return result;
}
};
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment