[JavaScript] 纯文本查看 复制代码 function rc4(data, key) {
var m = [];
for (let i = 0; i < 256; i++) {
m = i;
}
var k = new Array(256);
var result = [];
var length1 = key.length;
let decrypt = Array.isArray(data);
if (!decrypt) data = textToByte(data);
var length = data.length;
if (length1 > 0) {
let b_key = textToByte(key);
let j = 0;
for (i = 0; i < 256; i++) {
k = b_key[j];
j++;
if (j >= length1) {
j = 0;
}
}
j = 0;
let temp;
for (i = 0; i < 256; i++) {
j = (j + m + k) & 255;
temp = m;
m = m[j];
m[j] = temp;
}
}
var i = 0, j = 0, temp;
for (var x = 0; x < length; x++) {
i = (i + 1) & 255;
j = (j + m) & 255;
temp = m;
m = m[j];
m[j] = temp;
result.push(data[x] ^ m[(m + m[j]) & 255]);
}
return decrypt ? bytesToText(result) : result;
}
function textToByte(str) {
var len = str.length;
var bytes = [];
for (var i = 0; i < len; i++) {
var c = str.charCodeAt(i);
if (c >= 0x010000 && c <= 0x10FFFF) {
bytes.push(((c >> 18) & 0x07) | 0xF0);
bytes.push(((c >> 12) & 0x3F) | 0x80);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else if (c >= 0x000800 && c <= 0x00FFFF) {
bytes.push(((c >> 12) & 0x0F) | 0xE0);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else if (c >= 0x000080 && c <= 0x0007FF) {
bytes.push(((c >> 6) & 0x1F) | 0xC0);
bytes.push((c & 0x3F) | 0x80);
} else {
bytes.push(c & 0xFF);
}
}
return bytes;
}
function bytesToText(bytes) {
var text = "";
var i = 0;
while (i < bytes.length) {
var byte1 = bytes;
// 处理单字节ASCII字符 (0-127)
if (byte1 < 128) {
text += String.fromCharCode(byte1);
i += 1;
}
// 处理双字节字符 (192-223)
else if (byte1 >= 192 && byte1 < 224) {
if (i + 1 >= bytes.length) break;
var byte2 = bytes[i + 1];
text += String.fromCharCode(
((byte1 & 31) << 6) |
(byte2 & 63)
);
i += 2;
}
// 处理三字节字符 (224-239)
else if (byte1 >= 224 && byte1 < 240) {
if (i + 2 >= bytes.length) break;
var byte2 = bytes[i + 1];
var byte3 = bytes[i + 2];
text += String.fromCharCode(
((byte1 & 15) << 12) |
((byte2 & 63) << 6) |
(byte3 & 63)
);
i += 3;
}
// 其他情况跳过
else {
i += 1;
}
}
return text;
}
// 示例用法:
let password = "123456";
let text = "你好,世界";
// 加密
let encryptedBuffer = rc4(text, password);
console.log("加密:", encryptedBuffer);
// 解密
let decryptedText = rc4(encryptedBuffer, password);
console.log("解密:", decryptedText);
|