JS RC4加解密報文

JS RC4加解密

RC4(來自Rivest Cipher 4的縮寫)是一種流加密算法,密鑰長度可變。它加解密使用相同的密鑰,因此也屬於對稱加密算法。RC4加密算法原理 , 對明文使用同一個密鑰異或兩次最後是得到原文。
這個不是加解密字符串,它是用於協議數據傳輸過程中通信報文的加密

const RC4_KEY_LEN_MAX = 256;

var rc4CalcTemplate = {
	Rc4Key : "65osdbsfidcxza", // 自己約定的密鑰
	Keylen : 0,
	Rc4Sbox : new Array(256),
};

/*初始化函數*/
function rc4_init(){
	rc4CalcTemplate.Keylen = rc4CalcTemplate.Rc4Key.length;
	var j=0;
	var k = new Array(256);
	var tmp = 0;

	for(let i = 0; i < 256; i++){
		rc4CalcTemplate.Rc4Sbox[i] = i;
		k[i] = String(rc4CalcTemplate.Rc4Key[i%rc4CalcTemplate.Keylen]).charCodeAt(0);
	}

	for(let i = 0;i < 256; i++){
		j = (j + rc4CalcTemplate.Rc4Sbox[i] + k[i]) % 256;
        tmp = rc4CalcTemplate.Rc4Sbox[i];
        rc4CalcTemplate.Rc4Sbox[i]= rc4CalcTemplate.Rc4Sbox[j];//交換s[i]和s[j]
        rc4CalcTemplate.Rc4Sbox[j] = tmp;
	}
}
/*加解密*/
function rc4_crypt(Data, Len){
	var i = 0, j = 0, t = 0,sLen = 0;
    var k = 0;
    var tmp;
    var s = new Array(RC4_KEY_LEN_MAX);
    var result = new Array(Len);
    for (sLen = 0; sLen < RC4_KEY_LEN_MAX; sLen++)
    {
        s[sLen] = rc4CalcTemplate.Rc4Sbox[sLen];
    }
    for (k = 0; k < Len; k++)
    {
        i = (i + 1) % 256;
        j = (j + s[i]) % 256;
        tmp = s[i];
        s[i] = s[j];//交換s[x]和s[y]
        s[j] = tmp;
        t = (s[i] + s[j]) % 256;
        result[k] = Data[k] ^ s[t];
    }
    return result;
}
/* 初始化 */
rc4_init();
var input = [0x75, 0x9A, 0xC0, 0x89, 0x18, 0x06, 0x76, 0xC9, 0x52, 0x0C, 0x49, 0x76, 0x3B, 0x35, 0xA9, 0x13, 0x81, 0x48, 0xBE, 0x9C, 0xE1, 0x08, 0xA7, 0x01, 0x9A, 0xD9, 0xB4, 0x57, 0xA4, 0xDE, 0x42, 0x7E, 0x99, 0x55, 0x05, 0x63, 0x78, 0xC7, 0xB8];
var result= rc4_crypt(input, input.length);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章