XXTEA算法的结构非常简单,只需要执行加法、异或和寄存的硬件即可,且软件实现的代码非常短小,具有可移植性。
维基百科地址:http://en.wikipedia.org/wiki/XXTEA
之前分析QQ, 微信协议的时候, 发现有些场合用的也是XXTEA算法;
为了能在白鹭项目里面使用, 封装了个TS版本;
感谢xxtea-nodejs的作者~
https://github.com/xxtea/xxtea-nodejs
使用例子:
let _xxtea = xxtea.getInstance(); //获取实例
let raw_data = 'hello, xxtea'
let encrypt_data = _xxtea.encrypt(raw_data, "passwd"); //加密
let decrypt_data = _xxtea.decrypt(encrypt_data , "passwd"); //解密
代码:
//////////////////////////////////////////////////////////////////////////////////////////////////
//xxtea.ts
class xxtea
{
private constructor(){}
private static instance: xxtea;
private _protoBufRoot;
static getInstance(): xxtea{
if(!xxtea.instance){
xxtea.instance = new xxtea();
xxtea.instance.initInstance();
}
return this.instance;
}
//init function
private initInstance(){
}
///////////////////////////////////////////////
private delta:number = 0x9E3779B9;
public toUint8Array(v, includeLength) {
var length = v.length;
var n = length << 2;
if (includeLength) {
var m = v[length - 1];
n -= 4;
if ((m < n - 3) || (m > n)) {
return null;
}
n = m;
}
var bytes = new Uint8Array(n);
for (var i = 0; i < n; ++i) {
bytes[i] = v[i >> 2] >> ((i & 3) << 3);
}
return bytes;
}
public toUint32Array(bytes, includeLength) {
var length = bytes.length;
var n = length >> 2;
if ((length & 3) !== 0) {
++n;
}
var v;
if (includeLength) {
v = new Uint32Array(n + 1);
v[n] = length;
}
else {
v = new Uint32Array(n);
}
for (var i = 0; i < length; ++i) {
v[i >> 2] |= bytes[i] << ((i & 3) << 3);
}
return v;
}
public mx(sum, y, z, p, e, k) {
return ((z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4)) ^ ((sum ^ y) + (k[p & 3 ^ e] ^ z));
}
public fixk(k) {
if (k.length < 16) {
var key = new Uint8Array(16);
key.set(k);
k = key;
}
return k;
}
public encryptUint32Array(v, k) {
var length = v.length;
var n = length - 1;
var y, z, sum, e, p, q;
z = v[n];
&nb