js base32支持动态编码表,动态创建解码表,支持加密解密!

来源:互联网 发布:淘宝联盟如何分享店铺 编辑:程序博客网 时间:2024/05/16 05:38

在网上找到的都不支持修改编码表,只能使用默认的编码表在使用的自由度和安全度是不够的!所以就特地弄了一个js base32支持动态编码表(当然也支持默认的编码表),动态创建解码表,支持加密解密,并且进行了扩展,解决编码字符类似产生相同的加密字符,以js的类实现!

//Base32加密,Created by Neko!function Base32(Keys) {  if (!(this instanceof Base32)) {    return new Base32();  }  this.init(Keys);  return this;}Base32.prototype = {alphabet:'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567',alias:{ o:0, i:1, l:1, s:5 },lookupDecode:{},output:'',bits:0,skip:0,byte:0,init:function(alphabet){if(alphabet!=undefined)this.alphabet=alphabet;this.lookupDecode=this.lookup();},lookup:function() {var table = {};// Invert 'alphabet'for (var i = 0; i < this.alphabet.length; i++) {table[this.alphabet[i]] = i;}// Splice in 'alias'for (var key in this.alias) {if (!this.alias.hasOwnProperty(key)) continue;table[key] = table['' + this.alias[key]];}return table;},readByte:function(byte) {        // 读取字节        if (typeof byte == 'string')byte = byte.charCodeAt(0);        if (this.skip < 0) {             this.bits |= (byte >> (-this.skip));        } else {             this.bits = (byte << this.skip) & 248;        }        if (this.skip > 3) {            this.skip -= 8;            return 1;        }        if (this.skip < 4) {            this.output += this.alphabet[this.bits >> 3];            this.skip += 5;        }        return 0;    },    finish:function(check) {        var output = this.output + (this.skip < 0 ? this.alphabet[this.bits >> 3] : '') + (check ? '$' : '')        this.output = '';        return output;    },    getEncodeString:function(input) {input=this.enDeCodeString(input);this.skip=0,this.bits=0,this.output='';for (var i = 0; i < input.length; ) {i += this.readByte(input[i]);}var output ;output = this.finish();return output;    },enDeCodeString:function(srcString){//加密解密,模拟随机var szRet=srcString[0];//获取第一个字符var nKey=srcString.charCodeAt(0);//得到第一个字符的数字if(nKey<(srcString.length-1)){nKey+=srcString.length;}for(var i=0;i<srcString.length;i++){if(i==0)continue;szRet+=String.fromCharCode(srcString.charCodeAt(i)^nKey);nKey--;}return szRet;},    readChar:function(char) {//读取字符        if (typeof char != 'string'){            if (typeof char == 'number') {                char = String.fromCharCode(char);            }        }        //char = char.toLowerCase()        var val = this.lookupDecode[char];        if (typeof val == 'undefined') {            return;        }        val <<= 3; // 移动到最高位        this.byte |= val >>> this.skip;        this.skip += 5;        if (this.skip >= 8) {            this.output += String.fromCharCode(this.byte);            this.skip -= 8;            if (this.skip > 0) this.byte = (val << (5 - this.skip)) & 255;            else this.byte = 0;        }    },    getDecodeData:function(input) {//返回原始的数据this.skip=0,this.byte=0,this.output='';for (var i = 0; i < input.length; i++) {this.readChar(input[i]);}var output ;output = this.finish();output=this.enDeCodeString(output);return output;    },getDecodeString:function(input) {//返回字符串var outputTemp,output='';outputTemp = this.getDecodeData(input);for(var i=0;i<outputTemp.length;i++){var szTemp=outputTemp.charCodeAt(i).toString(16);if(szTemp.length<2){szTemp='0'+szTemp;}szTemp=szTemp.toUpperCase();output+=szTemp;}return output;    }}


0 0
原创粉丝点击