用火车头测试采集美拍的数据时无意中发现美拍的视频地址是一段加了混淆字符串的base64代码。如下图

于是好奇之下研究了下解密算法。具体过程省略800字。发现美拍的视频解密是通过js完成,于是找到了具体的解密代码,如下:

 1 ;(function(a) {
 2     var b = "substring",
 3     c = "split",
 4     d = "replace",
 5     e = "substr",
 6     f = {
 7         getHex: function(a) {
 8             return {
 9                 str: a[b](4),
10                 hex: a[b](0, 4)[c]("").reverse().join("")
11             }
12         },
13         getDec: function(a) {
14             var d = parseInt(a, 16).toString();
15             return {
16                 pre: d[b](0, 2)[c](""),
17                 tail: d[b](2)[c]("")
18             }
19         },
20         substr: function(a, c) {
21             var f = a[b](0, c[0]),
22             g = a[e](c[0], c[1]);
23             return f + a[b](c[0])[d](g, "")
24         },
25         getPos: function(a, b) {
26             return b[0] = a.length - b[0] - b[1],
27             b
28         },
29         decode: function(a) {
30             var b = this.getHex(a),
31             c = this.getDec(b.hex),
32             d = this[e](b.str, c.pre);
33             return window.atob(this[e](d, this.getPos(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混淆加密后的地址:b901aHR0TDcDovL212dmlkZW8xLm1laXR1ZGF0YS5jb20vNTlhZmU3MDRmMTBiOTQ3ODIubXA0P2s9NDNiNzhkYjZmYmE1ZjNlZWM4NjY3NTM2MTkxNjI3ZGUmdD01OWIzNjdejNA==

①首先前面4位16进制的字符串为b901,因为是倒序添加的,所以实际上为109b。

②109b对应的10进制为4251。

③通过4251推算,前面添加的随机字符串位置为第4个字符开始,添加2个随机字符串;后台添加的随机字符串位置为倒数第5个添加1个随机字符串。

得出上面的混淆加密的随机字符为(用*号替代):

aHR0**cDovL212dmlkZW8xLm1laXR1ZGF0YS5jb20vNTlhZmU3MDRmMTBiOTQ3ODIubXA0P2s9NDNiNzhkYjZmYmE1ZjNlZWM4NjY3NTM2MTkxNjI3ZGUmdD01OWIzNjd*jNA==

去掉*号的内容即为真实的base64加密地址:aHR0cDovL212dmlkZW8xLm1laXR1ZGF0YS5jb20vNTlhZmU3MDRmMTBiOTQ3ODIubXA0P2s9NDNiNzhkYjZmYmE1ZjNlZWM4NjY3NTM2MTkxNjI3ZGUmdD01OWIzNjdjNA==

然后就可以通过普通的base64解密方法来解密视频地址了。

1 decodeURIComponent(escape(window.atob('aHR0cDovL212dmlkZW8xLm1laXR1ZGF0YS5jb20vNTlhZmU3MDRmMTBiOTQ3ODIubXA0P2s9NDNiNzhkYjZmYmE1ZjNlZWM4NjY3NTM2MTkxNjI3ZGUmdD01OWIzNjdjNA==')));
2 //得出内容为:http://mvvideo1.meitudata.com/59afe704f10b94782.mp4?k=43b78db6fba5f3eec8667536191627de&t=59b367c4

知道了加密原理,那么推算出加密算法就只是时间问题了。

。。。又经过一系列的测试整理,终于出版了js版的base64随机字符混淆加密、解密方法,如下:

 1 ;(function(base64){
 2     var 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位标记数字
11             return {
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]("");
19             return {
20                 pre: str[substring](0, 2)[split](""),//前面坐标
21                 tail: str[substring](2)[split]("")//后面坐标
22             }
23         },
24         delStr: function(str, pos) {//混淆的字符抽取
25             var s = str[substring](0, pos[0]),
26                 del = str[substr](pos[0], pos[1]);//需替换的字符
27             return s + str[substring](pos[0])[replace](del, "");//返回替换完成后的base64字符串
28         },
29         getPos: function(str, pos) {
30             return [str.length - pos[0] - pos[1],pos[1]];
31         },
32         decode: function(str) {//解密
33             var sh = this.getHex(str),//获取前4位标记数字
34                 pos = this.getDec(sh.hex),//获取混淆位置坐标
35                 d = this.delStr(sh.str, pos.pre);//前面混淆的字符抽取
36                 d=this.delStr(d, this.getPos(d, pos.tail));
37             return decodeURIComponent(escape(window.atob(d)));//base64转成utf-8(兼容中文)
38         },
39         encode:function(str){//加密
40             var base64=window.btoa(unescape(encodeURIComponent(str))),//转换成base64格式
41                 random=this.getRanNum(base64),//获取16进制是4位数的随机字符
42                 pos = this.getDec(random);//获取混淆位置坐标
43             base64 = this.addStr(base64, pos);//插入混淆字符
44             //console.log(random,pos)
45             return random[toString]()[split]("")[reverse]()[join]("")+base64;
46         },
47         addStr: function(str, pos) {//混淆的字符插入
48             var r1=this.getRanStr(pos.pre[1]),//获取随机字符串(前)
49                 r2=this.getRanStr(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);//插入随机字符串(后)
53             return str;
54         },
55         insertStr:function(str,addstr,pos){//往指定位置插入字符串
56             return str[substring](0,pos)+addstr+str[substring](pos);
57         },
58         getRanNum:function(str){//获取16进制是4位数的4位随机字符
59             var ranArr=[];
60             ;(function(){
61                 var n='',
62                     length=str.length;
63                 /** 4101开始16进制是4位数 **/
64                 for(var i=4101;i<=9999;i++){//找出所有符合要求的16进制4位数
65                     n=i[toString](16);//16转成10
66                     if(length>=8&&!(Math.floor(i/100)%10===0||i%10===0)&&n.length===4){
67                     //正常的base64编码长度大于8才前后加混淆字符
68                         //console.log(i,n);
69                         if(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){//只在前面插入混淆字符
73                         if(Math.floor(i/1000)<=length){//混淆位置不能大于长度
74                             ranArr.push(n);
75                         }
76                     }
77                 }
78             }());
79             var length=ranArr.length,
80                 ran = Math.round(Math.random()*(length-1));
81             return ranArr[ran];
82         },
83         getRanStr:function(num){//获取指定个数随机字符串
84             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','+'],
85                 length=str.length,
86                 res = "";
87              for(; num-- ;) {
88                  var id = Math.round(Math.random()*(length-1));
89                  res += str[id];
90              }
91              return res;
92         }
93     }
94     base64.tranCode=fn;
95     window.base64=base64;
96 }(window.base64||{}));

以上代码已经带有一些注释,就不详细说明了。不明白或有指教的请留言吧!

算法兼容对美拍视频地址的解密!同时兼容其他内容的加密,同时兼容中文的加密、解密。

反推加密算法的过程是烧脑的,但也是有意思的,在成功的那一瞬间还是有点小兴奋的。

写了一个demo,有兴趣的可以下载看看,如图。下载地址为:https://github.com/zhouxitian/base64

欢迎指教!!!

以上代码只为研究学习使用。

base64随机字符混淆加密、解密-美拍视频地址解密,反推加密算法相关推荐

  1. base64随机字符混淆加密、解密-美拍视频地址解密(兼容ie、中文)

    用火车头测试采集美拍的数据时无意中发现美拍的视频地址是一段加了混淆字符串的base64代码.如下图: 于是好奇之下研究下解密算法.具体过程省略800字.发现美拍的视频解密是通过js完成,于是找到了具体 ...

  2. JS破解初探,折腾到头秃的美拍视频Python采集下载

    JS破解无疑是头秃的问题,额好在有度娘搜索,实在不行,那就谷妹搜索? 确实头秃无比!! 目前想到的三种处理方法,当然都是借鉴啦!! 方法一:直接破解JS,python直接模拟js算法得出视频地址 方法 ...

  3. 下载美拍视频 python

    下载美拍视频 获取用户ID 通过网页端搜索用户,获取用户ID 获取页面中的视频地址 获取到用户ID后,通过地址https://www.meipai.com/user/userid,访问.在返回的htm ...

  4. CKPlayer视频地址加密方法

    不知道大家在做项目的时候有没有用过CKPlayer播放器,可以对视频地址和视频文件进行加密,其中视频地址加密有二种形式 一:共用加密KEY进行加密,即:ckplayerDesKey 二:私有加密KEY ...

  5. Base64 混淆加密+迭代次数,Base64前后端加解密不一致、Base64 js加解密结果与java加解密结果不一致,Base64中文加密乱码

    Table of Contents 概述 一.js加密,java解密 1.js加密 1.中文字符串加密 2.英文等字符串加密 3.中文字符串混淆.迭代加密 4.英文等字符串混淆.迭代加密 5.JSON ...

  6. 研究下php加密混淆,解析php混淆加密解密的手段,如 phpjm,phpdp神盾

    php做为一门当下非常流行的web语言,常常看到有人求解密php文件,想当年的asp也是一样.一些人不理解为什么要混淆(加密),甚至鄙视混淆(加密),在我看来混淆加密代码可以用来防一般的小人,会起到一 ...

  7. 解析php混淆加密解密的手段,如 phpjm,phpdp神盾,php威盾

    解析php混淆加密解密的手段,如 phpjm,phpdp神盾,php威盾 原文 解析php混淆加密解密的手段,如 phpjm,phpdp神盾,php威盾 php做为一门当下非常流行的web语言,常常看 ...

  8. php怎么魔方加密,深度解析php混淆加密解密的手段,希望对大家解读魔方加密有所帮助 [tihuan]...

    深度解析php混淆加密解密的手段,希望对大家解读魔方加密有所帮助 [tihuan] 2018-12-31 php做为一门当下非常流行的web语言,常常看到有人求解密php文件,想当年的asp也是一样. ...

  9. php神盾 var 1.54,PHP变量可用字符 - 神盾加密解密教程(一)

    PHP变量可用字符 - 神盾加密解密教程(一) 分类:PHP_Python| 发布:佚名| 查看: | 发表时间:2014/10/16 我们都知道php变量的命名规则,如下: (1) PHP的变量名区 ...

最新文章

  1. Ubuntu18.04 误删/usr/bin/python3的解决方案
  2. 优化你的CPU来做深度学习
  3. 如何才能信任你的深度学习代码?
  4. 堆木板问题——木板能堆无限远而不倒吗?
  5. 携程二季度净利润降55% 促销被指“玩烟幕弹”
  6. Python爬虫之旅_(数据解析)_bs4
  7. Windows获取CPU、内存和磁盘使用率脚本
  8. pythonplot绘图xrd_一种简化的截面动量组合测试[PythonMATLAB]
  9. prim算法_历时两月,终拿字节跳动offer,算法面试题分享「带答案」
  10. MapReduce 学习指南
  11. 恒强制版系统980_恒功率、大功率及无线充电,充电设备面临哪些趋势和挑战?...
  12. 解决永中集成office和opera的中文输入问题
  13. 分享几个设计精美电路图的工具
  14. matlab电磁铁磁场,Matlab在电磁铁设计计算中的应用
  15. 零成本、零流量,我是如何空手反套白狼?
  16. MGV3000_YST_免费刷机固件包_原生设置无密码_支持外置USB无线网卡
  17. 多线程服务器的典型适用场合
  18. mysql 合计 小计_用SQL实现统计报表中的小计与合计的方法详解
  19. MSSQL分离数据库和附加数据库
  20. android钛备份功能源码,TitaniumBackup钛备份专业增捐赠版 — 安卓备份神器

热门文章

  1. vue动手写一个类似淘宝的订单表格
  2. 快来!礼物替你选好了:2022年神秘的程序员周历!
  3. Matlab中的meshgrid函数
  4. ajax onreadystatechange属性
  5. 汇编实验之用debug命令查看寄存器和内存中的内容
  6. 如何挑选一副好的镜片
  7. 京东高风险用户判定参考
  8. 如何利用画图软件跳整照片像素
  9. Vulnhub-Money Heist: 1
  10. python 实现证件照更换背景色,撩妹功能,速速来get