TEA 加密算法

function encrypt(val, key)

{

  // 128 bits (16 chars) of string 'key' are used to encrypt string 'val'; function

  // returns encrypted version of 'val'.

  var v = new Array(2), k = new Array(4), s = "", i;



  val = escape(val);  // use escape() so only have single-byte chars to encode



  k[0] = Str4ToLong(key.substr(0,4));

  k[1] = Str4ToLong(key.substr(4,4));

  k[2] = Str4ToLong(key.substr(8,4));

  k[3] = Str4ToLong(key.substr(12,4));



  for (i=0; i<val.length; i+=8) {  // encode val into s in 64-bit (8 char) blocks

    v[0] = Str4ToLong(val.substr(i,4));

    v[1] = Str4ToLong(val.substr(i+4,4));

    code(v, k);

    s += LongToStr4(v[0]) + LongToStr4(v[1]);

  }



//  return(s)       // deleted NVS  2005.04.27

  return(escape(s)) // corrected NVS 2005.04.27

  // note: if val or key are passed as string objects, rather than strings, this

  // function will throw an 'Object does not support this property or method' error

}





function decrypt(val, key)

{

  var v = new Array(2), k = new Array(4), s = "", i;



  k[0] = Str4ToLong(key.substr(0,4));

  k[1] = Str4ToLong(key.substr(4,4));

  k[2] = Str4ToLong(key.substr(8,4));

  k[3] = Str4ToLong(key.substr(12,4));



  val = unescape(val); // corrected NVS 2005.04.27

  for (i=0; i<val.length; i+=8) {  // decode val into s in 64-bit (8 char) blocks

    v[0] = Str4ToLong(val.substr(i,4));

    v[1] = Str4ToLong(val.substr(i+4,4));

    decode(v, k);

    s += LongToStr4(v[0]) + LongToStr4(v[1]);

  }



  if (s.indexOf("/x00") != -1) {

    // strip trailing null chars resulting from filling 4-char blocks

    s = s.substr(0, s.indexOf("/x00"));

  }



  return(unescape(s));

}





function code(v, k)

{

  // Extended TEA: this is the 1997 revised version of Needham & Wheeler''s algorithm

  // params: v[2] 64-bit value block; k[4] 128-bit key

  var y = v[0], z = v[1];

  var delta = 0x9E3779B9, limit = delta*32, sum = 0;



  while (sum != limit) {

    y += (z<<4 ^ z>>>5)+z ^ sum+k[sum & 3];

    sum += delta;

    z += (y<<4 ^ y>>>5)+y ^ sum+k[sum>>>11 & 3];

    // note: unsigned right-shift '>>>' is used in place of original '>>', due to lack

    // of 'unsigned' type declaration in JavaScript (thanks to Karsten Kraus for this)

  }

  v[0] = y; v[1] = z;

}





function decode(v, k)

{

  var y = v[0], z = v[1];

  var delta = 0x9E3779B9, sum = delta*32;



  while (sum != 0) {

    z -= (y<<4 ^ y>>>5)+y ^ sum+k[sum>>>11 & 3];

    sum -= delta;

    y -= (z<<4 ^ z>>>5)+z ^ sum+k[sum & 3];

  }

  v[0] = y; v[1] = z;

}





function Str4ToLong(s)  // convert 4 chars of s to a numeric long

{

  var v = s.charCodeAt(0) +

    (s.charCodeAt(1)<<8) +

    (s.charCodeAt(2)<<16) +

    (s.charCodeAt(3)<<24);

  return(isNaN(v) ? 0 : v);

}





function LongToStr4(v)  // convert a numeric long to 4 char string

{

  var s = String.fromCharCode(v & 0xFF, v>>8 & 0xFF, v>>16 & 0xFF, v>>24 & 0xFF);

  return(s);

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值