Article Detail

JavaScript base64随机字符混淆加密、解密

var d='YmxvZy5pc3d0Zi5jb20g5LyK5oCd572R5ouT'; console.log(decodeURIComponent(esc...

HTML 阅读 47.6万 8 分钟阅读 2017-09-09 11:57
GDScript3
113 行
<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>
Comments 评论区
广西南宁市 2017-09-09 11:58
GDScript3
37 行
	//随机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);
	}
| | #0
广西南宁市 2017-09-09 12:08

加密的原理:
1、先用base64对字符串进行加密。
2、在字符串前面加上一个4位字符串,字符串要满足以下条件:
①必须是四位16进制的字符串。
②字符串的10进制必须也是一个四位整数。(这个四位整数很重要,用来确定随机字符串的插入位置和个数的)
③插入加密地址前的是四位16进制的字符串的倒序。
3、通过开头加上的4位字符串确定随机字符串以及插入的位置。(前后相应位置都加上一段随机字符串)

解析:
base64混淆加密后的地址:14c1YmxvZy54ppc3d0Zi5jb20g5LyK5oCd572R5X2qouT
①首先前面4位16进制的字符串为14c1,因为是倒序添加的,所以实际上为1c41。
②1c41对应的10进制为7233。
③通过7233推算,前面添加的随机字符串位置为第7个字符开始,添加2个随机字符串;后台添加的随机字符串位置为倒数第3个添加3个随机字符串。

| | #0
广西南宁市 2017-09-09 12:11

兼容中文的方法

代码片段
2 行
decodeURIComponent(escape(window.atob(d)));//解密
window.btoa(unescape(encodeURIComponent(str)));//加密
| | #0
广西南宁市 2017-09-09 12:12

js字符串倒序

GDScript3
7 行
var reverse = function( str ){
   var stack = [];//生成一个栈
   for(var len = str.length,i=len;i>=0;i-- ){
    stack.push(str[i]);
}
return stack.join('');
};
GDScript3
9 行
var reverse = function( str ){
  var newStr = '', i = str.length;
   for(; i >= 0; i--) {
        newStr += str.charAt(i);
   }
   return newStr;
};

reverse('abcde')
| | #0
广西南宁市 2017-09-09 12:14

javascript 进制转换(2进制、8进制、10进制、16进制之间的转换)

GDScript3
15 行
//十进制转其他
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)); 
| | #0
Comment Form 留下评论
正在回复 #0
粘贴图片、拖拽文件,或点上面的按钮上传 图片会自动插入 [img] 标签,其他附件会自动插入 [attach] 标签。
正在上传...
提交前会先拉起旧项目同款第三方人机验证。

不再要求填写昵称;reply 会生成一条带楼层回链的新评论,quote 会附带完整引用块,并保持评论锚点跳转。

lizhenqiu blog is powered by lizhenqiu.com Version 6.9

Processed in 0.0326 second(s) W3C

本博客的所有原创作品采用 知识共享 署名-非商业性使用-相同方式共享 2.5 协议 进行许可

本站由 七七牛 云存储 阿阿里云 计算与安全服务 拍又拍云 CDN 加速 百百度智能 AAMH 布布集网 AI指南针AI

桂公网安备 45010302000998号 桂ICP备15007619号-1 中国互联网举报中心 建议使用谷歌浏览器浏览
Navigation 文章导航
⌂ ↓ ↑
100%
图片预览
Gallery 图集
0 张图片

正在整理正文和评论里的图片。

当前页还没有可展示的图片。
Quick Comment 快速评论

直接输入内容,提交时仍会走当前页面的人机验证。

正在上传...
操作提示