JavaScript base64随机字符混淆加密、解密
发布时间:2017-09-09, 11:57:41 分类:HTML | 编辑 off 网址 | 辅助
正文 3898字数 462,089阅读
<script>
var d='YmxvZy5pc3d0Zi5jb20g5LyK5oCd572R5ouT';
console.log(decodeURIComponent(escape(window.atob(d))));
var str='lizhenqiu.com 伊思网拓';
console.log(window.btoa(unescape(encodeURIComponent(str))));
;(function(base64){
var substring='substring',
split='split',
reverse='reverse',
join='join',
toString='toString',
substr='substr',
replace='replace',
fn={
getHex: function(str) {//获取前4位标记数字
return {
str: str[substring](4),//排除前4位字符串
hex: str[substring](0, 4)[split]("")[reverse]()[join]("")//前4位倒序
}
},
getDec: function(str) {//获取混淆字符位置坐标
str = parseInt(str, 16)[toString]();//前4位倒序的16进制
str[substring](0, 2)[split]("");
return {
pre: str[substring](0, 2)[split](""),//前面坐标
tail: str[substring](2)[split]("")//后面坐标
}
},
delStr: function(str, pos) {//混淆的字符抽取
var s = str[substring](0, pos[0]),
del = str[substr](pos[0], pos[1]);//需替换的字符
return s + str[substring](pos[0])[replace](del, "");//返回替换完成后的base64字符串
},
getPos: function(str, pos) {
return [str.length - pos[0] - pos[1],pos[1]];
},
decode: function(str) {//解密
var sh = this.getHex(str),//获取前4位标记数字
pos = this.getDec(sh.hex),//获取混淆位置坐标
d = this.delStr(sh.str, pos.pre);//前面混淆的字符抽取
d=this.delStr(d, this.getPos(d, pos.tail));
return decodeURIComponent(escape(window.atob(d)));//base64转成utf-8(兼容中文)
},
encode:function(str){//加密
var base64=window.btoa(unescape(encodeURIComponent(str))),//转换成base64格式
random=this.getRanNum(base64),//获取16进制是4位数的随机字符
pos = this.getDec(random);//获取混淆位置坐标
base64 = this.addStr(base64, pos);//插入混淆字符
//console.log(random,pos)
return random[toString]()[split]("")[reverse]()[join]("")+base64;
},
addStr: function(str, pos) {//混淆的字符插入
var r1=this.getRanStr(pos.pre[1]),//获取随机字符串(前)
r2=this.getRanStr(pos.tail[1]),//获取随机字符串(后)
pre=this.insertStr(str,r1,pos.pre[0]),//插入随机字符串(前)
tail=pre.length - pos.tail[0];
str=this.insertStr(pre,r2,tail);//插入随机字符串(后)
return str;
},
insertStr:function(str,addstr,pos){//往指定位置插入字符串
return str[substring](0,pos)+addstr+str[substring](pos);
},
getRanNum:function(str){//获取16进制是4位数的4位随机字符
var ranArr=[];
;(function(){
var n='',
length=str.length;
/** 4101开始16进制是4位数 **/
for(var i=4101;i<=9999;i++){//找出所有符合要求的16进制4位数
n=i[toString](16);//16转成10
if(length>=8&&!(Math.floor(i/100)%10===0||i%10===0)&&n.length===4){
//正常的base64编码长度大于8才前后加混淆字符
//console.log(i,n);
if(Math.floor(i/1000)<=length/2&&Math.floor(i%100/10)<=length/2){//混淆位置不能大于长度一半
ranArr.push(n);
}
}else if(i%100===0&&n.length===4){//只在前面插入混淆字符
if(Math.floor(i/1000)<=length){//混淆位置不能大于长度
ranArr.push(n);
}
}
}
}());
var length=ranArr.length,
ran = Math.round(Math.random()*(length-1));
return ranArr[ran];
},
getRanStr:function(num){//获取指定个数随机字符串
var str=[0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','+'],
length=str.length,
res = "";
for(; num-- ;) {
var id = Math.round(Math.random()*(length-1));
res += str[id];
}
return res;
}
}
base64.tranCode=fn;
window.base64=base64;
}(window.base64||{}));
var d='1502YmxvZy5pLgc3d0Zi5jb20g5LyK5oCd5tRP72R5ouT';
console.log(base64.tranCode.decode(d));
var str='lizhenqiu.com 伊思网拓';
var de=base64.tranCode.encode(str);
console.log(de);
console.log(base64.tranCode.decode(de));
</script>
Run code
Cut to clipboard
(支付宝)给作者钱财以资鼓励 (微信)→
有过 5 条评论 »
//随机4位10进制整数 function getfo(){ var randnum; randnum=Math.random(); while(randnum<0.1){ randnum=Math.random(); } return randnum=Math.floor(Math.random()*10000); } //十进制转十六进制 function toHex(num){ var rs = ""; var temp; while(num/16 > 0){ temp = num%16; rs = (temp+"").replace("10","a").replace("11","b").replace("12","c").replace("13","d").replace("14","e").replace("15","f") + rs; num = parseInt(num/16); } //console.warn(rs); //打印 return rs; } //16进制补位 function str_pad(hex){ var zero = '0000'; var tmp = 4-hex.length; return zero.substr(0,tmp) + hex; } //倒叙字符串 function reverse(str){ return str.split('').reverse().join(''); }; //混淆加密的随机字符 function getrr(){ var hex=toHex(getfo()); if(hex.length<4) hex=str_pad(hex) return reverse(hex); }
1、先用base64对字符串进行加密。
2、在字符串前面加上一个4位字符串,字符串要满足以下条件:
①必须是四位16进制的字符串。
②字符串的10进制必须也是一个四位整数。(这个四位整数很重要,用来确定随机字符串的插入位置和个数的)
③插入加密地址前的是四位16进制的字符串的倒序。
3、通过开头加上的4位字符串确定随机字符串以及插入的位置。(前后相应位置都加上一段随机字符串)
解析:
base64混淆加密后的地址:14c1YmxvZy54ppc3d0Zi5jb20g5LyK5oCd572R5X2qouT
①首先前面4位16进制的字符串为14c1,因为是倒序添加的,所以实际上为1c41。
②1c41对应的10进制为7233。
③通过7233推算,前面添加的随机字符串位置为第7个字符开始,添加2个随机字符串;后台添加的随机字符串位置为倒数第3个添加3个随机字符串。
decodeURIComponent(escape(window.atob(d)));//解密 window.btoa(unescape(encodeURIComponent(str)));//加密
var reverse = function( str ){ var stack = [];//生成一个栈 for(var len = str.length,i=len;i>=0;i-- ){ stack.push(str[i]); } return stack.join(''); };
var reverse = function( str ){ var newStr = '', i = str.length; for(; i >= 0; i--) { newStr += str.charAt(i); } return newStr; }; reverse('abcde')
//十进制转其他 var x=110; alert(x); alert(x.toString(8)); alert(x.toString(32)); alert(x.toString(16)); //其他转十进制 var x='110'; alert(parseInt(x,2)); alert(parseInt(x,8)); alert(parseInt(x,16)); //其他转其他 //先用parseInt转成十进制再用toString转到目标进制 alert(String.fromCharCode(parseInt(141,8))) alert(parseInt('ff',16).toString(2));