base64随机字符混淆加密、解密-美拍视频地址解密,反推加密 算法
⽤⽕车头测试采集美拍的数据时⽆意中发现美拍的视频地址是⼀段加了混淆字符串的base64代码。如下图 于是好奇之下研究了下解密算法。具体过程省略800字。发现美拍的视频解密是通过js完成,于是到了具体的解密代码,如下:
1 ;(function(a) {
2var b = "substring",
3 c = "split",
4 d = "replace",
5 e = "substr",
6 f = {
7 getHex: function(a) {
8return {
9 str: a[b](4),
10 hex: a[b](0, 4)[c]("").reverse().join("")
11 }
12 },
13 getDec: function(a) {
14var d = parseInt(a, 16).toString();
15return {
16 pre: d[b](0, 2)[c](""),
17 tail: d[b](2)[c]("")
18 }
19 },
20 substr: function(a, c) {
21var f = a[b](0, c[0]),
22 g = a[e](c[0], c[1]);
23return f + a[b](c[0])[d](g, "")
24 },
25 getPos: function(a, b) {
26return b[0] = a.length - b[0] - b[1],
27 b
28 },
29 decode: function(a) {
30var b = Hex(a),
31 c = Dec(b.hex),
32 d = this[e](b.str, c.pre);
33return window.atob(this[e](d, Pos(d, c.tail)))
34 }
35 };
36 a.decodeMp4 = f,
37 window.MP = a
38 } (window.MP || {}))
通过解密代码可以发现视频地址字符串是base64加密的,只不过在其中插⼊了⼀些混淆字符。只要清除混淆字符即可通过base64解密得到视频地址。
js怎样对字符进⾏base64加密、解密?如下:
1 window.atob(str);//解密
2 window.btoa(str);//加密
3//但后来发现这样是不兼容中⽂的,于是有了下⾯的兼容中⽂的⽅法
4 decodeURIComponent(escape(window.atob(d)));//解密
5 window.btoa(unescape(encodeURIComponent(str)));//加密
外滩画报
解密算法已经到,但我想要的是加密算法,所以只能通过解密算法反推加密算法,于是展开了⼀系列烧脑操作。终于发现了加密的原理(⼤概可能是)。
⾸先说说加密的原理:
1、先⽤base64对视频地址进⾏加密。
物价指数
2、在视频地址前⾯加上⼀个4位字符串,字符串要满⾜以下条件:
①必须是四位16进制的字符串。
②字符串的10进制必须也是⼀个四位整数。(这个四位整数很重要,⽤来确定随机字符串的插⼊位置和个数的) ③插⼊加密地址前的是四位16进制的字符串的倒序。
3、通过开头加上的4位字符串确定随机字符串以及插⼊的位置。(前后相应位置都加上⼀段随机字符串)
看着原理是不是⼀头⼤?不⽤急,现在慢慢来解析⼀下:
现在⽤第⼀张图上的字符串来说明⼀下解密的过程,然后就能反推加密原理:
base64混淆加密后的地址:
①⾸先前⾯4位16进制的字符串为b901,因为是倒序添加的,所以实际上为109b。
②109b对应的10进制为4251。
③通过4251推算,前⾯添加的随机字符串位置为第4个字符开始,添加2个随机字符串;后台添加的随机字符串位置为倒数第5个添加1个随机字符串。
得出上⾯的混淆加密的随机字符为(⽤*号替代):
去掉*号的内容即为真实的base64加密地址:
然后就可以通过普通的base64解密⽅法来解密视频地址了。
1
decodeURIComponent(escape(window.atob('aHR0cDovL212dmlkZW8xLm1laXR1ZGF0YS5jb20vNTlhZmU3MDRmMTBiOTQ3ODIubXA0P2s9NDNiNzh kYjZmYmE1ZjNlZWM4NjY3NTM2MTkxNjI3ZGUmdD01OWIzNjdjNA==')));
2//得出内容为:itudata/59afe704f10b94782.mp4?k=43b78db6fba5f3eec866
7536191627de&t=59b367c4
知道了加密原理,那么推算出加密算法就只是时间问题了。
。。。⼜经过⼀系列的测试整理,终于出版了js版的base64随机字符混淆加密、解密⽅法,如下:
1 ;(function(base64){
2var substring='substring',
3 split='split',
4 reverse='reverse',
5 join='join',
6 toString='toString',
7 substr='substr',
8 replace='replace',
9 fn={
10 getHex: function(str) {//获取前4位标记数字
11return {
12 str: str[substring](4),//排除前4位字符串
13 hex: str[substring](0, 4)[split]("")[reverse]()[join]("")//前4位倒序
14 }
15 },
16 getDec: function(str) {//获取混淆字符位置坐标
17 str = parseInt(str, 16)[toString]();//前4位倒序的16进制
18 str[substring](0, 2)[split]("");
19return {
20 pre: str[substring](0, 2)[split](""),//前⾯坐标
21 tail: str[substring](2)[split]("")//后⾯坐标
22 }
23 },
24 delStr: function(str, pos) {//混淆的字符抽取
25var s = str[substring](0, pos[0]),
26 del = str[substr](pos[0], pos[1]);//需替换的字符
27return s + str[substring](pos[0])[replace](del, "");//返回替换完成后的base64字符串
28 },
29 getPos: function(str, pos) {
30return [str.length - pos[0] - pos[1],pos[1]];
31 },
32 decode: function(str) {//解密
33var sh = Hex(str),//获取前4位标记数字
34 pos = Dec(sh.hex),//获取混淆位置坐标
35 d = this.delStr(sh.str, pos.pre);//前⾯混淆的字符抽取
36 d=this.delStr(d, Pos(d, pos.tail));
37return decodeURIComponent(escape(window.atob(d)));//base64转成utf-8(兼容中⽂)
38 },
39 encode:function(str){//加密
40var base64=window.btoa(unescape(encodeURIComponent(str))),//转换成base64格式
41 RanNum(base64),//获取16进制是4位数的随机字符
42 pos = Dec(random);//获取混淆位置坐标
43 base64 = this.addStr(base64, pos);//插⼊混淆字符
44//console.log(random,pos)
45return random[toString]()[split]("")[reverse]()[join]("")+base64;
46 },
47 addStr: function(str, pos) {//混淆的字符插⼊
48var RanStr(pos.pre[1]),//获取随机字符串(前)
49 RanStr(pos.tail[1]),//获取随机字符串(后)
50 pre=this.insertStr(str,r1,pos.pre[0]),//插⼊随机字符串(前)
51 tail=pre.length - pos.tail[0];
52 str=this.insertStr(pre,r2,tail);//插⼊随机字符串(后)
53return str;
54 },
55 insertStr:function(str,addstr,pos){//往指定位置插⼊字符串
56return str[substring](0,pos)+addstr+str[substring](pos);
57 },
58 getRanNum:function(str){//获取16进制是4位数的4位随机字符
59var ranArr=[];
60 ;(function(){
61var n='',
62 length=str.length;
冶金自动化63/** 4101开始16进制是4位数 **/
64for(var i=4101;i<=9999;i++){//出所有符合要求的16进制4位数
65 n=i[toString](16);//16转成10
66if(length>=8&&!(Math.floor(i/100)%10===0||i%10===0)&&n.length===4){
67//正常的base64编码长度⼤于8才前后加混淆字符
68//console.log(i,n);
69if(Math.floor(i/1000)<=length/2&&Math.floor(i%100/10)<=length/2){//混淆位置不能⼤于长度⼀半
70 ranArr.push(n);
71 }
72 }else if(i%100===0&&n.length===4){//只在前⾯插⼊混淆字符
73if(Math.floor(i/1000)<=length){//混淆位置不能⼤于长度
74 ranArr.push(n);
75 }
76 }
77 }
78 }());
79var length=ranArr.length,
80 ran = und(Math.random()*(length-1));
81return ranArr[ran];
82 },
83 getRanStr:function(num){//获取指定个数随机字符串亲密关系经历量表
84var 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','+'],
85 length=str.length,
86 res = "";
87for(; num-- ;) {
88var id = und(Math.random()*(length-1));
89 res += str[id];
90 }
91return res;
92 }
93 }
影片未分级
94 anCode=fn;
95 window.base64=base64;
96 }(window.base64||{}));
以上代码已经带有⼀些注释,就不详细说明了。不明⽩或有指教的请留⾔吧!
算法兼容对美拍视频地址的解密!同时兼容其他内容的加密,同时兼容中⽂的加密、解密。
反推加密算法的过程是烧脑的,但也是有意思的,在成功的那⼀瞬间还是有点⼩兴奋的。
zne1欢迎指教
以上代码只为研究学习使⽤。