mirror of https://github.com/svaarala/duktape.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
1.4 KiB
76 lines
1.4 KiB
12 years ago
|
/* http://en.wikipedia.org/wiki/RC4 */
|
||
|
|
||
|
/*===
|
||
|
Key Plaintext
|
||
|
bbf316e8d940af0ad3
|
||
|
Wiki pedia
|
||
|
1021bf0420
|
||
|
Secret Attack at dawn
|
||
|
45a01f645fc35b383552544b9bf5
|
||
|
===*/
|
||
|
|
||
|
var S = [];
|
||
|
var gi, gj;
|
||
|
|
||
|
function swap(i, j) {
|
||
|
var t;
|
||
|
t = S[i]; S[i] = S[j]; S[j] = t;
|
||
|
}
|
||
|
|
||
|
function keySetup(key) {
|
||
|
var i, j, t;
|
||
|
|
||
|
S = [];
|
||
|
for (i = 0; i < 256; i++) {
|
||
|
S[i] = i;
|
||
|
}
|
||
|
|
||
|
for (j = 0, i = 0; i < 256; i++) {
|
||
|
j = (j + S[i] + key.charCodeAt(i % key.length)) % 256;
|
||
|
swap(i, j);
|
||
|
}
|
||
|
|
||
|
gi = 0; gj = 0;
|
||
|
}
|
||
|
|
||
|
function encrypt(plain) {
|
||
|
var i;
|
||
|
var t;
|
||
|
var K;
|
||
|
var res = [];
|
||
|
|
||
|
for (i = 0; i < plain.length; i++) {
|
||
|
gi = (gi + 1) % 256;
|
||
|
gj = (gj + S[gi]) % 256;
|
||
|
swap(gi, gj);
|
||
|
K = S[(S[gi] + S[gj]) % 256];
|
||
|
res.push(plain.charCodeAt(i) ^ K);
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
function testVectorTest() {
|
||
|
var tests = [
|
||
|
{ key: 'Key', plain: 'Plaintext' },
|
||
|
{ key: 'Wiki', plain: 'pedia' },
|
||
|
{ key: 'Secret', plain: 'Attack at dawn' }
|
||
|
];
|
||
|
|
||
|
tests.forEach(function(t) {
|
||
|
var res;
|
||
|
print(t.key, t.plain);
|
||
|
keySetup(t.key);
|
||
|
res = encrypt(t.plain);
|
||
|
print(res.map(function(x) {
|
||
|
var nybbles = '0123456789abcdef';
|
||
|
return nybbles[x >> 4] + nybbles[x & 0x0f];
|
||
|
}).join(''));
|
||
|
});
|
||
|
}
|
||
|
|
||
|
try {
|
||
|
testVectorTest();
|
||
|
} catch (e) {
|
||
|
print(e);
|
||
|
}
|