├── 01-安徽招投标(sojson) ├── README.md ├── sojson替换方法.py ├── 替换后.js ├── 替换方法.js ├── ahtba.py └── 替换前.js ├── 18-今日头条 ├── README.md ├── toutiao.py └── index.js ├── 19-BOSS直聘 ├── README.md ├── index.js ├── boss.py └── boss.js ├── 00-通用加密 ├── RSAEncrypt.py ├── Aes.py ├── RSAKeyPair.py ├── RSAKeyPair.js └── RSAEncrypt.js ├── 07-七麦数据JS逆向 ├── qmsj.py └── qmsj.js ├── 04-安徽省雨水情JS逆向 ├── ysq.py └── ysq.js ├── 17-毛毛租(AES) └── maomaozu.py ├── 16-零度IP(md5) ├── lingduIP.py ├── lingduIP(Python).py └── lingduIP.js ├── 14-翼龙贷登录(DES) └── yld.py ├── README.md ├── 05-TAPD登录AES加密 ├── tapd.py └── tapd.js ├── 08-帝恩思登录(AES) ├── dns.py └── dns(Python).py ├── 15-陆金所登录(RSA) └── ljs.py ├── 13-网易云音乐评论(AES、RSA) ├── music163.py └── music163(Python).py ├── 09-思酷在线(RSA) ├── skzx.py └── skzx.js ├── 02-合肥市房产信息平台(eval混淆) ├── hffc.js └── hffc.py ├── 03-百变IP(eval混淆) ├── bbIP.py └── bbIP.js ├── 11-易班登录(RSA) └── yiban.py ├── 12-空气质量历史数据 └── aqi.py ├── 06-58同城登录(RSA) ├── tc58.py └── tc58.js ├── 20-抖音web ├── douyin.py └── douyin.js └── 10-新浪微博登录(RSA) └── sinalogin.py /01-安徽招投标(sojson)/README.md: -------------------------------------------------------------------------------- 1 | # 01-安徽招投标(sojson) 2 | 直接运行ahtba.py即可,其它4个文件为参考 3 | -------------------------------------------------------------------------------- /18-今日头条/README.md: -------------------------------------------------------------------------------- 1 | # 使用说明 2 | 3 | 1.npm需安装express和body-parser,具体自行了解 4 | 5 | 2.将3个文件放于同一文件夹,cd到该目录,命令行运行 6 | ```javascript 7 | node index.js 8 | ``` 9 | 10 | 3.运行toutiao.py开始食用 11 | 12 | 13 | ### 由于pyexecjs运行会报以下错误,因此这里使用接口调用。如有解决办法,请联系告知,谢谢! 14 | ```python 15 | TypeError: Cannot read property 'init' of undefined 16 | ``` 17 | ### 实际为无法读取window.byted_acrawler对象,但node运行正常 18 | -------------------------------------------------------------------------------- /19-BOSS直聘/README.md: -------------------------------------------------------------------------------- 1 | # 使用说明 2 | 3 | ### 注意:我这里只补了两套代码的环境,BOSS实际有几套不知道,补不动了,一天一变... 4 | 5 | 1.npm需安装express和body-parser,具体自行了解 6 | 7 | 2.将3个文件放于同一文件夹,cd到该目录,命令行运行 8 | ```javascript 9 | node index.js 10 | ``` 11 | 12 | 3.运行boss.py开始食用 13 | 14 | 15 | ### 由于pyexecjs运行会报以下错误,因此这里使用接口调用。 16 | ```python 17 | execjs._exceptions.ProcessExitedWithNonZeroStatus: (1, "{\n cookie: '0df7%2B9kAOY%2BdFeUde5p9NCZKtB2NXE6tIvdOfT25tAHJMiCiwrE0IJoOog04oQNba8nW0DAyd%2BjPCVgIUn3%2FXaXxYW5iqK9j1Mr%2FLAxG3sSH%2BhiM4UpIzn5XpYncEehEHLf1'\n}\n",..... 18 | ``` 19 | ### 实际为process赋值为undefined的原因,导致execjs库无法读取process 20 | -------------------------------------------------------------------------------- /00-通用加密/RSAEncrypt.py: -------------------------------------------------------------------------------- 1 | import rsa 2 | 3 | 4 | def encrypt(content): 5 | e = "10001" 6 | # 指数 7 | n = "00833c4af965ff7a8409f8b5d5a83d87f2f19d7c1eb40dc59a98d2346cbb145046b2c6facc25b5cc363443f0f7ebd9524b7c1e1917bf7d849212339f6c1d3711b115ecb20f0c89fc2182a985ea28cbb4adf6a321ff7e715ba9b8d7261d1c140485df3b705247a70c28c9068caabbedbf9510dada6d13d99e57642b853a73406817" 8 | # 模量 9 | e = int(e, 16) # 转成16进制 10 | n = int(n, 16) 11 | publickey = rsa.PublicKey(e=e, n=n) 12 | m = rsa.encrypt(content.encode(), publickey) 13 | return m.hex() 14 | 15 | 16 | print(encrypt("111111")) 17 | -------------------------------------------------------------------------------- /00-通用加密/Aes.py: -------------------------------------------------------------------------------- 1 | from Crypto.Cipher import AES # 使用的pycrypto库 2 | import base64 3 | 4 | def encrypt(k, iv, content): 5 | # k:密钥,iv:偏移量,content:需加密的内容 6 | k = k.encode("utf-8") 7 | iv = iv.encode("utf-8") 8 | pad = lambda s: s + (16 - len(s)%16) * chr(0) 9 | # AES加密时,明文长度需为16的倍数。这里的pad用来填充,chr(0)表示为ZeroPadding,在最后填充0直到长度为16的倍数 10 | # pad = lambda s: s + (16 - len(s)%16) * chr(16 - len(s)%16) 这里为Pkcs7填充 11 | content = pad(content).encode("utf-8") 12 | cipher = AES.new(k, AES.MODE_CBC, iv) # CBC模式加密,还有ECB模式 13 | cipher_text = cipher.encrypt(content) 14 | enc = base64.b64encode(cipher_text).decode("utf-8") 15 | return enc 16 | 17 | 18 | k = "1234567890abcDEF" 19 | iv = "1234567890abcDEF" 20 | print(encrypt(k, iv, "111111")) 21 | -------------------------------------------------------------------------------- /01-安徽招投标(sojson)/sojson替换方法.py: -------------------------------------------------------------------------------- 1 | import re, execjs 2 | 3 | 4 | def change(s): 5 | """ 6 | 替换函数,js文件中写法如下: 7 | function change(s) { 8 | return '"' + eval(s) + '"' 9 | } 10 | """ 11 | value = s.group('value') 12 | return ctx.call("change", value) 13 | 14 | 15 | with open("替换方法.js", "r", encoding="utf-8") as fb: 16 | # 提取出解密函数的文件 17 | ctx = execjs.compile(fb.read()) 18 | 19 | with open("替换前.js", "r", encoding="utf-8") as f: 20 | # 需要替换的文件 21 | word = f.read() 22 | 23 | # 下面的_0x44c0和单引号或者双引号,根据原来的代码相应修改 24 | pattern = re.compile(r"(?P_0x56ae\('.*?', '.*?'\))", re.S) 25 | word = re.sub(pattern, change, word) 26 | 27 | with open("替换后.js", "w", encoding="utf-8") as f: 28 | # 替换后的文件 29 | f.write(word) 30 | print("替换完成") 31 | -------------------------------------------------------------------------------- /07-七麦数据JS逆向/qmsj.py: -------------------------------------------------------------------------------- 1 | # https://www.qimai.cn/rank 七麦数据 2 | 3 | import requests, execjs, json, time 4 | 5 | 6 | with open("qmsj.js", "r", encoding="utf-8") as f: 7 | ctx = execjs.compile(f.read()) 8 | 9 | headers = { 10 | 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', 11 | } 12 | url = 'https://api.qimai.cn/rank/indexPlus/brand_id/1' # 最后的数字,1:免费榜;0:付费榜;2:畅销榜 13 | params = { 14 | # params为筛选条件,可选项 15 | 'brand': 'all', # 榜单类型 16 | 'genre': '5000', # 子分类类型 17 | 'device': 'iphone', # 设备 18 | 'country': 'cn', # 国家 19 | 'date': time.strftime("%Y-%m-%d", time.localtime()), # 日期,这里默认以当天,可自行改成(2019-12-12)格式 20 | 'page': '1', # 页码 21 | } 22 | params["analysis"] = ctx.call("analysis", url, json.dumps(params)) # 如没有params,只需要传入url即可 23 | response = requests.get(url, headers=headers, params=params) 24 | print(response.json()) 25 | -------------------------------------------------------------------------------- /04-安徽省雨水情JS逆向/ysq.py: -------------------------------------------------------------------------------- 1 | # http://yc.wswj.net/ahsxx/LOL/public/public.html 安徽省雨水情监视 2 | import random 3 | import execjs 4 | import requests 5 | import json 6 | 7 | 8 | headers = { 9 | "User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36", 10 | } 11 | data = { 12 | "name":"GetSwInfo", 13 | "time":"202001171000", 14 | "fresh":0, 15 | "waterEncode":"true", 16 | } 17 | 18 | with open("ysq.js", "r") as f: 19 | ctx = execjs.compile(f.read()) 20 | 21 | for k,v in data.items(): 22 | data[k] = ctx.call("waterEncode", v) 23 | 24 | data["random"] = random.random() 25 | # print(data) 26 | 27 | url = "http://yc.wswj.net/ahsxx/service/PublicBusinessHandler.ashx" 28 | res = requests.post(url, data=data, headers=headers) 29 | data_json = res.json()["data"] 30 | data = ctx.call("resultDecode", data_json) 31 | data = json.loads(data) 32 | print(data[:2]) # 数据共有2000多个,这里只展示两个 33 | -------------------------------------------------------------------------------- /17-毛毛租(AES)/maomaozu.py: -------------------------------------------------------------------------------- 1 | import requests, execjs, time, json 2 | 3 | 4 | headers = { 5 | "User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36" 6 | } 7 | with open("maomaozu.js", "r", encoding="utf-8") as f: 8 | ctx = execjs.compile(f.read()) 9 | 10 | 11 | def encrypt(data): 12 | result = json.dumps(data) 13 | result = ctx.call("encrypt", result) 14 | return result 15 | 16 | 17 | def decrypt(response): 18 | result = ctx.call("decrypt", response) 19 | return json.loads(result) 20 | 21 | 22 | def get_page(page): 23 | data = { 24 | "Type": 0, 25 | "page": page, 26 | "expire": int(time.time()*1000) 27 | } 28 | data = encrypt(data) 29 | print(data) 30 | url = "https://www.maomaozu.com/index/build.json" 31 | res = requests.post(url, headers=headers, data=data) 32 | result = decrypt(res.text) 33 | print(result) 34 | 35 | 36 | get_page(5) 37 | -------------------------------------------------------------------------------- /16-零度IP(md5)/lingduIP.py: -------------------------------------------------------------------------------- 1 | from hashlib import md5 2 | import time, requests, execjs 3 | 4 | 5 | def token(page, num): 6 | token = str(page) + str(num) + str(int(time.time())) 7 | return md5(token.encode()).hexdigest() 8 | 9 | 10 | def decrypt(a): 11 | with open("lingduIP.js", "r", encoding="utf-8") as f: 12 | ctx = execjs.compile(f.read()) 13 | result = ctx.call("get_ip", a) 14 | return result 15 | 16 | 17 | def get_one_page(): 18 | page = 1 19 | num = 15 20 | url = "https://nyloner.cn/proxy?page={}&num={}&token={}&t={}".format(page, num, token(page, num), int(time.time())) 21 | headers = { 22 | "User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36", 23 | "Cookie": "sessionid=uhuxzch7g7bxiv9okm5p93fn7qh0pss3" 24 | } 25 | res = requests.get(url, headers=headers) 26 | ip_list = res.json()["list"] 27 | return ip_list 28 | 29 | 30 | for i in decrypt(get_one_page()): 31 | print(i) 32 | -------------------------------------------------------------------------------- /14-翼龙贷登录(DES)/yld.py: -------------------------------------------------------------------------------- 1 | # https://cj.eloancn.com/user/login 翼龙贷 登录 2 | 3 | import execjs, requests, random 4 | 5 | 6 | def encryptByDES(): 7 | with open("yld.js", "r", encoding="utf-8") as f: 8 | ctx = execjs.compile(f.read()) 9 | result = ctx.call("encryptByDES", "111111") 10 | return result 11 | 12 | 13 | url = "https://cj.eloancn.com/pcgway/login/v1/02" 14 | headers = { 15 | 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36', 16 | 'Referer': 'https://cj.eloancn.com/user/login?service=https%3A%2F%2Fcj.eloancn.com%2Fpcgway%2Fapp001%2Fv1%2F02%3Fret%3DaHR0cHM6Ly9jai5lbG9hbmNuLmNvbQ%3D%3D&v=1574315466719', 17 | } 18 | data = { 19 | "version": str(random.random()), 20 | "platform": "5", 21 | "username": "13800000000", 22 | "password": encryptByDES(), 23 | "service": "https://cj.eloancn.com/pcgway/app001/v1/02?ret=aHR0cHM6Ly9jai5lbG9hbmNuLmNvbQ==", 24 | } 25 | res = requests.post(url, headers=headers, data=data) 26 | print(res.json()) 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PythonSpider 2 | JS逆向实战、教程持续更新,欢迎star,求关注公众号“逆向新手”! 3 | 4 | | Author | 丁仔 | 5 | | :-----: | :---: | 6 | | 微信公众号 | 逆向新手 | 7 | | Introduce | Python、爬虫、JS逆向 | 8 | 9 | 10 | ## 代码配套教程 11 | - [x] [【合肥市房产信息平台、百变IP】面向小白之eval混淆](https://mp.weixin.qq.com/s/c_-yghD8sEqgaeLO8NfkgQ) 12 | - [x] [【安徽省雨水情监视平台】一个简单易懂的练手网站](https://mp.weixin.qq.com/s/IgaU9dzLcRzCk97Qs7phYA) 13 | - [x] [【TAPD模拟登录】非常简单的AES加密练手网站](https://mp.weixin.qq.com/s/vF3P-PBZz-qkxTGJkiQONg) 14 | - [x] [【58同城模拟登录】RSA加密及浏览器指纹分析](https://mp.weixin.qq.com/s/kfDpGlVuUwciyhTBdyrf5A) 15 | - [x] [【毛毛租】AES加密,较难分析的网站](https://mp.weixin.qq.com/s/3_sRSVidVy47-ZipArbCmg) 16 | - [x]  [ JS逆向 | 骚操作教你如何伪造浏览器环境](https://mp.weixin.qq.com/s/secmduSgSjuhbBuTrNxZkQ) 17 | - [x] [【透明售房网】高度混淆及浏览器指纹分析(一)](https://mp.weixin.qq.com/s/UlnVU2yGjSqSeJMOihXL4A) 18 | - [x] [【透明售房网】高度混淆及浏览器指纹分析(二)](https://mp.weixin.qq.com/s/m5hapF2O3SLWFhVW42qLkA) 19 | - [x]  [ JS逆向 | ob混淆一键还原工具](https://mp.weixin.qq.com/s/KOyhktjuOaZS2GM7UDrHWw) 20 | - [x]  [ JS逆向 | BOSS直聘cookie分析](https://mp.weixin.qq.com/s/0B-k1-wgNVEJZQo2I0vl_Q) 21 | 22 | ### 赞赏 23 | 24 | 如果觉得本仓库对你有用,谢谢赞赏~ 25 | 26 | ![](https://imgkr.cn-bj.ufileos.com/bf55aae1-f12b-4a63-9b57-94eaf2ff9798.png) 27 | -------------------------------------------------------------------------------- /18-今日头条/toutiao.py: -------------------------------------------------------------------------------- 1 | # https://www.toutiao.com/ch/news_hot/ 2 | import requests 3 | 4 | 5 | session = requests.Session() 6 | ua = 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4142.0 Safari/537.36' 7 | headers = { 8 | 'referer': 'https://www.toutiao.com', 9 | 'sec-fetch-dest': 'empty', 10 | 'sec-fetch-mode': 'cors', 11 | 'sec-fetch-site': 'same-origin', 12 | 'user-agent': ua, 13 | 'x-requested-with': 'XMLHttpRequest', 14 | 'accept': 'text/javascript, text/html, application/xml, text/xml, */*', 15 | 'accept-language': 'zh-CN,zh;q=0.9', 16 | 'content-type': 'application/x-www-form-urlencoded', 17 | } 18 | data = { 19 | # 热点,其它需要作相应修改。JS文件同样需要修改 20 | "category": "news_hot", 21 | "userAgent": ua, 22 | "max_behot": 0 23 | } 24 | for i in range(5): 25 | # 这里仅获取前5页 26 | param = requests.post("http://127.0.0.1:8919/get_param", data=data).json() 27 | url = "https://www.toutiao.com/api/pc/feed/" 28 | res = session.get(url, params=param, headers=headers) 29 | result = res.json() 30 | print(result) 31 | print("已获取第" + str(i+1) + "页") 32 | if not result['has_more']: 33 | data["max_behot"] = result['next']['max_behot_time'] 34 | else: 35 | break 36 | -------------------------------------------------------------------------------- /19-BOSS直聘/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express') 2 | var app = express() 3 | var cook = require('./boss.js') // 导入boss.js模块,并命名为cook 4 | var bodyParser = require('body-parser'); // 导入请求体解析器 5 | // 调整参数大小限制,否则会提示参数过大。 6 | app.use(bodyParser.urlencoded({limit: '50mb', extended: true})); 7 | 8 | // 开启get_cookie路由 9 | app.post('/get_cookie', function(req, res) { 10 | // 获取请求的真实IP 11 | var ip = req.headers['x-real-ip'] ? req.headers['x-real-ip'] : req.ip.replace(/::ffff:/, ''); 12 | // 获取请求时间 13 | var time = new Date().toString().replace(/\+0800.*/, ''); 14 | // 打印请求时间、IP、方法、路由 15 | console.log('INFO:', time, ip, req.method, req.originalUrl, '200 OK!'); 16 | // 获取POST请求的formdata 17 | let result = req.body; 18 | let code = result.code; 19 | let seed = result.seed; 20 | let ts = result.ts; 21 | 22 | // 调用cook模块中的get_cookie方法,该方法需要提前module.exports导出 23 | var cooki = cook.get_cookie(seed, ts, code); 24 | // 设置响应头,如果不设置,通过asyncio_requests请求的res.json()会报错,因为它是根据响应头解析json数据 25 | // 而requests可以直接使用res.json()解析,因为它是根据响应信息解析 26 | res.set('Content-Type', 'application/json') 27 | // 将JSON后的数据返回客户端 28 | res.send(JSON.stringify(cooki)); 29 | }); 30 | 31 | app.listen(8919, () => { 32 | console.log("开启服务,端口8919", new Date().toString().replace(/\+0800.*/, '')) 33 | }) 34 | -------------------------------------------------------------------------------- /05-TAPD登录AES加密/tapd.py: -------------------------------------------------------------------------------- 1 | # https://www.tapd.cn/cloud_logins/login TAPD登录 2 | 3 | import execjs, requests, json 4 | 5 | 6 | def encrypt(content): 7 | with open("tapd.js", "r", encoding='utf8') as f: 8 | ctx = execjs.compile(f.read()) 9 | datas = json.loads(ctx.call("aes", content)) 10 | return datas 11 | 12 | 13 | headers = { 14 | 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', 15 | 'Referer': 'https://www.tapd.cn/cloud_logins/login' 16 | } 17 | 18 | datas = encrypt("Aa123456") 19 | data = { 20 | 'data[Login][ref]': 'https://www.tapd.cn/my_worktable', 21 | 'data[Login][encrypt_key]': datas['encrypt_key'], 22 | 'data[Login][encrypt_iv]': datas['encrypt_iv'], 23 | 'data[Login][site]': 'TAPD', 24 | 'data[Login][via]': 'encrypt_password', 25 | 'data[Login][email]': '17109324205', 26 | 'data[Login][password]': datas['password'], 27 | 'data[Login][code]': '', # 验证码,一般正确的账号密码不需要 28 | 'data[Login][login]': 'login', 29 | 'dsc_token': datas['dsc_token'], 30 | } 31 | response = requests.post('https://www.tapd.cn/cloud_logins/login', headers=headers, data=data) 32 | # print(response.text) 33 | 34 | if "退出登录" in response.text: 35 | print("登录成功") 36 | else: 37 | print("登录失败") 38 | -------------------------------------------------------------------------------- /08-帝恩思登录(AES)/dns.py: -------------------------------------------------------------------------------- 1 | # https://www.dns.com/login.html 帝恩思登录 2 | 3 | import base64, requests, re, execjs 4 | 5 | 6 | def encrypt(content): 7 | with open("dns.js", "r") as f: 8 | ctx = execjs.compile(f.read()) 9 | enc = ctx.call("aes", content) 10 | print(enc) 11 | return enc 12 | 13 | 14 | def get_token(): 15 | url = "https://www.dns.com/login.html" 16 | res = s.get(url, headers=headers) 17 | pattern = re.compile(r'var csrfToken = "(.*?)";', re.S) 18 | result = re.findall(pattern, res.text) 19 | result = result[0] if result else '' 20 | print(result) 21 | return result 22 | 23 | 24 | headers = { 25 | 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', 26 | } 27 | s = requests.Session() 28 | data = { 29 | '_token': get_token(), 30 | 'password': encrypt("Aa123456"), 31 | 'email': encrypt("17109324198"), 32 | } 33 | 34 | s.post('https://www.dns.com/login', headers=headers, data=data) # 登录 35 | response = s.get("https://www.dns.com/dashboard", headers=headers) # 获取用户名 36 | pattern = re.compile(r'(.*?)') 37 | result = re.findall(pattern, response.text) 38 | result = result[0] if result else '获取失败' 39 | print(result) 40 | -------------------------------------------------------------------------------- /16-零度IP(md5)/lingduIP(Python).py: -------------------------------------------------------------------------------- 1 | # https://nyloner.cn/proxy 零度IP 2 | 3 | import base64 4 | from hashlib import md5 5 | import time, requests, json 6 | 7 | 8 | def token(page, num): 9 | token = str(page) + str(num) + str(int(time.time())) 10 | return md5(token.encode()).hexdigest() 11 | 12 | 13 | def decode_str(scHZjLUh1): 14 | # JS的fromCharCode函数为Python的chr函数,JS的charCodeAt函数为Python的ord函数 15 | scHZjLUh1 = str(base64.b64decode(scHZjLUh1), encoding="utf-8") 16 | key = "nyloner" 17 | length = len(key) 18 | code = "" 19 | for i in range(len(scHZjLUh1)): 20 | coeFYlqUm2 = i % length 21 | code += chr(ord(scHZjLUh1[i]) ^ ord(key[coeFYlqUm2])) 22 | return json.loads(str(base64.b64decode(code), encoding="utf-8")) 23 | 24 | 25 | def get_one_page(): 26 | page = 1 27 | num = 15 28 | url = "https://nyloner.cn/proxy?page={}&num={}&token={}&t={}".format(page, num, token(page, num), int(time.time())) 29 | headers = { 30 | "User-Agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36", 31 | "Cookie": "sessionid=uhuxzch7g7bxiv9okm5p93fn7qh0pss3" 32 | } 33 | res = requests.get(url, headers=headers) 34 | ip_list = res.json()["list"] 35 | return ip_list 36 | 37 | 38 | for i in decode_str(get_one_page()): 39 | print(i) 40 | -------------------------------------------------------------------------------- /07-七麦数据JS逆向/qmsj.js: -------------------------------------------------------------------------------- 1 | function _(n) { 2 | return new Buffer.from(encodeURIComponent(n).replace(/%([0-9A-F]{2})/g, function(a, n) { 3 | return i("0x" + n) 4 | })).toString('base64') 5 | } 6 | function i(n) { 7 | return String["fromCharCode"](n) 8 | } 9 | function k(a, n) { 10 | n || (n = o()), 11 | a = a.split(""); 12 | for (var t = a.length, e = n["length"], r = "charCodeAt", m = 0; m < t; m++) 13 | a[m] = i(a[m][r](0) ^ n[(m + 10) % e][r](0)); 14 | return a["join"]("") 15 | } 16 | function analysis(url, params) { 17 | var e = +new Date() - 140173 - 1515125653845 18 | , i = [] 19 | , r = "" 20 | , R = "@#"; 21 | if (params) { 22 | params = JSON.parse(params) 23 | Object.keys(params)["forEach"](function(a) { 24 | if (a == "analysis") 25 | return !1; 26 | params["hasOwnProperty"](a) && i["push"](params[a]) 27 | }) 28 | } 29 | i = i["sort"]()["join"](""), 30 | i = _(i), 31 | i += R + url.replace("https://api.qimai.cn", ""), 32 | i += R + e, 33 | i += R + 1, 34 | r = _(k(i, "00000008d78d46a")) 35 | return r 36 | } 37 | var params = { 38 | brand: "all", 39 | country: "cn", 40 | device: "iphone", 41 | genre: "5000" 42 | } 43 | console.log(analysis("https://api.qimai.cn/rank/indexPlus/brand_id/1", JSON.stringify(params))) 44 | -------------------------------------------------------------------------------- /18-今日头条/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express') 2 | var app = express() 3 | var sign = require('./toutiao') // 导入toutiao模块,并命名为sign 4 | var bodyParser = require('body-parser'); // 导入请求体解析器 5 | app.use(bodyParser()); 6 | 7 | // 开启get_cookie路由 8 | app.post('/get_param', function(req, res) { 9 | // 获取请求的真实IP 10 | var ip = req.headers['x-real-ip'] ? req.headers['x-real-ip'] : req.ip.replace(/::ffff:/, ''); 11 | // 获取请求时间 12 | var time = new Date().toString().replace(/\+0800.*/, ''); 13 | // 打印请求时间、IP、方法、路由 14 | console.log('INFO:', time, ip, req.method, req.originalUrl, '200 OK!'); 15 | // 获取POST请求的formdata 16 | let result = req.body; 17 | // 取出formdata中的category 18 | let category = result.category; 19 | // 取出formdata中的userAgent 20 | let userAgent = result.userAgent; 21 | // 取出formdata中的userAgent 22 | let max_behot = result.max_behot; 23 | // 调用toutiao模块中的get_param方法,该方法需要提前module.exports导出 24 | var param = sign.get_param(category, userAgent, max_behot); 25 | // 设置响应头,如果不设置,通过asyncio_requests请求的res.json()会报错,因为它是根据响应头解析json数据 26 | // 而requests可以直接使用res.json()解析,因为它是根据响应信息解析 27 | res.set('Content-Type', 'application/json') 28 | // 将JSON后的数据返回客户端 29 | res.send(JSON.stringify(param)); 30 | }); 31 | 32 | 33 | 34 | // 监听8919端口,所有人均可访问 35 | app.listen(8919, () => { 36 | console.log("开启服务,端口8919", new Date().toString().replace(/\+0800.*/, '')) 37 | }) 38 | 39 | 40 | -------------------------------------------------------------------------------- /15-陆金所登录(RSA)/ljs.py: -------------------------------------------------------------------------------- 1 | # https://user.lu.com/user/login 陆金所 2 | 3 | import requests, time, execjs, os 4 | from PIL import Image 5 | 6 | 7 | 8 | def encrypt(): 9 | with open("ljs.js", "r", encoding="utf-8") as f: 10 | ctx = execjs.compile(f.read()) 11 | result = ctx.call("aaa", "Aa123456") 12 | return result 13 | 14 | 15 | def code(): 16 | url = "https://user.lu.com/user/captcha/captcha.jpg?source=login&_=" + str(int(time.time()*1000)) 17 | res = requests.get(url, headers=headers) 18 | with open("code.jpg", "wb") as f: 19 | f.write(res.content) 20 | img = Image.open("code.jpg") 21 | img.show() 22 | code = input("请输入验证码:") 23 | os.remove("code.jpg") 24 | return code 25 | 26 | 27 | headers = { 28 | 'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36', 29 | "cookie": "_g=m_79ef08da-be6d-4310-9862-821451a1bff7; IMVC=c11a350dfd50488ba846afe8eb149699" 30 | } 31 | 32 | data = { 33 | 'isTrust': 'Y', 34 | 'password': encrypt(), 35 | 'userName': '17109324198', 36 | 'validNum': '', 37 | } 38 | 39 | while True: 40 | response = requests.post('https://user.lu.com/user/login', headers=headers, data=data) 41 | print(response.json()) 42 | if "VCODE" in response.json()["resultMsg"]: 43 | time.sleep(1.5) 44 | data["validNum"] = code() 45 | else: 46 | break 47 | 48 | -------------------------------------------------------------------------------- /08-帝恩思登录(AES)/dns(Python).py: -------------------------------------------------------------------------------- 1 | # https://www.dns.com/login.html 帝恩思登录 2 | 3 | from Crypto.Cipher import AES 4 | import base64, requests, re 5 | 6 | 7 | def encrypt(content): 8 | # k:密钥,iv:偏移量,content:需加密的内容 9 | k = iv = "1234567890abcDEF" 10 | k = k.encode("utf-8") 11 | iv = iv.encode("utf-8") 12 | pad = lambda s: s + (16 - len(s)%16) * chr(0) 13 | # AES加密时,明文长度需为16的倍数。这里的pad用来填充,chr(0)表示为ZeroPadding,在最后填充0 14 | content = pad(content).encode("utf-8") 15 | cipher = AES.new(k, AES.MODE_CBC, iv) # CBC模式加密 16 | cipher_text = cipher.encrypt(content) 17 | enc = base64.b64encode(cipher_text).decode("utf-8") 18 | print(enc) 19 | return enc 20 | 21 | 22 | def get_token(): 23 | url = "https://www.dns.com/login.html" 24 | res = s.get(url, headers=headers) 25 | pattern = re.compile(r'var csrfToken = "(.*?)";', re.S) 26 | result = re.findall(pattern, res.text) 27 | result = result[0] if result else '' 28 | print(result) 29 | return result 30 | 31 | 32 | headers = { 33 | 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', 34 | 35 | } 36 | s = requests.Session() 37 | data = { 38 | '_token': get_token(), 39 | 'password': encrypt("Aa123456"), 40 | 'email': encrypt("17109324198"), 41 | } 42 | 43 | s.post('https://www.dns.com/login', headers=headers, data=data) # 登录 44 | response = s.get("https://www.dns.com/dashboard", headers=headers) # 获取用户名 45 | pattern = re.compile(r'(.*?)') 46 | result = re.findall(pattern, response.text) 47 | result = result[0] if result else '获取失败' 48 | print(result) 49 | -------------------------------------------------------------------------------- /00-通用加密/RSAKeyPair.py: -------------------------------------------------------------------------------- 1 | import rsa 2 | 3 | 4 | class Encrypt(): 5 | """ 6 | 该类为参考的这篇文章:https://www.52pojie.cn/forum.php?mod=viewthread&tid=874374 7 | 主要用于对应JS中的RSAKeyPair的RSA加密,每次对相同明文加密后的密文都是相同的,原因为NoPadding 8 | """ 9 | def __init__(self, e, n): 10 | self.e = e 11 | self.n = n 12 | 13 | def encrypt(self, message): 14 | ee = int(self.e, 16) 15 | nn = int(self.n, 16) 16 | rsa_pubkey = rsa.PublicKey(e=ee, n=nn) 17 | crypto = self._encrypt(message.encode(), rsa_pubkey) 18 | return crypto.hex() 19 | 20 | def _pad_for_encryption(self, message, target_length): 21 | message = message[::-1] 22 | max_msglength = target_length - 11 23 | msglength = len(message) 24 | 25 | padding = b'' 26 | padding_length = target_length - msglength - 3 27 | 28 | for i in range(padding_length): 29 | padding += b'\x00' 30 | 31 | return b''.join([b'\x00\x00',padding,b'\x00',message]) 32 | 33 | def _encrypt(self, message, pub_key): 34 | keylength = rsa.common.byte_size(pub_key.n) 35 | padded = self._pad_for_encryption(message, keylength) 36 | 37 | payload = rsa.transform.bytes2int(padded) 38 | encrypted = rsa.core.encrypt_int(payload, pub_key.e, pub_key.n) 39 | block = rsa.transform.int2bytes(encrypted, keylength) 40 | 41 | return block 42 | 43 | 44 | def USE_RSA(message): 45 | e = "010001" 46 | n = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7" 47 | en = Encrypt(e, n) 48 | return en.encrypt(message) 49 | 50 | 51 | print(USE_RSA("111111")) 52 | -------------------------------------------------------------------------------- /13-网易云音乐评论(AES、RSA)/music163.py: -------------------------------------------------------------------------------- 1 | # https://music.163.com/#/song?id=1384026889 网易云音乐评论 2 | # https://music.163.com/weapi/v1/resource/comments/R_SO_4_1384026889?csrf_token= api链接 3 | 4 | import requests, execjs, json 5 | 6 | 7 | def encrypt(params): 8 | with open("music163.js", "r", encoding="utf-8") as f: 9 | ctx = execjs.compile(f.read()) 10 | result = json.loads(ctx.call("encrypt", json.dumps(params))) 11 | return result 12 | 13 | 14 | def get_page(page): 15 | params = { 16 | "csrf_token": "", 17 | "limit": "20", # 每页限制个数 18 | "offset": str(page * 20), # 控制翻页,每次增加20 19 | "rid": "R_SO_4_1384026889", # R_SO_4_ 加上歌曲id 20 | "total": "true" if i == 0 else "false", # 只有第1页为true,后面均为false 21 | } 22 | url = "https://music.163.com/weapi/v1/resource/comments/R_SO_4_1384026889?csrf_token=" 23 | try: 24 | response = requests.post(url, headers=headers, data=encrypt(params)) 25 | if response.status_code == 200: 26 | return response.json() 27 | else: 28 | print("爬取失败:", response.status_code) 29 | return None 30 | except Exception as e: 31 | print("ERROR:", e) 32 | return None 33 | 34 | 35 | def parse_page(response): 36 | if response: 37 | comments = response["comments"] 38 | for comment in comments: 39 | content = comment["content"] 40 | nickname = comment["user"]["nickname"] 41 | print(nickname + ":" + content + "\n") 42 | 43 | 44 | if __name__ == "__main__": 45 | headers = { 46 | 'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', 47 | } 48 | for i in range(3): 49 | html = get_page(i) 50 | parse_page(html) 51 | 52 | 53 | -------------------------------------------------------------------------------- /09-思酷在线(RSA)/skzx.py: -------------------------------------------------------------------------------- 1 | # http://study.study2win.net/wx/register.html 注册地址 2 | # http://study.study2win.net/wx/login.html 登录地址 3 | 4 | from Crypto.PublicKey import RSA 5 | from Crypto.Cipher import PKCS1_v1_5 6 | import time, math, random, json, base64, requests 7 | 8 | 9 | def get_json(a): 10 | nonce = "" 11 | for i in range(6): 12 | nonce += str(math.floor(random.random() * 10)) 13 | nonce = str(int(time.time()*1000)) + nonce 14 | data = { 15 | "text":a, 16 | "timestamp":int(time.time()*1000), 17 | "nonce":nonce 18 | } 19 | return json.dumps(data) 20 | 21 | 22 | def rsa_encrypt(a): 23 | key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApQUOaXuFw6ecagtlJQ6a7lnxTSLtTFVQ/Sf0iA/P45zX44AshFFG3iGzcNiTPTepGMGuoLm1LYzdT1s8NrVQ+qgmSAOSN9x//hcJdjSdh2vXVwDDANIryw0fxmsdRbNjPsUvL4j8vulRulPpUhy2v5/LyxyDWOzOjG2IftZxbFXsc2yLohpC1h1vUADAF50D1eUm2ilJXNCNWrofjwFiK2J1Q3h6TUW7ZJhwtFCm3DoUIAK2WU7XOAt/rMJopULbU1ThL+UdUydDEzLBEDIjD8SS3E9NcILatGuc7xr8re+KPLqdiL7Nmmvbb9toJq39fnbYeNrBUlKSJPfRo8HG7QIDAQAB" 24 | publickey = """-----BEGIN PUBLIC KEY----- 25 | {key} 26 | -----END PUBLIC KEY-----""".format(key=key) 27 | 28 | rsakey = RSA.importKey(publickey) 29 | cipher = PKCS1_v1_5.new(rsakey) 30 | cipher_text = cipher.encrypt(get_json(a).encode("utf-8")) 31 | return '_SCHO_ENC_:V1:RSA:ZSXYPROD0001:' + str(base64.b64encode(cipher_text), encoding="utf-8") 32 | 33 | 34 | url = "https://study.study2win.net/front/login/unp" 35 | data = { 36 | "orgCode":"SAAS", 37 | "password":rsa_encrypt("111111"), 38 | "svcCode":"client:009", 39 | "username":rsa_encrypt("15800000000"), 40 | } 41 | # print(data) 42 | headers = { 43 | 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36', 44 | 'Referer': 'http://study.study2win.net/wx/login.html', 45 | 'Origin': 'https://study.study2win.net', 46 | 'Content-Type': 'application/json', 47 | } 48 | res = requests.post(url, headers=headers, data=json.dumps(data)) 49 | print(res.json()) 50 | -------------------------------------------------------------------------------- /02-合肥市房产信息平台(eval混淆)/hffc.js: -------------------------------------------------------------------------------- 1 | function get_url(id, iptstamp) { 2 | function reurl() { 3 | var a = "/item/" + recode(id) 4 | return a 5 | }; 6 | function recode(a) { 7 | var n = nscaler(a); 8 | var c = SetObjNum(a.length); 9 | var d = SetObjNum(a.length); 10 | n = parseInt(n) + parseInt(d); 11 | var b = iptstamp; 12 | b = nscaler(b.toString()); 13 | return c + "-" + n + "-" + d + "-" + b 14 | } 15 | function SetObjNum(n) { 16 | var a = ""; 17 | for (var i = 0; i < n; i++) 18 | a += Math.floor(Math.random() * 10); 19 | return a 20 | } 21 | function each(obj, callback, args) { 22 | var name, 23 | i = 0, 24 | length = obj.length, 25 | isObj = false; 26 | if ( args ) { 27 | if ( isObj ) { 28 | for ( name in obj ) { 29 | if ( callback.apply( obj[ name ], args ) === false ) { 30 | break; 31 | } 32 | } 33 | } else { 34 | for ( ; i < length; ) { 35 | if ( callback.apply( obj[ i++ ], args ) === false ) { 36 | break; 37 | } 38 | } 39 | } 40 | } else { 41 | if ( isObj ) { 42 | for ( name in obj ) { 43 | if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) { 44 | break; 45 | } 46 | } 47 | } else { 48 | for ( ; i < length; ) { 49 | if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) { 50 | break; 51 | } 52 | } 53 | } 54 | } 55 | return obj; 56 | } 57 | function nscaler(a) { 58 | var b = ""; 59 | each(a, function (i, e) { 60 | switch (e) { 61 | case "0": 62 | b += "0"; 63 | break; 64 | case "1": 65 | b += "2"; 66 | break; 67 | case "2": 68 | b += "5"; 69 | break; 70 | case "3": 71 | b += "8"; 72 | break; 73 | case "4": 74 | b += "6"; 75 | break; 76 | case "5": 77 | b += "1"; 78 | break; 79 | case "6": 80 | b += "3"; 81 | break; 82 | case "7": 83 | b += "4"; 84 | break; 85 | case "8": 86 | b += "9"; 87 | break; 88 | case "9": 89 | b += "7"; 90 | break 91 | } 92 | }); 93 | return b 94 | } 95 | return reurl() 96 | } 97 | console.log(get_url("2703", "1578903379984")) 98 | -------------------------------------------------------------------------------- /02-合肥市房产信息平台(eval混淆)/hffc.py: -------------------------------------------------------------------------------- 1 | import requests, execjs 2 | from lxml import etree 3 | 4 | 5 | headers = { 6 | 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4014.0 Safari/537.36', 7 | } 8 | with open("hffc.js", "r", encoding="utf-8") as f: 9 | ctx = execjs.compile(f.read()) 10 | 11 | 12 | def get_detail_url(id, iptstamp): 13 | reurl = ctx.call("get_url", id, iptstamp) 14 | url = "http://60.173.254.126" + reurl 15 | return url 16 | 17 | 18 | def get_index(): 19 | url = "http://60.173.254.126/" 20 | try: 21 | resp = requests.get(url, headers=headers) 22 | if resp.status_code == 200: 23 | return resp.text 24 | else: 25 | print("爬取主页失败:", resp.status_code) 26 | return None 27 | except Exception as e: 28 | print("爬取主页失败:", e) 29 | return None 30 | 31 | 32 | def parse_index(resp): 33 | html = etree.HTML(resp) 34 | iptstamp = html.xpath("//input[@id='iptstamp']/@value")[0] 35 | # print(iptstamp) 36 | communities = html.xpath("//div[@class='beian_se2_1 mt20']//a") 37 | for community in communities: 38 | name = community.xpath("text()")[0] 39 | id = community.xpath("@id")[0] 40 | yield { 41 | "name": name, 42 | "id": id, 43 | "url":get_detail_url(id, iptstamp) 44 | } 45 | 46 | 47 | def get_detail_page(url): 48 | try: 49 | resp = requests.get(url, headers=headers) 50 | if resp.status_code == 200: 51 | return resp.text 52 | else: 53 | print("爬取详情页失败:", resp.status_code) 54 | return None 55 | except Exception as e: 56 | print("爬取详情页失败:", e) 57 | return None 58 | 59 | 60 | def parse_detail_page(resp): 61 | # 懒得写了... 62 | if resp: 63 | print(resp) 64 | 65 | 66 | if __name__ == "__main__": 67 | index_resp = get_index() 68 | if index_resp: 69 | for detail in parse_index(index_resp)[:2]: 70 | # 这里仅展示2页,可将切片去掉,解析全部 71 | detail_resp = get_detail_page(detail["url"]) 72 | parse_detail_page(detail_resp) 73 | -------------------------------------------------------------------------------- /09-思酷在线(RSA)/skzx.js: -------------------------------------------------------------------------------- 1 | //RAS2048密码加密 2 | var RAS = { 3 | rasEncrypt: function (password) { 4 | var nonce = ""; //随机8号数以上 5 | for (var i = 0; i < 6; i++) { //6位随机数,用以加在时间戳后面。 6 | nonce += Math.floor(Math.random() * 10); 7 | } 8 | nonce = new Date().getTime() + nonce; //时间戳,用来生成订单号。 9 | 10 | //转换成需要的格式 11 | var data = { 12 | text: password, 13 | timestamp: new Date().getTime(), 14 | nonce: nonce 15 | }; 16 | 17 | // var host = window.location.host; 18 | //公钥:生产环境,包括:标品、中特独立部署、NBCB独立部署或其他独立部署; 19 | var Key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApQUOaXuFw6ecagtlJQ6a7lnxTSLtTFVQ/Sf0iA/P45zX44AshFFG3iGzcNiTPTepGMGuoLm1LYzdT1s8NrVQ+qgmSAOSN9x//hcJdjSdh2vXVwDDANIryw0fxmsdRbNjPsUvL4j8vulRulPpUhy2v5/LyxyDWOzOjG2IftZxbFXsc2yLohpC1h1vUADAF50D1eUm2ilJXNCNWrofjwFiK2J1Q3h6TUW7ZJhwtFCm3DoUIAK2WU7XOAt/rMJopULbU1ThL+UdUydDEzLBEDIjD8SS3E9NcILatGuc7xr8re+KPLqdiL7Nmmvbb9toJq39fnbYeNrBUlKSJPfRo8HG7QIDAQAB'; 20 | var Code = '_SCHO_ENC_:V1:RSA:ZSXYPROD0001:'; 21 | //公钥:测试环境,包括:本地测试,BETA测试 22 | // var Key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA10AjU2HIhIb9hnjsRkHvPUVT91pl9fR9VKn/F/JbwrNlDZQOnd0AXpIM9tiHX2hK2aoV0MS4pTPWpAyC722fdwcupvDquRSlfU7TRI6mRPXo9ALHEUYIA2Bnpt0lU8VcP61EVOdEqAdtA1law/6Z9O4c1nHaDBblx3R9Sr7Lw3KJj6P2pRM/eNCrMDxw2PRf886UWSbJLKlvx0kxoox7LlAInToUqU1ofWNf0FlF+A6kd1wZhil1Iha9NS8z7UfMx92jxh9RtGWFK0gredeKFR1S7lAKjnW1bUzjrWvPmiEl4UJsQoS7krDN6skb8SLwga4QYUU3ua8GCRZBPZJ4QQIDAQAB'; 23 | // var Code = '_SCHO_ENC_:V1:RSA:ZSXYDEV0001:'; 24 | 25 | //-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----,是占位符,替换公钥时要保留 26 | var rsaPublicKey = KEYUTIL.getKey("-----BEGIN PUBLIC KEY-----" + Key + "-----END PUBLIC KEY-----"); 27 | 28 | //加密的明文 29 | var hexStr = KJUR.crypto.Cipher.encrypt(JSON.stringify(data), rsaPublicKey, "RSA"); 30 | 31 | //输出的密文 32 | return Code + RAS.hexToBase64(hexStr); 33 | }, 34 | // Hex to Base64 35 | hexToBase64: function (str) { 36 | return String.fromCharCode.apply(null, 37 | str.replace(/\r|\n/g, "").replace(/([\da-fA-F]{2}) ?/g, "0x$1 ").replace(/ +$/, "").split(" ")); 38 | } 39 | }; 40 | 41 | -------------------------------------------------------------------------------- /03-百变IP(eval混淆)/bbIP.py: -------------------------------------------------------------------------------- 1 | import requests, execjs 2 | from lxml import etree 3 | 4 | 5 | def decrypt(content): 6 | result = ctx.call("ddip", content) 7 | return result 8 | 9 | 10 | def get_page(): 11 | headers = { 12 | 'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', 13 | } 14 | try: 15 | response = requests.get('https://www.baibianip.com/home/free.html', headers=headers) 16 | if response.status_code == 200: 17 | return response.text 18 | else: 19 | print("爬取失败:", response.status_code) 20 | return None 21 | except Exception as e: 22 | print("爬取失败:", e) 23 | return None 24 | 25 | 26 | def parse_page(response): 27 | html = etree.HTML(response) 28 | trs = html.xpath("//table[@class='table table-striped table-bordered']/tbody/tr") 29 | for tr in trs: 30 | IP = decrypt(tr.xpath("./td[1]/script/text()")[0].split("'")[1]) 31 | port = tr.xpath("./td[2]/text()")[0].strip() 32 | country = tr.xpath("./td[3]/text()")[0].strip() 33 | province = tr.xpath("./td[4]/text()")[0].strip() 34 | kind = tr.xpath("./td[5]/text()")[0].strip() 35 | https = tr.xpath("./td[6]/text()")[0].strip() 36 | response_delay = tr.xpath("./td[7]/text()")[0].strip() 37 | baidu_delay = tr.xpath("./td[8]/text()")[0].strip() 38 | transfer_rate = tr.xpath("./td[9]/text()")[0].strip() 39 | availability_rate = tr.xpath("./td[10]/text()")[0].strip() 40 | last_verify = tr.xpath("./td[11]/text()")[0].strip() 41 | yield { 42 | "IP": IP, 43 | "端口": port, 44 | "国家": country, 45 | "省份": province, 46 | "匿名类型": kind, 47 | "HTPPS": https, 48 | "响应延时": response_delay, 49 | "百度耗时": baidu_delay, 50 | "传输速度": transfer_rate, 51 | "可用率": availability_rate, 52 | "最后验证": last_verify, 53 | } 54 | 55 | 56 | if __name__ == "__main__": 57 | with open("bbIP.js", "r", encoding="utf-8") as f: 58 | ctx = execjs.compile(f.read()) 59 | html = get_page() 60 | if html: 61 | for info in parse_page(html): 62 | print(info) 63 | -------------------------------------------------------------------------------- /11-易班登录(RSA)/yiban.py: -------------------------------------------------------------------------------- 1 | # https://www.yiban.cn/login 易班 登录网址 2 | # 验证账号:17109324198 密码:Aa123456 3 | 4 | import requests, re, os, base64, time 5 | from PIL import Image 6 | from Crypto.PublicKey import RSA 7 | from Crypto.Cipher import PKCS1_v1_5 8 | 9 | 10 | def encrypt(a, keys): 11 | # 构造密码 12 | if keys: 13 | rsakey = RSA.importKey(keys) 14 | cipher = PKCS1_v1_5.new(rsakey) 15 | cipher_text = cipher.encrypt(a.encode("utf-8")) 16 | return str(base64.b64encode(cipher_text), encoding="utf-8") 17 | else: 18 | return "" 19 | 20 | 21 | def get_keystime(): 22 | # 获取网页中的公钥、keys-time、cookies 23 | # 公钥必须与keys-time对应,否则无法登录 24 | url = "https://www.yiban.cn/login" 25 | res = requests.get(url , headers=headers) 26 | pattern = re.compile(r"data-keys-time='(.*?)'", re.S) 27 | result = re.findall(pattern, res.text) 28 | result = result[0] if result else '' 29 | pattern = re.compile(r"data-keys='(.*?)'", re.S) 30 | keys = re.findall(pattern, res.text) 31 | keys = keys[0] if keys else '' 32 | cookies = res.cookies 33 | return result, keys, cookies 34 | 35 | 36 | def get_captcha(): 37 | # 获取图形验证码 38 | url = "https://www.yiban.cn/captcha/index" 39 | res = requests.get(url, headers=headers, cookies=cookies) 40 | with open("code.png", "wb") as f: 41 | f.write(res.content) 42 | img = Image.open("code.png") 43 | print("即将展示验证码,查看后输入!") 44 | time.sleep(2) 45 | img.show() 46 | code = input("请输入图片验证码:") 47 | os.remove("code.png") 48 | return code 49 | 50 | 51 | def login(): 52 | # 登录 53 | while True: 54 | url = "https://www.yiban.cn/login/doLoginAjax" 55 | response = requests.post(url, headers=headers, data=data, cookies=cookies) 56 | if "请输入图形验证码" in response.json()["message"]: 57 | data["captcha"] = get_captcha() 58 | continue 59 | if "图片验证码错误" in response.json()["message"]: 60 | print("图片验证码错误,请重新输入!") 61 | data["captcha"] = get_captcha() 62 | continue 63 | return response.json() 64 | 65 | 66 | headers = { 67 | 'x-requested-with': 'XMLHttpRequest', 68 | 'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36', 69 | } 70 | keys_time, keys, cookies = get_keystime() 71 | account = input("请输入账号:") 72 | password = input("请输入密码:") 73 | data = { 74 | 'account': account, 75 | 'password': encrypt(password, keys), 76 | 'captcha': "", 77 | 'keysTime': keys_time, 78 | } 79 | 80 | print(login()) 81 | 82 | -------------------------------------------------------------------------------- /12-空气质量历史数据/aqi.py: -------------------------------------------------------------------------------- 1 | # https://www.aqistudy.cn/historydata/daydata.php?city=%E5%8C%97%E4%BA%AC&month=201312 空气质量历史数据 2 | 3 | import requests, execjs, json, re 4 | 5 | 6 | session = requests.Session() 7 | headers = { 8 | 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36', 9 | } 10 | 11 | 12 | def fetch(url, method, data=None): 13 | if method == 'GET': 14 | try: 15 | res = session.get(url, headers=headers) 16 | if res.status_code == 200: 17 | return res.text 18 | else: 19 | print('获取网页源代码失败!', res.status_code) 20 | return None 21 | except Exception as e: 22 | print('获取网页源代码失败!', e) 23 | return None 24 | 25 | if method == 'POST': 26 | try: 27 | res = session.post(url, headers=headers, data=data) 28 | if res.status_code == 200: 29 | return res.text 30 | else: 31 | print('获取网页源代码失败!', res.status_code) 32 | return None 33 | except Exception as e: 34 | print('获取网页源代码失败!', e) 35 | return None 36 | 37 | 38 | def get_encrypt_url(city, month): 39 | # 获取网页加密链接,用于获取eval代码 40 | url = 'https://www.aqistudy.cn/historydata/daydata.php?city=%s&month=%s' % (city, month) 41 | header = headers 42 | res = fetch(url, 'GET') 43 | if res: 44 | pattern = re.compile(r'', re.S) 45 | result = re.findall(pattern, res)[0] 46 | result = 'https://www.aqistudy.cn/historydata/' + result 47 | # print(result) 48 | return result 49 | 50 | 51 | def get_js_code(eval_str): 52 | # 将eval代码还原成正常js代码 53 | js = eval_str.replace("eval", "function get_js() {return ") + ";}" 54 | ctx = execjs.compile(js) 55 | return ctx.eval('get_js()') 56 | 57 | 58 | def get_param(city, month, js_code): 59 | # 匹配出获取加密参数的函数名、post参数名,并生成加密参数 60 | # 返回form data 61 | 62 | # 匹配函数名 63 | pattern = re.compile(r'{var param=(.*?)\(method,object\);') 64 | get_param_func = re.findall(pattern, js_code)[0] 65 | 66 | # 匹配参数名 67 | pattern = re.compile(r',data:{(.*?):param}') 68 | param_name = re.findall(pattern, js_code)[0] 69 | 70 | # 构造传参并执行js 71 | obj = { 72 | "city": city, 73 | "month": month 74 | } 75 | js = f'{get_param_func}("GETDAYDATA", {obj})' 76 | param = {param_name: ctx.eval(js)} 77 | return param 78 | 79 | 80 | def get_data(data, js_code): 81 | # 匹配出解密函数名并调用,将post请求的密文解密成json格式 82 | pattern = re.compile(r'function\(data\){data=(.*?)\(data\);') 83 | get_data_func = re.findall(pattern, js_code)[0] 84 | return json.loads(ctx.call(get_data_func, data)) 85 | 86 | 87 | encrypt_url = get_encrypt_url('北京', "201312") 88 | eval_str = fetch(encrypt_url, 'GET') 89 | js_code = get_js_code(eval_str) 90 | with open('aqi.js', 'r', encoding='utf8') as f: 91 | ctx = execjs.compile(f.read() + '\n' + js_code) 92 | 93 | param = get_param('北京', "201312", js_code) 94 | print('post参数:', param) 95 | 96 | url = 'https://www.aqistudy.cn/historydata/api/historyapi.php' 97 | res = fetch(url, 'POST', data=param) 98 | print('返回的密文:', res) 99 | print('解密:', get_data(res, js_code)) 100 | -------------------------------------------------------------------------------- /19-BOSS直聘/boss.py: -------------------------------------------------------------------------------- 1 | import requests, re 2 | from urllib.parse import unquote 3 | # import execjs 4 | 5 | 6 | def get_index(url): 7 | # 请求列表页,获取seed、js-filename、ts 8 | headers = { 9 | 'authority': 'www.zhipin.com', 10 | 'upgrade-insecure-requests': '1', 11 | 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36', 12 | 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 13 | 'sec-fetch-site': 'none', 14 | 'sec-fetch-mode': 'navigate', 15 | 'sec-fetch-user': '?1', 16 | 'sec-fetch-dest': 'document', 17 | 'accept-language': 'zh-CN,zh;q=0.9', 18 | } 19 | res = requests.get(url, headers=headers, allow_redirects=False) 20 | location = res.headers['location'] 21 | seed = unquote(re.findall(r'seed=(.*?)&', location)[0]) 22 | name = re.findall(r'name=(.*?)&', location)[0] 23 | ts = re.findall(r'ts=(.*?)&', location)[0] 24 | print(res.headers) 25 | print("seed:", seed) 26 | print("js-filename:", name) 27 | print("ts:", ts) 28 | return seed, name, ts 29 | 30 | 31 | def get_code(name): 32 | # 请求js-filename,获取动态代码 33 | headers = { 34 | 'authority': 'www.zhipin.com', 35 | 'cache-control': 'max-age=0', 36 | 'upgrade-insecure-requests': '1', 37 | 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36', 38 | 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 39 | 'sec-fetch-site': 'none', 40 | 'sec-fetch-mode': 'navigate', 41 | 'sec-fetch-user': '?1', 42 | 'sec-fetch-dest': 'document', 43 | 'accept-language': 'zh-CN,zh;q=0.9', 44 | # 'if-modified-since': 'Tue, 26 May 2020 11:27:36 GMT', 45 | } 46 | url = 'https://www.zhipin.com/web/common/security-js/%s.js' % name 47 | response = requests.get(url, headers=headers) 48 | print("code.length:", len(response.text)) 49 | return response.text 50 | 51 | 52 | def get_cookie(seed, ts, code): 53 | # 传入seed、ts、code代码,获取zp_stoken 54 | data = { 55 | "seed": seed, 56 | "ts": ts, 57 | "code": code 58 | } 59 | res = requests.post('http://127.0.0.1:8919/get_cookie', data=data).json() 60 | zp_stoken = res["cookie"] 61 | 62 | # zp_stoken = ctx.call("get_cookie", seed, ts, code)["cookie"] 63 | 64 | print("zp_stoken:", zp_stoken) 65 | return zp_stoken 66 | 67 | 68 | def main(url): 69 | # 主要运行逻辑 70 | # 1、请求列表页,获取参数 71 | # 2、获取js代码 72 | # 3、获取cookie 73 | # 4、携带cookie重新请求列表页,获取数据 74 | seed, name, ts = get_index(url) 75 | code = get_code(name) 76 | zp_stoken = get_cookie(seed, ts, code) 77 | headers = { 78 | 'authority': 'www.zhipin.com', 79 | 'upgrade-insecure-requests': '1', 80 | 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36', 81 | 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 82 | 'sec-fetch-site': 'same-origin', 83 | 'sec-fetch-mode': 'navigate', 84 | 'sec-fetch-dest': 'document', 85 | 'accept-language': 'zh-CN,zh;q=0.9', 86 | "cookie": '__zp_stoken__=' + zp_stoken 87 | } 88 | res = requests.get(url, headers=headers) 89 | print(res.text) 90 | 91 | 92 | 93 | if __name__ == "__main__": 94 | # with open("boss.js", "r", encoding="utf-8") as f: 95 | # ctx = execjs.compile(f.read()) 96 | 97 | # 列表页url 98 | url = 'https://www.zhipin.com/job_detail/?query=java&city=101280600&industry=&position=' 99 | main(url) 100 | 101 | -------------------------------------------------------------------------------- /13-网易云音乐评论(AES、RSA)/music163(Python).py: -------------------------------------------------------------------------------- 1 | # https://music.163.com/#/song?id=1384026889 网易云音乐评论 2 | # https://music.163.com/weapi/v1/resource/comments/R_SO_4_1384026889?csrf_token= api链接 3 | 4 | import requests, json, random, base64 5 | from Crypto.Cipher import AES 6 | import rsa 7 | 8 | 9 | class Encrypt(): 10 | """ 11 | 该类为参考的这篇文章:https://www.52pojie.cn/forum.php?mod=viewthread&tid=874374 12 | 主要用于对应JS中的RSAKeyPair的RSA加密,每次对相同明文加密后的密文都是相同的,原因为NoPadding 13 | """ 14 | def __init__(self, e, n): 15 | self.e = e 16 | self.n = n 17 | 18 | def encrypt(self, message): 19 | ee = int(self.e, 16) 20 | nn = int(self.n, 16) 21 | rsa_pubkey = rsa.PublicKey(e=ee, n=nn) 22 | crypto = self._encrypt(message.encode(), rsa_pubkey) 23 | return crypto.hex() 24 | 25 | def _pad_for_encryption(self, message, target_length): 26 | message = message[::-1] 27 | max_msglength = target_length - 11 28 | msglength = len(message) 29 | 30 | padding = b'' 31 | padding_length = target_length - msglength - 3 32 | 33 | for i in range(padding_length): 34 | padding += b'\x00' 35 | 36 | return b''.join([b'\x00\x00',padding,b'\x00',message]) 37 | 38 | def _encrypt(self, message, pub_key): 39 | keylength = rsa.common.byte_size(pub_key.n) 40 | padded = self._pad_for_encryption(message, keylength) 41 | 42 | payload = rsa.transform.bytes2int(padded) 43 | encrypted = rsa.core.encrypt_int(payload, pub_key.e, pub_key.n) 44 | block = rsa.transform.int2bytes(encrypted, keylength) 45 | 46 | return block 47 | 48 | 49 | # 以下均为自己改写部分 50 | def USE_RSA(message): 51 | e = "010001" 52 | n = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7" 53 | en = Encrypt(e, n) 54 | return en.encrypt(message) 55 | 56 | 57 | def USE_AES(content, k): 58 | k = k.encode("utf-8") 59 | iv = "0102030405060708".encode("utf-8") 60 | pad = lambda s: s + (16 - len(s)%16) * chr(16 - len(s)%16) 61 | # JS中没有指定padding,则默认即为Pkcs7填充 62 | content = pad(content).encode("utf-8") 63 | cipher = AES.new(k, AES.MODE_CBC, iv) 64 | cipher_text = cipher.encrypt(content) 65 | enc = base64.b64encode(cipher_text).decode("utf-8") 66 | return enc 67 | 68 | 69 | def encrypt(params): 70 | params = json.dumps(params) 71 | a = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" 72 | b = "".join(random.sample(a, 16)) 73 | h = {} 74 | h["params"] = USE_AES(params, "0CoJUm6Qyw8W8jud") 75 | h["params"] = USE_AES(h["params"], b) 76 | h["encSecKey"] = USE_RSA(b) 77 | return h 78 | 79 | 80 | def get_page(page): 81 | params = { 82 | "csrf_token": "", 83 | "limit": "20", # 每页限制个数 84 | "offset": str(page * 20), # 控制翻页,每次增加20 85 | "rid": "R_SO_4_1384026889", # R_SO_4_ 加上歌曲id 86 | "total": "true" if i == 0 else "false", # 只有第1页为true,后面均为false 87 | } 88 | url = "https://music.163.com/weapi/v1/resource/comments/R_SO_4_1384026889?csrf_token=" 89 | try: 90 | response = requests.post(url, headers=headers, data=encrypt(params)) 91 | if response.status_code == 200: 92 | return response.json() 93 | else: 94 | print("爬取失败:", response.status_code) 95 | return None 96 | except Exception as e: 97 | print("ERROR:", e) 98 | return None 99 | 100 | 101 | def parse_page(response): 102 | if response: 103 | comments = response["comments"] 104 | for comment in comments: 105 | content = comment["content"] 106 | nickname = comment["user"]["nickname"] 107 | print(nickname + ":" + content + "\n") 108 | 109 | 110 | if __name__ == "__main__": 111 | headers = { 112 | 'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36', 113 | } 114 | for i in range(3): 115 | html = get_page(i) 116 | parse_page(html) 117 | 118 | -------------------------------------------------------------------------------- /01-安徽招投标(sojson)/替换后.js: -------------------------------------------------------------------------------- 1 | var dynamicurl = "/WZWSRELw=="; 2 | var wzwsquestion = "z4kL0AO$0Gyd&9`{5?"; 3 | var wzwsfactor = "7445"; 4 | var wzwsmethod = "WZWS_METHOD"; 5 | var wzwsparams = "WZWS_PARAMS"; 6 | 7 | function _0x412a72(_0x2a28c0) { 8 | var _0x4257c9 = { 9 | 'mGirf': function _0x2eb028(_0x5ab0bc, _0x5505f4) { 10 | return _0x5ab0bc < _0x5505f4; 11 | }, 12 | 'hOkXt': function _0x16449b(_0x22286c, _0x41c8cd) { 13 | return _0x22286c & _0x41c8cd; 14 | }, 15 | 'RJeYY': function _0x24beb6(_0x59303b, _0x576d3b) { 16 | return _0x59303b == _0x576d3b; 17 | }, 18 | 'cFxMb': function _0x45b03c(_0xadce3d, _0x5416a9) { 19 | return _0xadce3d >> _0x5416a9; 20 | }, 21 | 'spzgJ': function _0x3c313d(_0x19fd11, _0xcacabb) { 22 | return _0x19fd11 << _0xcacabb; 23 | }, 24 | 'VdlKD': function _0x2427d5(_0x23b25b, _0x23b39e) { 25 | return _0x23b25b & _0x23b39e; 26 | }, 27 | 'VDeWo': function _0x1ef1b0(_0x476993, _0x40dd2a) { 28 | return _0x476993 == _0x40dd2a; 29 | }, 30 | 'gHLRp': function _0x16afb3(_0x4bdebb, _0x1065a7) { 31 | return _0x4bdebb >> _0x1065a7; 32 | }, 33 | 'biRta': function _0x301047(_0x2ada60, _0x1c4232) { 34 | return _0x2ada60 | _0x1c4232; 35 | }, 36 | 'oKMpY': function _0x1d0b02(_0x547e37, _0x500868) { 37 | return _0x547e37 << _0x500868; 38 | }, 39 | 'HlUXJ': function _0x21902c(_0x16ae1a, _0x466bbf) { 40 | return _0x16ae1a >> _0x466bbf; 41 | }, 42 | 'vuJTm': function _0x2fea95(_0x34f7b5, _0x59e46f) { 43 | return _0x34f7b5 << _0x59e46f; 44 | }, 45 | 'lHuwG': function _0x1339d0(_0x3c775a, _0x3450ae) { 46 | return _0x3c775a >> _0x3450ae; 47 | }, 48 | 'fpeDs': function _0x52b661(_0x318fc3, _0x59aa7b) { 49 | return _0x318fc3 & _0x59aa7b; 50 | }, 51 | 'HqwlU': function _0x2144ca(_0x4799d4, _0x25b745) { 52 | return _0x4799d4 | _0x25b745; 53 | }, 54 | 'nPBKx': function _0x42b833(_0xe339b1, _0x5c500c) { 55 | return _0xe339b1 & _0x5c500c; 56 | }, 57 | 'ZRhVT': function _0xc9529d(_0x5ed560, _0x4383da) { 58 | return _0x5ed560 & _0x4383da; 59 | }, 60 | }; 61 | var _0x2097d8 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 62 | var _0x27d1f5, _0x4262d0, _0xc876d4; 63 | var _0x5526a7, _0x138cf5, _0x4093e6; 64 | _0xc876d4 = _0x2a28c0['length']; 65 | _0x4262d0 = 0x0; 66 | _0x27d1f5 = ''; 67 | while (_0x4257c9["mGirf"](_0x4262d0, _0xc876d4)) { 68 | _0x5526a7 = _0x4257c9["hOkXt"](_0x2a28c0['charCodeAt'](_0x4262d0++), 0xff); 69 | if (_0x4257c9['RJeYY'](_0x4262d0, _0xc876d4)) { 70 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9["cFxMb"](_0x5526a7, 0x2)); 71 | _0x27d1f5 += _0x2097d8['charAt'](_0x4257c9["spzgJ"](_0x4257c9["VdlKD"](_0x5526a7, 0x3), 0x4)); 72 | _0x27d1f5 += '=='; 73 | break; 74 | } 75 | _0x138cf5 = _0x2a28c0['charCodeAt'](_0x4262d0++); 76 | if (_0x4257c9["VDeWo"](_0x4262d0, _0xc876d4)) { 77 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9['gHLRp'](_0x5526a7, 0x2)); 78 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9["biRta"](_0x4257c9["oKMpY"](_0x4257c9["VdlKD"](_0x5526a7, 0x3), 0x4), _0x4257c9["HlUXJ"](_0x4257c9["VdlKD"](_0x138cf5, 0xf0), 0x4))); 79 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9["vuJTm"](_0x4257c9['VdlKD'](_0x138cf5, 0xf), 0x2)); 80 | _0x27d1f5 += '='; 81 | break; 82 | } 83 | _0x4093e6 = _0x2a28c0["charCodeAt"](_0x4262d0++); 84 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9['lHuwG'](_0x5526a7, 0x2)); 85 | _0x27d1f5 += _0x2097d8['charAt'](_0x4257c9["biRta"](_0x4257c9['VdlKD'](_0x5526a7, 0x3) << 0x4, _0x4257c9["fpeDs"](_0x138cf5, 0xf0) >> 0x4)); 86 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9["HqwlU"](_0x4257c9["vuJTm"](_0x4257c9['nPBKx'](_0x138cf5, 0xf), 0x2), _0x4257c9["ZRhVT"](_0x4093e6, 0xc0) >> 0x6)); 87 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9['ZRhVT'](_0x4093e6, 0x3f)); 88 | } 89 | return _0x27d1f5; 90 | }; 91 | function _0x344cd4() { 92 | var _0x3c9135 = 0x0; 93 | var _0x43beea = 0x0; 94 | for (_0x43beea = 0x0; _0x43beea < wzwsquestion["length"]; _0x43beea++) { 95 | _0x3c9135 += wzwsquestion["charCodeAt"](_0x43beea); 96 | } 97 | _0x3c9135 *= wzwsfactor; 98 | _0x3c9135 += 0x1b207; 99 | return "WZWS_CONFIRM_PREFIX_LABEL" + _0x3c9135; 100 | }; 101 | function get_url() { 102 | var _0xb14971 = _0x344cd4(); 103 | var _0x10ace8 = _0x412a72(_0xb14971["toString"]()); 104 | var _0x35ace3 = dynamicurl + "?wzwschallenge=" + _0x10ace8; 105 | return _0x35ace3; 106 | }; 107 | console.log(get_url()) 108 | -------------------------------------------------------------------------------- /06-58同城登录(RSA)/tc58.py: -------------------------------------------------------------------------------- 1 | # http://passport.58.com/login 58同城登录 2 | import time, execjs, re, os 3 | import requests 4 | from PIL import Image 5 | 6 | 7 | def get_password(a): 8 | # 获取加密后的密文 9 | with open("tc58.js", "r") as f: 10 | ctx = execjs.compile(f.read()) 11 | password = ctx.call("encryptString", a) 12 | return password 13 | 14 | 15 | def dologin(data1): 16 | # 执行登录 17 | while True: 18 | url = 'https://passport.58.com/58/login/pc/dologin' 19 | response = s.post(url, headers=headers, data=data1) 20 | if "请输入图片验证码" in response.text: 21 | pattern = re.compile(r'"vcodekey":"(.*?)",', re.S) 22 | vcodekey = re.findall(pattern, response.text)[0] 23 | validcode = get_code(vcodekey) 24 | data1["vcodekey"] = vcodekey 25 | data1["validcode"] = validcode 26 | elif "需要验证手机号" in response.text: 27 | pattern = re.compile(r'"warnkey":"(.*?)",', re.S) 28 | warnkey = re.findall(pattern, response.text)[0] 29 | pattern = re.compile(r'"path":"(.*?)",', re.S) 30 | path = re.findall(pattern, response.text)[0] 31 | token, codetype, mobile, tokencode = get_params(warnkey, path) 32 | mobilecode = get_phone_code(token, codetype, mobile, warnkey, path) 33 | result = mobile_login(mobilecode, token, tokencode) 34 | return result 35 | else: 36 | return response.text 37 | 38 | 39 | def mobile_login(mobilecode, tokencode, token): 40 | # 需要手机验证码时的登录请求 41 | url = "http://passport.58.com/58/mobile/pc/login" 42 | params = ( 43 | ('mobile', get_password(username)), 44 | ('mobilecode', mobilecode), 45 | ('source', '58-default-pc'), 46 | ('path', 'https%3A%2F%2Fmy.58.com%2Fpro%2Fmyseekjob%2F11%2F%3Fpts%3D' + str(int(time.time()*1000))), 47 | ('domain', '58.com'), 48 | ('isremember', 'false'), 49 | ('tokencode', tokencode), 50 | ('token', token), 51 | ('finger2', 'zh-CN|24|1.25|4|1536_864|1536_826|-480|1|1|1|undefined|1|unknown|Win32|unknown|3|false|false|false|false|false|0_false_false|d41d8cd98f00b204e9800998ecf8427e|86c75e61215ed0736aa38d1a4dadb102'), 52 | ('fingerprint', 'iMaJiSCrQD0j5Ie2T8tinSg6oh02-zDe'), # 可以写死 53 | ('psdk-d', 'jsdk'), 54 | ('psdk-v', '1.0.2'), 55 | ) 56 | response = s.get(url, params=params, headers=headers) 57 | return response.text 58 | 59 | 60 | def get_phone_code(token, codetype, mobile, warnkey, path): 61 | # 获取手机验证码 62 | url = "https://passport.58.com/sec/58/mobile/getcode" 63 | params = ( 64 | ('path', path), 65 | ('mobile', get_password(mobile)), 66 | ('codetype', codetype), 67 | ('token', token), 68 | ('warnkey', warnkey), 69 | ('voicetype', '0'), 70 | ('source', '58-default-pc'), 71 | ('psdk-d', 'jsdk'), 72 | ('psdk-v', '1.0.2'), 73 | ) 74 | response = s.get(url, headers=headers, params=params) 75 | if "动态码已发送" in response.text: 76 | mobilecode = input("请输入手机验证码:") 77 | return mobilecode 78 | 79 | 80 | def get_params(warnkey, path): 81 | # 获取手机验证码时需要的参数 82 | url = "https://passport.58.com/sec/58/frontend/pc/warndata" 83 | params = ( 84 | ('source', '58-default-pc'), 85 | ('path', path), 86 | ('warnkey', warnkey), 87 | ('psdk-d', 'jsdk'), 88 | ('psdk-v', '1.0.2'), 89 | ) 90 | response = s.get(url, headers=headers, params=params) 91 | token = response.json()["data"]["token"] 92 | codetype = response.json()["data"]["codetype"] 93 | mobile = response.json()["data"]["mobile"] 94 | tokencode = response.json()["data"]["tokencode"] 95 | return token, codetype, mobile, tokencode 96 | 97 | 98 | def get_code(vcodekey): 99 | # 获取图片验证码 100 | url = "https://passport.58.com/sec/58/validcode/get?vcodekey={}&time={}".format(vcodekey, str(int(time.time()*1000))) 101 | response = s.get(url, headers=headers) 102 | with open("code.jpg", "wb") as f: 103 | f.write(response.content) 104 | img = Image.open("code.jpg") 105 | img.show() 106 | os.remove("code.jpg") 107 | validcode = input("请输入图片验证码:") 108 | return validcode 109 | 110 | 111 | headers = { 112 | 'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36', 113 | 'referer': 'https://passport.58.com/login/?path=https%3A//hz.58.com/searchjob/%3Fspm%3D116138685575.zhaopin_baidu%26utm_source%3D12345&PGTID=0d302409-0004-f026-99d0-d5d7983ad769&ClickID=5', 114 | } 115 | 116 | s = requests.Session() 117 | username = input("请输入账号:") 118 | password = input("请输入密码:") 119 | data = { 120 | 'username': username, 121 | 'password': get_password(password), 122 | 'finger2': 'zh-CN|24|1.25|4|1536_864|1536_826|-480|1|1|1|undefined|1|unknown|Win32|unknown|3|false|false|false|false|false|0_false_false|d41d8cd98f00b204e9800998ecf8427e|86c75e61215ed0736aa38d1a4dadb102', 123 | } 124 | 125 | print(dologin(data)) 126 | -------------------------------------------------------------------------------- /01-安徽招投标(sojson)/替换方法.js: -------------------------------------------------------------------------------- 1 | var window = {}; 2 | var encode_version = 'sojson.v5', 3 | jezoh = '__0x3fb5e', 4 | __0x3fb5e = ['dcK9wotew5nCu2wvw6nCmsOvQcOONsOk', 'K8Kow4fDhzDDqwdh', 'UAATJSU=', 'wr8gw5HCqWw=', 'G8KzKhLDkA==', 'wrLDisOUw4HDiTTCnsKnwqHCg8O2w7XClg==', 'LmrDog4=', 'e8Ora13Dow==', 'wodfacKQw5o=', 'w74Sw5FreA==', 'wr94w6LDhMOgw4E=', 'wpkHw53DgsKKwrHDhcKbQ8Kpwp8=', 'dWPDons=', 'w7kbw7vDgMKb', 'w6DDkFFwwp/Cq3jCjUXDsW8=', 'TBIbBAfDtw==', 'wok5w7/ChDZV', 'wq3CvlzCtw==', 'wrHDsgzClQ==', 'IcORUmfDlcOPDsOSwr06fMKgBMKcTQ==', 'CgjDpSkw', 'w5oWw5vDhMKk', 'CcK4wpLDlEnCjnXClg==', 'w7zDhsKwTMOW', 'w7jDpFXCvcKm', 'wrTDlsOUw6rDtA==', 'w4bDn8KcXsOQVVHDkw==', 'bMOAwr3CsVzDksKTcAc=', 'wodAb8KKw4HCrDBoaA==', 'wrDDlMOUw5LDiQ==', '5Lm26ICj5Yu/6ZmGw5zDgxHCnMOywpZDM8KD', 'VQPChSVsbsOvWMODRMOlwqBAWMKz', 'U8K8TsOnHsKOWMOpb11CwpjDkcOJZTTChAbCixvDtcO0wplFwoZdwrswWcOiwq1sJsOnw50VHhfDgwXDoMKmDBTClsOkJ1RBKkc3YzQYw4zDuEUgY0xEX8KXwrU=', 'wpZYQsKjw7Y=', 'wqLDiMOdw4nDiQ==', 'wpLCqMO8wpPCiQ==', 'w54Aw5bDqsKD', 'K23DsRErcg==', 'eETDt1Nj', 'w7XDhsOhwpfCrg==', 'LBMPdFk=', 'woXDmQ3Cu8Kl', 'eGrDrmxAdA==', 'bcKBwpPDmz3Clw==', 'KmzDghcL', 'w6vDu8K7MQY=', 'wr4+w6fCph0=', 'WsKSWMO7EQ==', 'WMKNwp7Dojg=', 'wosyw6rCnxhP', 'w7LDhcK8FTI=', 'wqDCuVPCoFbCgcOgbm3Dkw==', 'wq4Hw6HCoTDDlg==', 'TgxLwqPDtg==', 'wqXCoVfClmY=', 'wptsw7vDj8OB', 'wqVow4bDt8O5', 'QcOma8O2w4U=', 'D8Ohwo/DvjRK', 'wpZLX8Kyw5o=', 'NcKjDgPDjw==', 'E8K1RcO1w4U1', 'XA8YGy3DrMKqw49/w5A=', 'woctw4bChj0=', 'CMKXw6jDoA7Dmi1Ow4xUGMK4YMKwacO4SMKKc3ldwrQDw4RG']; (function(_0x5bc68b, _0x259158) { 5 | var _0x102152 = function(_0x1797a6) { 6 | while (--_0x1797a6) { 7 | _0x5bc68b['push'](_0x5bc68b['shift']()); 8 | } 9 | }; 10 | _0x102152(++_0x259158); 11 | } (__0x3fb5e, 0x123)); 12 | var _0x56ae = function(_0xca96c7, _0x241ea9) { 13 | _0xca96c7 = _0xca96c7 - 0x0; 14 | var _0x57cca1 = __0x3fb5e[_0xca96c7]; 15 | if (_0x56ae['initialized'] === undefined) { (function() { 16 | var _0x228394 = window 17 | var _0x356c10 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; 18 | _0x228394['atob'] || (_0x228394['atob'] = function(_0x16460d) { 19 | var _0x4e207e = String(_0x16460d)['replace'](/=+$/, ''); 20 | for (var _0x15f638 = 0x0, 21 | _0x2abf93, _0x3df9f8, _0x479e2a = 0x0, 22 | _0x411a0f = ''; _0x3df9f8 = _0x4e207e['charAt'](_0x479e2a++);~_0x3df9f8 && (_0x2abf93 = _0x15f638 % 0x4 ? _0x2abf93 * 0x40 + _0x3df9f8: _0x3df9f8, _0x15f638++%0x4) ? _0x411a0f += String['fromCharCode'](0xff & _0x2abf93 >> ( - 0x2 * _0x15f638 & 0x6)) : 0x0) { 23 | _0x3df9f8 = _0x356c10['indexOf'](_0x3df9f8); 24 | } 25 | return _0x411a0f; 26 | }); 27 | } ()); 28 | var _0x172d34 = function(_0xa28d48, _0x346449) { 29 | var _0x55c23f = [], 30 | _0x3809ab = 0x0, 31 | _0x5298ee, 32 | _0x3c825f = '', 33 | _0x8b8e9a = ''; 34 | _0xa28d48 = window.atob(_0xa28d48); 35 | for (var _0xee1bef = 0x0, 36 | _0x3023b5 = _0xa28d48['length']; _0xee1bef < _0x3023b5; _0xee1bef++) { 37 | _0x8b8e9a += '%' + ('00' + _0xa28d48['charCodeAt'](_0xee1bef)['toString'](0x10))['slice']( - 0x2); 38 | } 39 | _0xa28d48 = decodeURIComponent(_0x8b8e9a); 40 | for (var _0x308939 = 0x0; _0x308939 < 0x100; _0x308939++) { 41 | _0x55c23f[_0x308939] = _0x308939; 42 | } 43 | for (_0x308939 = 0x0; _0x308939 < 0x100; _0x308939++) { 44 | _0x3809ab = (_0x3809ab + _0x55c23f[_0x308939] + _0x346449['charCodeAt'](_0x308939 % _0x346449['length'])) % 0x100; 45 | _0x5298ee = _0x55c23f[_0x308939]; 46 | _0x55c23f[_0x308939] = _0x55c23f[_0x3809ab]; 47 | _0x55c23f[_0x3809ab] = _0x5298ee; 48 | } 49 | _0x308939 = 0x0; 50 | _0x3809ab = 0x0; 51 | for (var _0x66c563 = 0x0; _0x66c563 < _0xa28d48['length']; _0x66c563++) { 52 | _0x308939 = (_0x308939 + 0x1) % 0x100; 53 | _0x3809ab = (_0x3809ab + _0x55c23f[_0x308939]) % 0x100; 54 | _0x5298ee = _0x55c23f[_0x308939]; 55 | _0x55c23f[_0x308939] = _0x55c23f[_0x3809ab]; 56 | _0x55c23f[_0x3809ab] = _0x5298ee; 57 | _0x3c825f += String['fromCharCode'](_0xa28d48['charCodeAt'](_0x66c563) ^ _0x55c23f[(_0x55c23f[_0x308939] + _0x55c23f[_0x3809ab]) % 0x100]); 58 | } 59 | return _0x3c825f; 60 | }; 61 | _0x56ae['rc4'] = _0x172d34; 62 | _0x56ae['data'] = {}; 63 | _0x56ae['initialized'] = !![]; 64 | } 65 | var _0x190c72 = _0x56ae['data'][_0xca96c7]; 66 | if (_0x190c72 === undefined) { 67 | if (_0x56ae['once'] === undefined) { 68 | _0x56ae['once'] = !![]; 69 | } 70 | _0x57cca1 = _0x56ae['rc4'](_0x57cca1, _0x241ea9); 71 | _0x56ae['data'][_0xca96c7] = _0x57cca1; 72 | } else { 73 | _0x57cca1 = _0x190c72; 74 | } 75 | return _0x57cca1; 76 | }; 77 | 78 | function change(s) { 79 | return '"' + eval(s) + '"' 80 | } 81 | console.log(_0x56ae('0x0', 'jo5I')) 82 | -------------------------------------------------------------------------------- /03-百变IP(eval混淆)/bbIP.js: -------------------------------------------------------------------------------- 1 | var $ = {}; 2 | (function($) { 3 | var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" 4 | , a256 = '' 5 | , r64 = [256] 6 | , r256 = [256] 7 | , i = 0; 8 | var UTF8 = { 9 | encode: function(strUni) { 10 | var strUtf = strUni.replace(/[\u0080-\u07ff]/g, function(c) { 11 | var cc = c.charCodeAt(0); 12 | return String.fromCharCode(0xc0 | cc >> 6, 0x80 | cc & 0x3f); 13 | }).replace(/[\u0800-\uffff]/g, function(c) { 14 | var cc = c.charCodeAt(0); 15 | return String.fromCharCode(0xe0 | cc >> 12, 0x80 | cc >> 6 & 0x3F, 0x80 | cc & 0x3f); 16 | }); 17 | return strUtf; 18 | }, 19 | decode: function(strUtf) { 20 | var strUni = strUtf.replace(/[\u00e0-\u00ef][\u0080-\u00bf][\u0080-\u00bf]/g, function(c) { 21 | var cc = ((c.charCodeAt(0) & 0x0f) << 12) | ((c.charCodeAt(1) & 0x3f) << 6) | (c.charCodeAt(2) & 0x3f); 22 | return String.fromCharCode(cc); 23 | }).replace(/[\u00c0-\u00df][\u0080-\u00bf]/g, function(c) { 24 | var cc = (c.charCodeAt(0) & 0x1f) << 6 | c.charCodeAt(1) & 0x3f; 25 | return String.fromCharCode(cc); 26 | }); 27 | return strUni; 28 | } 29 | }; 30 | while (i < 256) { 31 | var c = String.fromCharCode(i); 32 | a256 += c; 33 | r256[i] = i; 34 | r64[i] = b64.indexOf(c); 35 | ++i; 36 | } 37 | function code(s, discard, alpha, beta, w1, w2) { 38 | s = String(s); 39 | var buffer = 0 40 | , i = 0 41 | , length = s.length 42 | , result = '' 43 | , bitsInBuffer = 0; 44 | while (i < length) { 45 | var c = s.charCodeAt(i); 46 | c = c < 256 ? alpha[c] : -1; 47 | buffer = (buffer << w1) + c; 48 | bitsInBuffer += w1; 49 | while (bitsInBuffer >= w2) { 50 | bitsInBuffer -= w2; 51 | var tmp = buffer >> bitsInBuffer; 52 | result += beta.charAt(tmp); 53 | buffer ^= tmp << bitsInBuffer; 54 | } 55 | ++i; 56 | } 57 | if (!discard && bitsInBuffer > 0) 58 | result += beta.charAt(buffer << (w2 - bitsInBuffer)); 59 | return result; 60 | } 61 | var Plugin = $.base64 = function(dir, input, encode) { 62 | return input ? Plugin[dir](input, encode) : dir ? null : this; 63 | } 64 | ; 65 | Plugin.btoa = Plugin.encode = function(plain, utf8encode) { 66 | plain = Plugin.raw === false || Plugin.utf8encode || utf8encode ? UTF8.encode(plain) : plain; 67 | plain = code(plain, false, r256, b64, 8, 6); 68 | return plain + '===='.slice((plain.length % 4) || 4); 69 | } 70 | ; 71 | Plugin.atob = Plugin.decode = function(coded, utf8decode) { 72 | coded = String(coded).split('='); 73 | var i = coded.length; 74 | do { 75 | --i; 76 | coded[i] = code(coded[i], true, r64, a256, 6, 8); 77 | } while (i > 0);coded = coded.join(''); 78 | return Plugin.raw === false || Plugin.utf8decode || utf8decode ? UTF8.decode(coded) : coded; 79 | } 80 | ; 81 | }($)); 82 | function r3(str) { 83 | var newarr = []; 84 | for (var i = 0; i < str.length; i++) { 85 | if (str.charCodeAt(i) < 65 || str.charCodeAt(i) > 90) { 86 | newarr.push(str.charAt(i)) 87 | } else if (str.charCodeAt(i) > 77) { 88 | newarr.push(String.fromCharCode(str.charCodeAt(i) - 13)) 89 | } else { 90 | newarr.push(String.fromCharCode(str.charCodeAt(i) + 13)) 91 | } 92 | } 93 | return newarr.join("") 94 | } 95 | function rot(t, u, v) { 96 | return String.fromCharCode(((t - u + v) % (v * 2)) + u) 97 | } 98 | function r13(s) { 99 | var b = [], 100 | c, 101 | i = s.length, 102 | a = 'a'.charCodeAt(), 103 | z = a + 26, 104 | A = 'A'.charCodeAt(), 105 | Z = A + 26; 106 | while (i--) { 107 | c = s.charCodeAt(i); 108 | if (c >= a && c < z) { 109 | b[i] = rot(c, a, 13) 110 | } else if (c >= A && c < Z) { 111 | b[i] = rot(c, A, 13) 112 | } else { 113 | b[i] = s.charAt(i) 114 | } 115 | } 116 | return b.join('') 117 | } 118 | function rot5(s) { 119 | var b = [], 120 | c, 121 | i = s.length, 122 | a = '0'.charCodeAt(), 123 | z = a + 10; 124 | while (i--) { 125 | c = s.charCodeAt(i); 126 | if (c >= a && c < z) { 127 | b[i] = rot(c, a, 5) 128 | } else { 129 | b[i] = s.charAt(i) 130 | } 131 | } 132 | return b.join('') 133 | } 134 | function rot135(s) { 135 | return rot13(rot5(s)) 136 | } 137 | function ddip(e0) { 138 | e1 = r13(e0.toString()); 139 | e2 = $.base64.decode(e1); 140 | e3 = e2.toString().substr(10); 141 | l3 = e3.length; 142 | e4 = e3.substr(0, l3 - 10); 143 | return e4 144 | } 145 | console.log(ddip("ZGH3ZQxmAwx3ZGR2AF4lZwHhZmLhAwxkAGp4BQNjAGN0")) 146 | -------------------------------------------------------------------------------- /20-抖音web/douyin.py: -------------------------------------------------------------------------------- 1 | import requests, re, execjs, sys 2 | from lxml import etree 3 | 4 | 5 | douyin_font = { 6 | "  ": "0", "  ": "0", "  ": "0", 7 | "  ": "1", "  ": "1", "  ": "1", 8 | "  ": "2", "  ": "2", "  ": "2", 9 | "  ": "3", "  ": "3", "  ": "3", 10 | "  ": "4", "  ": "4", "  ": "4", 11 | "  ": "5", "  ": "5", "  ": "5", 12 | "  ": "6", "  ": "6", "  ": "6", 13 | "  ": "7", "  ": "7", "  ": "7", 14 | "  ": "8", "  ": "8", "  ": "8", 15 | "  ": "9", "  ": "9", "  ": "9", 16 | } 17 | UA = 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4014.0 Safari/537.36' 18 | headers = { 19 | 'User-Agent': UA, 20 | } 21 | 22 | 23 | def num_replace(text): 24 | # 主页字体反爬 25 | for key, value in douyin_font.items(): 26 | if key in text: 27 | text = text.replace(key, value) 28 | return text 29 | 30 | 31 | def get_index(uid): 32 | # 获取主页源码,uid如 102064772608 33 | url = "https://www.amemv.com/share/user/%s" % uid 34 | # url = "https://www.iesdouyin.com/share/user/%s" % uid 35 | try: 36 | res = requests.get(url, headers=headers) 37 | if res.status_code == 200 and "dytk: " in res.text: 38 | html = num_replace(res.text) 39 | return html 40 | else: 41 | print("获取主页失败:", res.status_code) 42 | if res.status_code == 200: 43 | print("未请求到主页源码,请重新发起请求!") 44 | sys.exit() 45 | return None 46 | except Exception as e: 47 | print("获取主页失败:", e) 48 | sys.exit() 49 | return None 50 | 51 | 52 | def parse_index(res): 53 | # 解析主页,获取dytk、tac、昵称、抖音ID、认证信息、签名、关注数、粉丝数、赞数、作品数、喜欢数 54 | dytk = re.findall("dytk: '(.*?)'", res, re.S)[0] 55 | tac = re.findall("", res, re.S)[0] 56 | html = etree.HTML(res) 57 | nickname = html.xpath('//p[@class="nickname"]/text()')[0] 58 | douyin_ID = "".join(html.xpath('//p[@class="shortid"]/i/text()')) 59 | verify_info = html.xpath('//div[@class="verify-info"]//text()') 60 | verify_info = verify_info[0].strip() if verify_info else "无" 61 | signature = html.xpath('//p[@class="signature"]/text()')[0] 62 | focus_num = "".join(html.xpath('//span[@class="focus block"]//i/text()')) 63 | follower_num = "".join(html.xpath('//span[@class="follower block"]/span[1]//text()')).strip() 64 | liked_num = "".join(html.xpath('//span[@class="liked-num block"]/span[1]//text()')).strip() 65 | user_tab = "".join(html.xpath('//div[@class="user-tab active tab get-list"]/span/i/text()')) 66 | like_tab = "".join(html.xpath('//div[@class="like-tab tab get-list"]/span/i/text()')) 67 | return { 68 | "nickname": nickname, 69 | "douyin_ID": douyin_ID, 70 | "verify_info": verify_info, 71 | "signature": signature, 72 | "focus_num": focus_num, 73 | "follower_num": follower_num, 74 | "liked_num": liked_num, 75 | "user_tab": user_tab, 76 | "like_tab": like_tab, 77 | }, tac, dytk 78 | 79 | 80 | def get_sign(uid, tac, ua): 81 | # 获取_signature 82 | result = ctx.call("get_sign", uid, tac, ua) 83 | print("\n_signature:", result) 84 | return result 85 | 86 | 87 | def get_aweme_list(uid, dytk, _signature): 88 | # 发起ajax请求,获取数据 89 | params = { 90 | 'user_id': uid, 91 | 'sec_uid': '', 92 | 'count': "21", 93 | 'max_cursor': "0", 94 | 'aid': "1128", 95 | '_signature': _signature, 96 | 'dytk': dytk 97 | } 98 | try: 99 | response = requests.get('https://www.iesdouyin.com/web/api/v2/aweme/post/', headers=headers, params=params) 100 | if response.json()["aweme_list"]: 101 | # print(response.json()) 102 | return response.json() 103 | else: 104 | print(response.json()) 105 | return False 106 | except Exception as e: 107 | print(e) 108 | return False 109 | 110 | 111 | def download(url, name): 112 | # 下载视频 113 | header = { 114 | "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13C75 Safari/601.1" 115 | } 116 | # url = "https://aweme.snssdk.com/aweme/v1/play/?video_id=v0200fe30000bj2iv7hum7li82bk34pg&line=0&ratio=540p&media_type=4&vr_type=0&improve_bitrate=0&is_play_url=1" 117 | try: 118 | res = requests.get(url, headers=header) 119 | if res.status_code == 200: 120 | with open(name + ".mp4", "wb") as f: 121 | f.write(res.content) 122 | print("下载完成!") 123 | else: 124 | print("下载失败:", res.status_code) 125 | except Exception as e: 126 | print("下载失败:", e) 127 | 128 | 129 | def main(uid): 130 | # 1. 获取主页源码 131 | index = get_index(uid) 132 | # 2. 解析出主页信息及tac、dytk关键字段 133 | info, tac, dytk = parse_index(index) 134 | print("主页信息:", info) 135 | print("\ntac:", tac) 136 | print("\ndytk:", dytk) 137 | # 3. 获取_signature 138 | _signature = get_sign(uid, tac, UA) 139 | # 4. 携带_signature发起ajax请求,获取数据 140 | aweme_list = get_aweme_list(uid, dytk, _signature) 141 | if aweme_list: 142 | # 5. 提取第一个无水印视频下载链接 143 | play_addr = aweme_list['aweme_list'][0]['video']['play_addr']['url_list'][0] 144 | # 6. 下载视频 145 | download(play_addr, "抖音短视频") 146 | 147 | 148 | 149 | 150 | if __name__ == "__main__": 151 | with open("douyin.js", "r", encoding="utf-8") as f: 152 | ctx = execjs.compile(f.read()) 153 | 154 | uid = "102064772608" 155 | main(uid) 156 | 157 | -------------------------------------------------------------------------------- /01-安徽招投标(sojson)/ahtba.py: -------------------------------------------------------------------------------- 1 | # http://www.ahtba.org.cn/ 安徽省招标投标信息网 2 | 3 | import requests, re, execjs 4 | 5 | 6 | s = requests.Session() 7 | headers = { 8 | 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4018.0 Safari/537.36', 9 | } 10 | 11 | 12 | def get_eval(): 13 | # 第一次访问网站,获取eval函数内的字符 14 | response = s.get('http://www.ahtba.org.cn/', headers=headers) 15 | response.encoding = response.apparent_encoding 16 | # print(response.text) 17 | pattern = re.compile(r"eval\((functi.*?\))\);", re.S) 18 | result = re.findall(pattern, response.text) 19 | result = result[0] if result else "" 20 | # print(result) 21 | return result 22 | 23 | 24 | def get_url(result): 25 | # 将拿到的字符传入js解密,获取加密后的链接 26 | js = """ 27 | eval(%s); 28 | function _0x412a72(_0x2a28c0) { 29 | var _0x4257c9 = { 30 | 'mGirf': function _0x2eb028(_0x5ab0bc, _0x5505f4) { 31 | return _0x5ab0bc < _0x5505f4; 32 | }, 33 | 'hOkXt': function _0x16449b(_0x22286c, _0x41c8cd) { 34 | return _0x22286c & _0x41c8cd; 35 | }, 36 | 'RJeYY': function _0x24beb6(_0x59303b, _0x576d3b) { 37 | return _0x59303b == _0x576d3b; 38 | }, 39 | 'cFxMb': function _0x45b03c(_0xadce3d, _0x5416a9) { 40 | return _0xadce3d >> _0x5416a9; 41 | }, 42 | 'spzgJ': function _0x3c313d(_0x19fd11, _0xcacabb) { 43 | return _0x19fd11 << _0xcacabb; 44 | }, 45 | 'VdlKD': function _0x2427d5(_0x23b25b, _0x23b39e) { 46 | return _0x23b25b & _0x23b39e; 47 | }, 48 | 'VDeWo': function _0x1ef1b0(_0x476993, _0x40dd2a) { 49 | return _0x476993 == _0x40dd2a; 50 | }, 51 | 'gHLRp': function _0x16afb3(_0x4bdebb, _0x1065a7) { 52 | return _0x4bdebb >> _0x1065a7; 53 | }, 54 | 'biRta': function _0x301047(_0x2ada60, _0x1c4232) { 55 | return _0x2ada60 | _0x1c4232; 56 | }, 57 | 'oKMpY': function _0x1d0b02(_0x547e37, _0x500868) { 58 | return _0x547e37 << _0x500868; 59 | }, 60 | 'HlUXJ': function _0x21902c(_0x16ae1a, _0x466bbf) { 61 | return _0x16ae1a >> _0x466bbf; 62 | }, 63 | 'vuJTm': function _0x2fea95(_0x34f7b5, _0x59e46f) { 64 | return _0x34f7b5 << _0x59e46f; 65 | }, 66 | 'lHuwG': function _0x1339d0(_0x3c775a, _0x3450ae) { 67 | return _0x3c775a >> _0x3450ae; 68 | }, 69 | 'fpeDs': function _0x52b661(_0x318fc3, _0x59aa7b) { 70 | return _0x318fc3 & _0x59aa7b; 71 | }, 72 | 'HqwlU': function _0x2144ca(_0x4799d4, _0x25b745) { 73 | return _0x4799d4 | _0x25b745; 74 | }, 75 | 'nPBKx': function _0x42b833(_0xe339b1, _0x5c500c) { 76 | return _0xe339b1 & _0x5c500c; 77 | }, 78 | 'ZRhVT': function _0xc9529d(_0x5ed560, _0x4383da) { 79 | return _0x5ed560 & _0x4383da; 80 | }, 81 | }; 82 | var _0x2097d8 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 83 | var _0x27d1f5, _0x4262d0, _0xc876d4; 84 | var _0x5526a7, _0x138cf5, _0x4093e6; 85 | _0xc876d4 = _0x2a28c0['length']; 86 | _0x4262d0 = 0x0; 87 | _0x27d1f5 = ''; 88 | while (_0x4257c9["mGirf"](_0x4262d0, _0xc876d4)) { 89 | _0x5526a7 = _0x4257c9["hOkXt"](_0x2a28c0['charCodeAt'](_0x4262d0++), 0xff); 90 | if (_0x4257c9['RJeYY'](_0x4262d0, _0xc876d4)) { 91 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9["cFxMb"](_0x5526a7, 0x2)); 92 | _0x27d1f5 += _0x2097d8['charAt'](_0x4257c9["spzgJ"](_0x4257c9["VdlKD"](_0x5526a7, 0x3), 0x4)); 93 | _0x27d1f5 += '=='; 94 | break; 95 | } 96 | _0x138cf5 = _0x2a28c0['charCodeAt'](_0x4262d0++); 97 | if (_0x4257c9["VDeWo"](_0x4262d0, _0xc876d4)) { 98 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9['gHLRp'](_0x5526a7, 0x2)); 99 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9["biRta"](_0x4257c9["oKMpY"](_0x4257c9["VdlKD"](_0x5526a7, 0x3), 0x4), _0x4257c9["HlUXJ"](_0x4257c9["VdlKD"](_0x138cf5, 0xf0), 0x4))); 100 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9["vuJTm"](_0x4257c9['VdlKD'](_0x138cf5, 0xf), 0x2)); 101 | _0x27d1f5 += '='; 102 | break; 103 | } 104 | _0x4093e6 = _0x2a28c0["charCodeAt"](_0x4262d0++); 105 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9['lHuwG'](_0x5526a7, 0x2)); 106 | _0x27d1f5 += _0x2097d8['charAt'](_0x4257c9["biRta"](_0x4257c9['VdlKD'](_0x5526a7, 0x3) << 0x4, _0x4257c9["fpeDs"](_0x138cf5, 0xf0) >> 0x4)); 107 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9["HqwlU"](_0x4257c9["vuJTm"](_0x4257c9['nPBKx'](_0x138cf5, 0xf), 0x2), _0x4257c9["ZRhVT"](_0x4093e6, 0xc0) >> 0x6)); 108 | _0x27d1f5 += _0x2097d8["charAt"](_0x4257c9['ZRhVT'](_0x4093e6, 0x3f)); 109 | } 110 | return _0x27d1f5; 111 | }; 112 | function _0x344cd4() { 113 | var _0x3c9135 = 0x0; 114 | var _0x43beea = 0x0; 115 | for (_0x43beea = 0x0; _0x43beea < wzwsquestion["length"]; _0x43beea++) { 116 | _0x3c9135 += wzwsquestion["charCodeAt"](_0x43beea); 117 | } 118 | _0x3c9135 *= wzwsfactor; 119 | _0x3c9135 += 0x1b207; 120 | return "WZWS_CONFIRM_PREFIX_LABEL" + _0x3c9135; 121 | }; 122 | function get_url() { 123 | var _0xb14971 = _0x344cd4(); 124 | var _0x10ace8 = _0x412a72(_0xb14971["toString"]()); 125 | var _0x35ace3 = dynamicurl + "?wzwschallenge=" + _0x10ace8; 126 | return _0x35ace3; 127 | }; 128 | """ % result 129 | ctx = execjs.compile(js) 130 | try: 131 | url = ctx.call("get_url") 132 | # print("http://www.ahtba.org.cn" + url) 133 | return "http://www.ahtba.org.cn" + url 134 | except Exception as e: 135 | print("获取加密链接失败!", e) 136 | print(result) 137 | return None 138 | 139 | 140 | def get_page(url): 141 | # 访问加密后的链接,获取网页源代码 142 | if url: 143 | response = s.get(url, headers=headers) 144 | print(response.text) 145 | return response.text 146 | 147 | 148 | if __name__ == "__main__": 149 | js_string = get_eval() 150 | url = get_url(js_string) 151 | get_page(url) 152 | 153 | 154 | -------------------------------------------------------------------------------- /10-新浪微博登录(RSA)/sinalogin.py: -------------------------------------------------------------------------------- 1 | import requests, base64, time, execjs, json, re 2 | 3 | 4 | class SinaLogin(): 5 | # 新浪微博登录 6 | def __init__(self): 7 | self.s = requests.Session() 8 | self.headers = { 9 | 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36', 10 | } 11 | with open("sinalogin.js", "r", encoding="utf-8") as f: 12 | self.ctx = execjs.compile(f.read()) 13 | self.username = input("请输入账号:") 14 | self.password = input("请输入密码:") 15 | 16 | def main(self): 17 | # 主要运行函数,即运行逻辑 18 | me = self.prelogin() 19 | if me: 20 | token = self.token_or_res(me) 21 | if token: 22 | if "crossdomain2.php" not in token: 23 | mobile = self.encrypt_mobile(token) 24 | self.sendcode(token, mobile) 25 | redirect_url = self.confirm(token, mobile) 26 | arrURL = self.redirect(redirect_url=redirect_url) 27 | else: 28 | arrURL = self.redirect(res=token) 29 | self.login(arrURL) 30 | 31 | def prelogin(self): 32 | # 预登陆,用于获取登录参数nonce、rsakv等 33 | params = ( 34 | ('entry', 'weibo'), 35 | ('su', base64.b64encode(self.username.encode()).decode()), 36 | ('rsakt', 'mod'), 37 | ('client', 'ssologin.js(v1.4.19)'), 38 | ('_', int(time.time()*1000)), 39 | ) 40 | url = 'https://login.sina.com.cn/sso/prelogin.php' 41 | try: 42 | response = self.s.get(url, headers=self.headers, params=params) 43 | if response.status_code == 200: 44 | print("me:", response.json()) 45 | return response.json() 46 | else: 47 | print("Prelogin failed:", response.status_code) 48 | return 0 49 | except Exception as e: 50 | print("Prelogin failed:", e) 51 | return 0 52 | 53 | def encrypt(self, me): 54 | # 获取加密密码 55 | me = json.dumps(me) 56 | result = self.ctx.call("encrypt", me, self.password) 57 | return result 58 | 59 | def token_or_res(self, me): 60 | # POST提交登录,若微博开启双重验证,需要先获取手机验证码。没有开启则直接跳转到新浪通行证 61 | params = ( 62 | ('client', 'ssologin.js(v1.4.19)'), 63 | ) 64 | data = { 65 | 'entry': 'weibo', 66 | 'gateway': '1', 67 | 'from': '', 68 | 'savestate': '0', 69 | 'qrcode_flag': 'false', 70 | 'useticket': '1', 71 | 'pagerefer': '', 72 | 'vsnf': '1', 73 | 'su': base64.b64encode(self.username.encode()).decode(), 74 | 'service': 'miniblog', 75 | 'servertime': me["servertime"], 76 | 'nonce': me["nonce"], 77 | 'pwencode': 'rsa2', 78 | 'rsakv': me["rsakv"], 79 | 'sp': self.encrypt(me), 80 | 'sr': '1536*864', 81 | 'encoding': 'UTF-8', 82 | 'prelt': '39', 83 | 'url': 'https://www.weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack', 84 | 'returntype': 'META' 85 | } 86 | url = 'https://login.sina.com.cn/sso/login.php' 87 | response = self.s.post(url, headers=self.headers, params=params, data=data) 88 | response.encoding = response.apparent_encoding 89 | if "crossdomain2.php" in response.text: 90 | # 没有开启双重验证,无需手机验证码,直接获取通行证 91 | return response.text 92 | elif "retcode=101" in response.text: 93 | # 用户名或密码错误 94 | print("用户名或密码错误!") 95 | return None 96 | else: 97 | # 开启双重验证,需要手机验证码,获取token值 98 | pattern = re.compile(r'token%3D(.*?)"', re.S) 99 | result = re.findall(pattern, response.text) 100 | result = result[-1] if result else "" 101 | print("token:", result) 102 | return result 103 | 104 | def encrypt_mobile(self, token): 105 | # 用token值获取encrypt_mobile值,用于发送和确认短信验证码 106 | url = "https://login.sina.com.cn/protection/index?token={}&callback_url=https%3A%2F%2Fweibo.com".format(token) 107 | res = self.s.get(url, headers=self.headers) 108 | pattern = re.compile(r'name="encrypt_mobile".*?value="(.*?)"', re.S) 109 | result = re.findall(pattern, res.text) 110 | result = result[0] if result else "" 111 | print("encrypt_mobile:", result) 112 | return result 113 | 114 | def sendcode(self, token, encrypt_mobile): 115 | # 发送短信验证码 116 | url = "https://login.sina.com.cn/protection/mobile/sendcode?token=" + token 117 | data = {"encrypt_mobile": encrypt_mobile} 118 | res = self.s.post(url, headers=self.headers, data=data) 119 | print("sendcode:", res.json()) 120 | if res.json()["msg"] == "succ": 121 | print("已发送短信验证码,请查看后在下方输入:") 122 | else: 123 | print("未成功发送短信验证码,请参考上方错误代码!") 124 | 125 | def confirm(self, token, encrypt_mobile): 126 | # 确认短信验证码 127 | while True: 128 | code = input() 129 | url = "https://login.sina.com.cn/protection/mobile/confirm?token=" + token 130 | data = { 131 | "encrypt_mobile": encrypt_mobile, 132 | "code": code 133 | } 134 | res = self.s.post(url, headers=self.headers, data=data) 135 | print("confirm:", res.json()) 136 | if "验证码错误或已过期" in res.json()["msg"]: 137 | print("验证码错误或已过期,请在下方重新输入:") 138 | continue 139 | else: 140 | redirect_url = res.json()["data"]["redirect_url"] 141 | return redirect_url 142 | 143 | def redirect(self, redirect_url=None, res=None): 144 | # 请求通行证,获取跳转链接 145 | if res == None: 146 | res = self.s.get(redirect_url, headers=self.headers).text 147 | pattern = re.compile(r'location.replace\("(.*?)"\)', re.S) 148 | result = re.findall(pattern, res) 149 | if result: 150 | print("新浪通行证:", result[0]) 151 | res = self.s.get(result[0], headers=self.headers) 152 | pattern = re.compile(r'"arrURL":\["(.*?)"', re.S) 153 | arrURL = re.findall(pattern, res.text) 154 | arrURL = arrURL[0] if arrURL else "" 155 | print("arrURL:", arrURL) 156 | return arrURL 157 | 158 | def login(self, arrURL): 159 | # 请求跳转链接,获取uniqueid,并请求主页进行登陆 160 | arrURL = arrURL.replace("\\", "") 161 | res = self.s.get(arrURL, headers=self.headers) 162 | data = json.loads(res.text.strip()[1:-2]) 163 | if data["result"] == True: 164 | uniqueid = data["userinfo"]["uniqueid"] 165 | print("uniqueid:", uniqueid) 166 | url = "https://www.weibo.com/u/{}/home?wvr=5&sudaref=login.sina.com.cn".format(uniqueid) 167 | res = self.s.get(url, headers=self.headers) 168 | print(res.text) 169 | print("登录成功!") 170 | else: 171 | print("获取uniqueid失败!") 172 | 173 | 174 | log = SinaLogin() 175 | log.main() 176 | -------------------------------------------------------------------------------- /04-安徽省雨水情JS逆向/ysq.js: -------------------------------------------------------------------------------- 1 | var WaterSecurity = function() { 2 | this.init() 3 | }; 4 | WaterSecurity.prototype = { 5 | version: "2.1", 6 | init: function() { 7 | String.prototype.gblen = function() { 8 | var len = 0; 9 | for (var i = 0; i < this.length; i++) 10 | if (this.charCodeAt(i) > 127 || this.charCodeAt(i) == 94) 11 | len += 2; 12 | else 13 | len++; 14 | return len 15 | } 16 | }, 17 | encode: function(data) { 18 | this.print(data); 19 | data += ""; 20 | if (data == "") 21 | return ""; 22 | data = encodeURI(data).replace(/\+/g, "%2B"); 23 | var length = data.gblen(); 24 | if (length % 2 != 0) 25 | data += "*"; 26 | this.print(data); 27 | data = this.parityTransposition(data); 28 | this.print(data); 29 | var result = this.version + this.utf16to8(this.base64encode(data)); 30 | this.print(result); 31 | return result 32 | }, 33 | print: function(data) {}, 34 | parityTransposition: function(data) { 35 | var newData = []; 36 | for (var i = 0; i < data.length; i += 2) { 37 | newData.push(data[i + 1]); 38 | newData.push(data[i]) 39 | } 40 | newData = newData.join(""); 41 | return newData 42 | }, 43 | decode: function(data) { 44 | data = data.substring(3, data.length); 45 | var endTag = data.substring(data.length - 4); 46 | var tagsStr = data.substring(data.indexOf(endTag)); 47 | var tags = new Array; 48 | tagsStr = tagsStr.substring(4, tagsStr.length - 4); 49 | var content = new Array; 50 | for (var i = 0; 4 * i < tagsStr.length; i++) { 51 | var tag = tagsStr.substr(i * 4, 4); 52 | tags[i] = tag; 53 | content[tag] = null 54 | } 55 | var positions = this.getTagsPosition(data, tags); 56 | var index = 0; 57 | for (var i = 0; i < positions.length; i++) { 58 | var msg = data.substring(index, positions[i]); 59 | var tag = data.substr(positions[i], 4); 60 | content[tag] = msg; 61 | index = positions[i] + 4 62 | } 63 | var result = ""; 64 | for (var i = 0; i < tags.length; i++) 65 | result += content[tags[i]]; 66 | result = this.utf8to16(this.base64decode(result)); 67 | return result 68 | }, 69 | getTagsPosition: function(data, tags) { 70 | var positions = new Array; 71 | for (i = 0; i < tags.length; i++) 72 | positions[i] = data.indexOf(tags[i]); 73 | return positions.sort(function(a, b) { 74 | return a > b ? 1 : -1 75 | }) 76 | }, 77 | base64EncodeChars: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 78 | base64DecodeChars: new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1), 79 | base64encode: function(str) { 80 | var out, i, len; 81 | var c1, c2, c3; 82 | len = str.length; 83 | i = 0; 84 | out = ""; 85 | while (i < len) { 86 | c1 = str.charCodeAt(i++) & 255; 87 | if (i == len) { 88 | out += this.base64EncodeChars.charAt(c1 >> 2); 89 | out += this.base64EncodeChars.charAt((c1 & 3) << 4); 90 | out += "\x3d\x3d"; 91 | break 92 | } 93 | c2 = str.charCodeAt(i++); 94 | if (i == len) { 95 | out += this.base64EncodeChars.charAt(c1 >> 2); 96 | out += this.base64EncodeChars.charAt((c1 & 3) << 4 | (c2 & 240) >> 4); 97 | out += this.base64EncodeChars.charAt((c2 & 15) << 2); 98 | out += "\x3d"; 99 | break 100 | } 101 | c3 = str.charCodeAt(i++); 102 | out += this.base64EncodeChars.charAt(c1 >> 2); 103 | out += this.base64EncodeChars.charAt((c1 & 3) << 4 | (c2 & 240) >> 4); 104 | out += this.base64EncodeChars.charAt((c2 & 15) << 2 | (c3 & 192) >> 6); 105 | out += this.base64EncodeChars.charAt(c3 & 63) 106 | } 107 | return out 108 | }, 109 | base64decode: function(str) { 110 | var c1, c2, c3, c4; 111 | var i, len, out; 112 | len = str.length; 113 | i = 0; 114 | out = ""; 115 | while (i < len) { 116 | do 117 | c1 = this.base64DecodeChars[str.charCodeAt(i++) & 255]; 118 | while (i < len && c1 == -1);if (c1 == -1) 119 | break; 120 | do 121 | c2 = this.base64DecodeChars[str.charCodeAt(i++) & 255]; 122 | while (i < len && c2 == -1);if (c2 == -1) 123 | break; 124 | out += String.fromCharCode(c1 << 2 | (c2 & 48) >> 4); 125 | do { 126 | c3 = str.charCodeAt(i++) & 255; 127 | if (c3 == 61) 128 | return out; 129 | c3 = this.base64DecodeChars[c3] 130 | } while (i < len && c3 == -1);if (c3 == -1) 131 | break; 132 | out += String.fromCharCode((c2 & 15) << 4 | (c3 & 60) >> 2); 133 | do { 134 | c4 = str.charCodeAt(i++) & 255; 135 | if (c4 == 61) 136 | return out; 137 | c4 = this.base64DecodeChars[c4] 138 | } while (i < len && c4 == -1);if (c4 == -1) 139 | break; 140 | out += String.fromCharCode((c3 & 3) << 6 | c4) 141 | } 142 | return out 143 | }, 144 | utf16to8: function(str) { 145 | var out, i, len, c; 146 | out = ""; 147 | len = str.length; 148 | for (i = 0; i < len; i++) { 149 | c = str.charCodeAt(i); 150 | if (c >= 1 && c <= 127) 151 | out += str.charAt(i); 152 | else if (c > 2047) { 153 | out += String.fromCharCode(224 | c >> 12 & 15); 154 | out += String.fromCharCode(128 | c >> 6 & 63); 155 | out += String.fromCharCode(128 | c >> 0 & 63) 156 | } else { 157 | out += String.fromCharCode(192 | c >> 6 & 31); 158 | out += String.fromCharCode(128 | c >> 0 & 63) 159 | } 160 | } 161 | return out 162 | }, 163 | utf8to16: function(str) { 164 | var out, i, len, c; 165 | var char2, char3; 166 | out = ""; 167 | len = str.length; 168 | i = 0; 169 | while (i < len) { 170 | c = str.charCodeAt(i++); 171 | switch (c >> 4) { 172 | case 0: 173 | case 1: 174 | case 2: 175 | case 3: 176 | case 4: 177 | case 5: 178 | case 6: 179 | case 7: 180 | out += str.charAt(i - 1); 181 | break; 182 | case 12: 183 | case 13: 184 | char2 = str.charCodeAt(i++); 185 | out += String.fromCharCode((c & 31) << 6 | char2 & 63); 186 | break; 187 | case 14: 188 | char2 = str.charCodeAt(i++); 189 | char3 = str.charCodeAt(i++); 190 | out += String.fromCharCode((c & 15) << 12 | (char2 & 63) << 6 | (char3 & 63) << 0); 191 | break 192 | } 193 | } 194 | return out 195 | } 196 | }; 197 | var waterSecurity = new WaterSecurity; 198 | function waterEncode(data){ 199 | return waterSecurity.encode(data) 200 | } 201 | function resultDecode(data){ 202 | data = waterSecurity.decode(data); 203 | // data = JSON.parse(data); 204 | return data; 205 | } 206 | -------------------------------------------------------------------------------- /19-BOSS直聘/boss.js: -------------------------------------------------------------------------------- 1 | window = { 2 | document: { 3 | cookie: "", 4 | createElement: function(tag) { 5 | if (tag == "canvas") { 6 | return canvas 7 | } else if (tag == "caption") { 8 | return { 9 | tagName: "CAPTION" 10 | } 11 | } 12 | 13 | }, 14 | getElementById: function() { 15 | return false 16 | }, 17 | title: "" 18 | }, 19 | moveBy: function () {}, 20 | moveTo: function () {}, 21 | open: function(){}, 22 | dispatchEvent: function(){return true}, 23 | screen: { 24 | availHeight: 824, 25 | availWidth: 1536 26 | }, 27 | navigator: { 28 | cookieEnabled: true, 29 | language: "zh-CN", 30 | userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36", 31 | appVersion: "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" 32 | }, 33 | decodeURI: global.decodeURI, 34 | location: { 35 | hostname: "www.zhipin.com", 36 | href: "https://www.zhipin.com/" 37 | }, 38 | OfflineAudioContext: function () { 39 | this.createOscillator = function() { 40 | return { 41 | frequency: { 42 | setValueAtTime: function() {} 43 | }, 44 | connect: function (){}, 45 | start: function (){}, 46 | } 47 | }, 48 | this.createDynamicsCompressor = function() { 49 | return { 50 | threshold: { 51 | setValueAtTime: function () {}, 52 | }, 53 | setValueAtTime: function () {}, 54 | knee: { 55 | setValueAtTime: function () {}, 56 | }, 57 | ratio: { 58 | setValueAtTime: function () {}, 59 | }, 60 | reduction: { 61 | setValueAtTime: function () {}, 62 | }, 63 | attack: { 64 | setValueAtTime: function () {}, 65 | }, 66 | release: { 67 | setValueAtTime: function () {}, 68 | }, 69 | connect: function (){}, 70 | } 71 | }, 72 | this.startRendering = function (){} 73 | }, 74 | eval: global.eval, 75 | history: {length: 1}, 76 | outerHeight: 824, 77 | innerHeight: 150, 78 | outerWidth: 1536, 79 | innerWidth: 0, 80 | Math: global.Math, 81 | Date: global.Date, 82 | } 83 | window.open.toString = function (){return "function open() { [native code] }"} 84 | document = window.document 85 | navigator = window.navigator 86 | screen = window.screen 87 | canvas = { 88 | getContext: function getContext() { 89 | return CanvasRenderingContext2D 90 | }, 91 | toDataURL: function toDataURL() { 92 | // 实际为canvas画布填充了“"k54kk5cA4*"”字样后,转成的图片链接 93 | return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAACWCAYAAABkW7XSAAANT0lEQVR4Xu2be3BU5R2Gf2cDBAomRC4Bwi1WEEMJGIjAgBUqyowXQKp08IJFIUvGVqkzlcFiWy+tF1pbtSNsUnHEqqjcxgEpgqKC0ghYJQJauTjKRQyRBAwEcfd0zpJdNzcU2FmSlyf/hXP2nO993uWZ7/vOiWP8QAACEGgkBJxGMk6GGUcCbp65cbxco7mUU2B83xtNW3UPlAIbeYEnM3yEdTLU+ExDIICwGkILCR4DwkowcG4XNwIIK24oG8+FEFbj6YqRVieAsM7AbwTCOgNLF4mMsESKPJEYCOtEaHFuQyKAsBpSGwkaC8JKEGhuE3cCCCvuSBv+BRFWw++IEdZNAGGdgd8MhHUGli4SGWGJFHkiMRDWidDi3IZEAGE1pDYSNBaElSDQ3CbuBBBW3JE2/AsirIbfESNkD4vvQBUBhMVXobESYIbVWJs7hXEjrFOAx0dPKwGEdVrxn56bI6zTw527njqB74Q1qTDdfKE3zHWmWmHe8lqX9s/ua66z0szaRo+5zmwrzMuvdW5e4DZznZFW2XycPTOhwmr+HvuB4x3zzptcMMscd0rMR/aZ446wwJQPflD873Jtj46nvg/WNRYvd8g3zSqbTw5nEfhBWAIlnqERfriwvP/M3k+B/7HjsoqIzXXePWVhebJx3DnmOjfbPyfvPamOIhJy3HPqlbF34Zrj9v6teeWLZlYevq/jXmBms743/0kNMrEfQliJ5c3d4keglrB6nFv00M+Gz7ls566s95a+cvs0c5354VmUN9MxW+zPzzvsBu12x7FmkWG4jm0u6G/T7Ma5La15ZWHVv6fePPG21U2SK7u/MO/eT8vLOlwU+f3Zfz3YrKIi7arwTMl1LvZmY3Ue8y5UNbvJmzrh945rWdF7uvaNk2SPBmYVjI+ZgX1kId+wqNyOjceTzmPt2306YdCgly7skPHJa8HmdteTve2rKMZ6xh0+79HADWZ29/Dhc6b16FHUN9jC7qn22fh1kbArIayEoeZGcSZQp7AGD54/7p13rh26devAa8PLw8h/aCeUk93ntfO8MWzceGnt5WBkFmZm3bu9P37EiIK9vibBL2KFtWfvuTe++caEXYe+6nB17HLRE1atY5MLRpov9MeUs/YN6tv3Ve+e+8sPtBseXQ5+39Lz2KzpCQv5xl511V/v/boidVxm9/dXNW165LlArs2PsjzOuL/9tlnPMaMfPGvX7vOHdOv2wdLmzQ61NMfWBwbYI3HuImGXQ1gJQ82N4kyglrC6dflwTq9eq2eUHUhfUHTL8pv979lPj36TfOfHHw8a/Pbb192T5/dnVFakFM995i/jzeyz6B5WzPItNW3PxP79l/gzM/+7LKnJUV9EWMOGPeU4TmjwvtLOg4t/veCjvA320P7STiPXrRt9uHv39/fXdWztf65JGzBg6e3t228bvmjx9NUlX3b39rRGWDDpi9g9N+9a0RmYawd9ZjNmFRT81uN1y9S839nBpjPXrh3XLzPzvf0ZXbZsCM8IvZ/jjDt2JuZfb3e4rg0Jz+py7K0495DQyyGshOLmZnEkUEtYKSklvQZeuPBIs2aVMzp33fxuePln9rw3I7llk52ddNj+4Ji1qzzSMqN0X5ecViml8+cNL5kYWTJ6M7JL5l246Ouv087rnfXm3OiSsDz9gew+Ky2j85bNnXp+eFFSZVgYqWGZ1XMsIgz/OrvGdexKx6xNSUm3PqGQL1h+oP2fVq2aeKc59gv/5CmXuI71jJ6/3u44cqRFvxdeuu+8w4db5fn9U1ItZBOXLJ36eWpKyRVDhszb2sQJTp+Va9uPN+7Y67mOpTuOLfWu43PtvvBn+YEABBJKoJawMjK2vDR40ILLd+zISc7JWbLZ5wsWRZY/+evsnJDZ/eEl0ezCZ1u0Kn957Jj7P6s8kuIumD+j1Jtteefs3vvjZ9asue6b0aNmLo8R1k3X/Pz+JaWlnSalpOxb3CF9W3J4FlQYuNLM8us8ViUFb3Zjrg2InN+3z4or+vb7d9Lrqyb2bNt2V/7A3IXXm9nCOpZ5j3o0Bw5cGIZaVDTWkpMrbPSoh19JS/vitUCgYJOZjalv3LX2uhJaDTeDAARqEqhzD+uioc+O+rIk89IWLQ5sO7vt7tsCswpamOP+vdqGdtX+0JgxD88MBX0z160ffe6ePT3Ccigp6Wbbt/e3nAuWfpmdvWL5osXTN0c23SsOtb6hoqJ1tzZtPnv66aGHfhV55cHbw6p2LDB7WnjD3HGXV3syd+w1hy03TfhNz63bcsd/ezT5gX79Xs0xn82OLtUim+2Ouzx/sn9JyLG7zWdPBf42d4N3zaFDn2+d9ZNVxVWb/xMjUqs57qTWh6c29g12vvIQUCJQ71PC3bt7Hfx8Z9b1vXu/vmxj8SV3Fxdftij6WL8eIVjQ2rs+yy0IBHbFPvmL3XRPanL0ghUr/F2z+6xo27HjJ9MDhYFOkXPrPGaWHxWltwlfJU7/lMnX79x5/uWbNg1rOWJEwedJTYP/iBHrreYLPhFZLprZ8EhpFRVp7crK0nunp29b2yTpaIE3KwsvOesYNzMspa86WRQI1Cssb4m1aNFdV+fmLh6Wnr798TlzHn+qZ6+3N3TpvDlj3fpRdqC8ffgpobcpH9nXCfrM7218l5V1yKw83Kpd+/QdG3y+YLC0tEvHVat+eTCyRFy27Nbn2qTteSUr661333zrhjW7dmb1j7zWEHsstdW+Sc+9eO+47OyVD5SXpdvG4hHRl0arNtn3Llp4V/8+2Suv2/FpP29Wd+x4yOe9aNp12MVP+nueXzTDce1/0ad6kwrTm/+ofPXIy2aVpHfctsbbfI9s2Ncct0U279mvUviuk0GAQK0/zYnuU1XtCYVnH2bjvadjvqDtjO5hDbBHwpvwlfbnakKIgRJ+slZjMzzyu3ea91nvxUxPGrHn1nUsuoeVa9u9MZnZ2PCelvd7zftUHXfMXnYdG1VtuVg1vprXiO2y5vUEeiYCBCQIfK+wvJTeDMR7ouctkZodstZV0jrLOxZ9abQOHMcTlrc35M3OIk8hzbGu1eQWcyy8bPM23quWdm7kpdGY1wtiX2uIHHdduyIy7pp7UdUeINR4pwphSXy3CSFIgD9+FiyVSBBQJYCwVJslFwQECSAswVKJBAFVAghLtVlyQUCQAMISLJVIEFAlgLBUmyUXBAQJICzBUokEAVUCCEu1WXJBQJAAwhIslUgQUCWAsFSbJRcEBAkgLMFSiQQBVQIIS7VZckFAkADCEiyVSBBQJYCwVJslFwQECSAswVKJBAFVAghLtVlyQUCQAMISLJVIEFAlgLBUmyUXBAQJICzBUokEAVUCCEu1WXJBQJAAwhIslUgQUCWAsFSbJRcEBAkgLMFSiQQBVQIIS7VZckFAkADCEiyVSBBQJYCwVJslFwQECSAswVKJBAFVAghLtVlyQUCQAMISLJVIEFAlgLBUmyUXBAQJICzBUokEAVUCCEu1WXJBQJAAwhIslUgQUCWAsFSbJRcEBAkgLMFSiQQBVQIIS7VZckFAkADCEiyVSBBQJYCwVJslFwQECSAswVKJBAFVAghLtVlyQUCQAMISLJVIEFAlgLBUmyUXBAQJICzBUokEAVUCCEu1WXJBQJAAwhIslUgQUCWAsFSbJRcEBAkgLMFSiQQBVQIIS7VZckFAkADCEiyVSBBQJYCwVJslFwQECSAswVKJBAFVAghLtVlyQUCQAMISLJVIEFAlgLBUmyUXBAQJICzBUokEAVUCCEu1WXJBQJAAwhIslUgQUCWAsFSbJRcEBAkgLMFSiQQBVQIIS7VZckFAkADCEiyVSBBQJYCwVJslFwQECSAswVKJBAFVAghLtVlyQUCQAMISLJVIEFAlgLBUmyUXBAQJICzBUokEAVUCCEu1WXJBQJAAwhIslUgQUCWAsFSbJRcEBAkgLMFSiQQBVQIIS7VZckFAkADCEiyVSBBQJYCwVJslFwQECSAswVKJBAFVAghLtVlyQUCQAMISLJVIEFAlgLBUmyUXBAQJICzBUokEAVUCCEu1WXJBQJAAwhIslUgQUCWAsFSbJRcEBAkgLMFSiQQBVQIIS7VZckFAkADCEiyVSBBQJYCwVJslFwQECSAswVKJBAFVAghLtVlyQUCQAMISLJVIEFAlgLBUmyUXBAQJICzBUokEAVUCCEu1WXJBQJAAwhIslUgQUCWAsFSbJRcEBAkgLMFSiQQBVQIIS7VZckFAkADCEiyVSBBQJYCwVJslFwQECSAswVKJBAFVAghLtVlyQUCQAMISLJVIEFAlgLBUmyUXBAQJICzBUokEAVUCCEu1WXJBQJAAwhIslUgQUCWAsFSbJRcEBAkgLMFSiQQBVQIIS7VZckFAkADCEiyVSBBQJYCwVJslFwQECSAswVKJBAFVAghLtVlyQUCQAMISLJVIEFAlgLBUmyUXBAQJICzBUokEAVUCCEu1WXJBQJAAwhIslUgQUCWAsFSbJRcEBAkgLMFSiQQBVQIIS7VZckFAkADCEiyVSBBQJYCwVJslFwQECfwfXVXO0yIn8tUAAAAASUVORK5CYII=" 94 | }, 95 | } 96 | CanvasRenderingContext2D = { 97 | fillRect: function () {}, 98 | fillText: function () {} 99 | } 100 | localStorage = { 101 | removeItem: function (key) { 102 | delete this[key] 103 | }, 104 | getItem: function (key) { 105 | return this[key] ? this[key]: null; 106 | }, 107 | setItem: function (key, value) { 108 | this[key] = "" + value; 109 | }, 110 | }; 111 | sessionStorage = {} 112 | setInterval = window.setInterval = function (){} 113 | setInterval.toString = function(){return "function setInterval() { [native code] }"} 114 | setTimeout = function (){} 115 | top = window.top = window 116 | global = undefined; 117 | child_process = undefined; 118 | closed = { 119 | __proto__: ( 1>>3 >4 )["__proto__"] 120 | } 121 | function get_cookie(seed, ts, code) { 122 | var Buffer; 123 | process = undefined; 124 | function CustomEvent() {} 125 | eval(code); 126 | cookie = encodeURIComponent(new ABC().z(seed, parseInt(ts)+(480+new Date().getTimezoneOffset())*60*1000)) 127 | console.log({cookie, cookie}) 128 | return {cookie, cookie}; 129 | } 130 | 131 | module.exports = { 132 | get_cookie 133 | } 134 | 135 | -------------------------------------------------------------------------------- /16-零度IP(md5)/lingduIP.js: -------------------------------------------------------------------------------- 1 | /* 2 | * $Id: base64.js,v 2.15 2014/04/05 12:58:57 dankogai Exp dankogai $ 3 | * 4 | * Licensed under the BSD 3-Clause License. 5 | * http://opensource.org/licenses/BSD-3-Clause 6 | * 7 | * References: 8 | * http://en.wikipedia.org/wiki/Base64 9 | */ 10 | 11 | (function (global) { 12 | // existing version for noConflict() 13 | var _Base64 = global.Base64; 14 | var version = "2.1.9"; 15 | // if node.js, we use Buffer 16 | var buffer; 17 | if (typeof module !== 'undefined' && module.exports) { 18 | try { 19 | buffer = require('buffer').Buffer; 20 | } catch (err) { 21 | } 22 | } 23 | // constants 24 | var b64chars 25 | = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 26 | var b64tab = function (bin) { 27 | var t = {}; 28 | for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i; 29 | return t; 30 | }(b64chars); 31 | var fromCharCode = String.fromCharCode; 32 | // encoder stuff 33 | var cb_utob = function (c) { 34 | if (c.length < 2) { 35 | var cc = c.charCodeAt(0); 36 | return cc < 0x80 ? c 37 | : cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6)) 38 | + fromCharCode(0x80 | (cc & 0x3f))) 39 | : (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) 40 | + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) 41 | + fromCharCode(0x80 | ( cc & 0x3f))); 42 | } else { 43 | var cc = 0x10000 44 | + (c.charCodeAt(0) - 0xD800) * 0x400 45 | + (c.charCodeAt(1) - 0xDC00); 46 | return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07)) 47 | + fromCharCode(0x80 | ((cc >>> 12) & 0x3f)) 48 | + fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) 49 | + fromCharCode(0x80 | ( cc & 0x3f))); 50 | } 51 | }; 52 | var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; 53 | var utob = function (u) { 54 | return u.replace(re_utob, cb_utob); 55 | }; 56 | var cb_encode = function (ccc) { 57 | var padlen = [0, 2, 1][ccc.length % 3], 58 | ord = ccc.charCodeAt(0) << 16 59 | | ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) 60 | | ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)), 61 | chars = [ 62 | b64chars.charAt(ord >>> 18), 63 | b64chars.charAt((ord >>> 12) & 63), 64 | padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63), 65 | padlen >= 1 ? '=' : b64chars.charAt(ord & 63) 66 | ]; 67 | return chars.join(''); 68 | }; 69 | var btoa = global.btoa ? function (b) { 70 | return global.btoa(b); 71 | } : function (b) { 72 | return b.replace(/[\s\S]{1,3}/g, cb_encode); 73 | }; 74 | var _encode = buffer ? function (u) { 75 | return (u.constructor === buffer.constructor ? u : new buffer(u)) 76 | .toString('base64') 77 | } 78 | : function (u) { 79 | return btoa(utob(u)) 80 | } 81 | ; 82 | var encode = function (u, urisafe) { 83 | return !urisafe 84 | ? _encode(String(u)) 85 | : _encode(String(u)).replace(/[+\/]/g, function (m0) { 86 | return m0 == '+' ? '-' : '_'; 87 | }).replace(/=/g, ''); 88 | }; 89 | var encodeURI = function (u) { 90 | return encode(u, true) 91 | }; 92 | // decoder stuff 93 | var re_btou = new RegExp([ 94 | '[\xC0-\xDF][\x80-\xBF]', 95 | '[\xE0-\xEF][\x80-\xBF]{2}', 96 | '[\xF0-\xF7][\x80-\xBF]{3}' 97 | ].join('|'), 'g'); 98 | var cb_btou = function (cccc) { 99 | switch (cccc.length) { 100 | case 4: 101 | var cp = ((0x07 & cccc.charCodeAt(0)) << 18) 102 | | ((0x3f & cccc.charCodeAt(1)) << 12) 103 | | ((0x3f & cccc.charCodeAt(2)) << 6) 104 | | (0x3f & cccc.charCodeAt(3)), 105 | offset = cp - 0x10000; 106 | return (fromCharCode((offset >>> 10) + 0xD800) 107 | + fromCharCode((offset & 0x3FF) + 0xDC00)); 108 | case 3: 109 | return fromCharCode( 110 | ((0x0f & cccc.charCodeAt(0)) << 12) 111 | | ((0x3f & cccc.charCodeAt(1)) << 6) 112 | | (0x3f & cccc.charCodeAt(2)) 113 | ); 114 | default: 115 | return fromCharCode( 116 | ((0x1f & cccc.charCodeAt(0)) << 6) 117 | | (0x3f & cccc.charCodeAt(1)) 118 | ); 119 | } 120 | }; 121 | var btou = function (b) { 122 | return b.replace(re_btou, cb_btou); 123 | }; 124 | var cb_decode = function (cccc) { 125 | var len = cccc.length, 126 | padlen = len % 4, 127 | n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0) 128 | | (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0) 129 | | (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0) 130 | | (len > 3 ? b64tab[cccc.charAt(3)] : 0), 131 | chars = [ 132 | fromCharCode(n >>> 16), 133 | fromCharCode((n >>> 8) & 0xff), 134 | fromCharCode(n & 0xff) 135 | ]; 136 | chars.length -= [0, 0, 2, 1][padlen]; 137 | return chars.join(''); 138 | }; 139 | var atob = global.atob ? function (a) { 140 | return global.atob(a); 141 | } : function (a) { 142 | return a.replace(/[\s\S]{1,4}/g, cb_decode); 143 | }; 144 | var _decode = buffer ? function (a) { 145 | return (a.constructor === buffer.constructor 146 | ? a : new buffer(a, 'base64')).toString(); 147 | } 148 | : function (a) { 149 | return btou(atob(a)) 150 | }; 151 | var decode = function (a) { 152 | return _decode( 153 | String(a).replace(/[-_]/g, function (m0) { 154 | return m0 == '-' ? '+' : '/' 155 | }) 156 | .replace(/[^A-Za-z0-9\+\/]/g, '') 157 | ); 158 | }; 159 | var noConflict = function () { 160 | var Base64 = global.Base64; 161 | global.Base64 = _Base64; 162 | return Base64; 163 | }; 164 | // export Base64 165 | global.Base64 = { 166 | VERSION: version, 167 | atob: atob, 168 | btoa: btoa, 169 | fromBase64: decode, 170 | toBase64: encode, 171 | utob: utob, 172 | encode: encode, 173 | encodeURI: encodeURI, 174 | btou: btou, 175 | decode: decode, 176 | noConflict: noConflict 177 | }; 178 | // if ES5 is available, make Base64.extendString() available 179 | if (typeof Object.defineProperty === 'function') { 180 | var noEnum = function (v) { 181 | return {value: v, enumerable: false, writable: true, configurable: true}; 182 | }; 183 | global.Base64.extendString = function () { 184 | Object.defineProperty( 185 | String.prototype, 'fromBase64', noEnum(function () { 186 | return decode(this) 187 | })); 188 | Object.defineProperty( 189 | String.prototype, 'toBase64', noEnum(function (urisafe) { 190 | return encode(this, urisafe) 191 | })); 192 | Object.defineProperty( 193 | String.prototype, 'toBase64URI', noEnum(function () { 194 | return encode(this, true) 195 | })); 196 | }; 197 | } 198 | // that's it! 199 | if (global['Meteor']) { 200 | Base64 = global.Base64; // for normal export in Meteor.js 201 | } 202 | if (typeof module !== 'undefined' && module.exports) { 203 | module.exports.Base64 = global.Base64; 204 | } 205 | if (typeof define === 'function' && define.amd) { 206 | // AMD. Register as an anonymous module. 207 | define([], function () { 208 | return global.Base64 209 | }); 210 | } 211 | })(typeof self !== 'undefined' ? self 212 | : typeof window !== 'undefined' ? window 213 | : typeof global !== 'undefined' ? global 214 | : this 215 | ); 216 | function decode_str(scHZjLUh1) { 217 | scHZjLUh1 = Base64["decode"](scHZjLUh1); 218 | key = "nyloner"; 219 | len = key["length"]; 220 | code = ''; 221 | for (i = 0; i < scHZjLUh1["length"]; i++) { 222 | var coeFYlqUm2 = i % len; 223 | code += String.fromCharCode(scHZjLUh1["charCodeAt"](i) ^ key["charCodeAt"](coeFYlqUm2)) 224 | } 225 | return Base64["decode"](code) 226 | } 227 | 228 | // 将字符串转换成json对象 229 | function str_to_json(str) { 230 | return (new Function("return " + str))(); 231 | } 232 | function get_ip(a) { 233 | return str_to_json(decode_str(a)) 234 | } 235 | -------------------------------------------------------------------------------- /20-抖音web/douyin.js: -------------------------------------------------------------------------------- 1 | Audio = {} 2 | document = { 3 | createElement: function() { 4 | return canvas 5 | } 6 | }; 7 | canvas = { 8 | getContext: function getContext() { 9 | return CanvasRenderingContext2D 10 | }, 11 | toDataURL: function toDataURL() { 12 | // 实际为canvas画布填充了“龘ฑภ경”字样后,转成的图片链接 13 | return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAQCAYAAABQrvyxAAACyUlEQVRIS8XWTYhVZRgH8N8dkPFqJqgI4sKmTUSgaBCKihCI5dZFUEaLwHAThjujEnXjpkAUHSRc+AEtFJIWKWRBSR9QENgiggplNqkTlXBnhjveeM6cF955PXccFJ2zuPec99zz3v/X87+3ZfrRK67jslWvxb103vCxx770DN5sApSAloBLco+SzFKcxbZClmG8gw7uIdCkfnq+BDsXbmzEizhYg2p0oEn1PEK5II/SgTKPbXyE89iBt+oPDDcpWz7cbwZysq/h9Vqd9/E2fkWsn0GsJeVi/1DvE6xJQLJoNA1T7PN0wx73zMBMDsTGTXMQ1n6TAfkJ63ACr+IcDmekUr6D0FUkdb+uc18SCPCba4ILitlodGA2ik8R7Rmw2E4ThnR9oVsRjJyuxL/4FLdwJCOQE07O5CBjQONIRINk7l4iOOMQB4mkdn6eajWgM2mhYU855KhRXRMO6DqKD/Ay3sWygkCKUE6qJPAegmis3+5T0I0EEtj8PUVn+r2e+Zb52HqjPqti8ptFnnPHPhzH6lq5+KIcbOwX4AJkAtjkQK50Pi9pfWfEKR/ifjVaOjC1wcLq9ZoPXbTLZfyi7Vljlep/4nSd8ZzA9bpNokUuzYJASTSBT3Mzcr8qbO77CNBSk0ZNGrPHoO+r1plnta4YxhxcTiAAbMcPs3QgXLpSC1EmKfbd38+B/jMQ4NvuWoTlPnfNKfyIES3P142U12Y/B6oI1Kj6RSgcOIZX6lqe0YHyL0Su/tT5gJ5JbSt03PSfrl34vco//2i522fgHma5/M1Ie20KZ0oHEsj5Fhireqijra2j4wlL3HHMGrv9bC2+tKUGf1vLxMOgfNBnp89AT8sGq3xrHE/WVRo0ojQHvWSHK/Y6ab83qhz/gZsYr34V5uAoCQwYstV1F6zzlXlaxg0aMeQvq7zgqu+qno+WuYG/5xJ86PU//5znHgwZKlQAAAAASUVORK5CYII=" 14 | }, 15 | } 16 | 17 | CanvasRenderingContext2D = { 18 | arc: function arc() {}, 19 | stroke: function stroke() {}, 20 | fillText: function fillText() {}, 21 | } 22 | window = { 23 | document: { 24 | location:{}, 25 | _zid:2 26 | }, 27 | } 28 | function get_sign(uid, aaaa, ua) { 29 | // _signature共26位 30 | // uid 决定倒数第8至倒数第5位的字符(共4位) 31 | // ua 决定倒数第10至倒数第8位的字符 32 | // data:image决定正数第11至第16位 33 | aaaa = aaaa.replace(/\\u02a1/g, "\u02a1").replace(/\\x7f/g, "\x7f").replace(/\\x80/g, "\x80").replace(/\\x1c/g, "\x1c").replace(/\\x06/g, "\x06").replace(/\\x02/g, "\x02").replace(/\\\'/g, "\'").replace(/\\ufffb/g, "\ufffb").replace(/\\\\/g, "\\").replace(/\\uffce/g, "\uffce") 34 | navigator = { 35 | userAgent: ua, 36 | } 37 | tac = aaaa; 38 | var e = {}; 39 | (function anonymous() { 40 | function e(e, a, r) { 41 | return (b[e] || (b[e] = t("x,y", "return x " + e + " y")))(r, a) 42 | } 43 | function a(e, a, r) { 44 | return (k[r] || (k[r] = t("x,y", "return new x[y](" + Array(r + 1).join(",x[++y]").substr(1) + ")")))(e, a) 45 | } 46 | function r(e, a, r) { 47 | var n, t, s = {}, b = s.d = r ? r.d + 1 : 0; 48 | for (s["$" + b] = s, 49 | t = 0; t < b; t++) 50 | s[n = "$" + t] = r[n]; 51 | for (t = 0, 52 | b = s.length = a.length; t < b; t++) 53 | s[t] = a[t]; 54 | return c(e, 0, s) 55 | } 56 | function c(t, b, k) { 57 | function u(e) { 58 | if (typeof e === "string" && e === 'canvas') { 59 | debugger; 60 | } 61 | v[x++] = e 62 | } 63 | function f() { 64 | return g = t.charCodeAt(b++) - 32, 65 | t.substring(b, b += g) 66 | } 67 | function l() { 68 | try { 69 | y = c(t, b, k) 70 | } catch (e) { 71 | h = e, 72 | y = l 73 | } 74 | } 75 | for (var h, y, d, g, v = [], x = 0; ; ) 76 | switch (g = t.charCodeAt(b++) - 32) { 77 | case 1: 78 | u(!v[--x]); 79 | break; 80 | case 4: 81 | v[x++] = f(); 82 | break; 83 | case 5: 84 | u(function(e) { 85 | var a = 0 86 | , r = e.length; 87 | return function() { 88 | var c = a < r; 89 | return c && u(e[a++]), 90 | c 91 | } 92 | }(v[--x])); 93 | break; 94 | case 6: 95 | y = v[--x], 96 | u(v[--x](y)); 97 | break; 98 | case 8: 99 | if (g = t.charCodeAt(b++) - 32, 100 | l(), 101 | b += g, 102 | g = t.charCodeAt(b++) - 32, 103 | y === c) 104 | b += g; 105 | else if (y !== l) 106 | return y; 107 | break; 108 | case 9: 109 | v[x++] = c; 110 | break; 111 | case 10: 112 | u(s(v[--x])); 113 | break; 114 | case 11: 115 | y = v[--x], 116 | u(v[--x] + y); 117 | break; 118 | case 12: 119 | for (y = f(), 120 | d = [], 121 | g = 0; g < y.length; g++) 122 | d[g] = y.charCodeAt(g) ^ g + y.length; 123 | u(String.fromCharCode.apply(null, d)); 124 | break; 125 | case 13: 126 | y = v[--x], 127 | h = delete v[--x][y]; 128 | break; 129 | case 14: 130 | v[x++] = t.charCodeAt(b++) - 32; 131 | break; 132 | case 59: 133 | u((g = t.charCodeAt(b++) - 32) ? (y = x, 134 | v.slice(x -= g, y)) : []); 135 | break; 136 | case 61: 137 | u(v[--x][t.charCodeAt(b++) - 32]); 138 | break; 139 | case 62: 140 | g = v[--x], 141 | k[0] = 65599 * k[0] + k[1].charCodeAt(g) >>> 0; 142 | break; 143 | case 65: 144 | h = v[--x], 145 | y = v[--x], 146 | v[--x][y] = h; 147 | break; 148 | case 66: 149 | u(e(t[b++], v[--x], v[--x])); 150 | break; 151 | case 67: 152 | y = v[--x], 153 | d = v[--x] 154 | u((g = v[--x]).x === c ? r(g.y, y, k) : g.apply(d, y)); 155 | break; 156 | case 68: 157 | u(e((g = t[b++]) < "<" ? (b--, 158 | f()) : g + g, v[--x], v[--x])); 159 | break; 160 | case 70: 161 | u(!1); 162 | break; 163 | case 71: 164 | v[x++] = n; 165 | break; 166 | case 72: 167 | v[x++] = +f(); 168 | break; 169 | case 73: 170 | u(parseInt(f(), 36)); 171 | break; 172 | case 75: 173 | if (v[--x]) { 174 | b++; 175 | break 176 | } 177 | case 74: 178 | g = t.charCodeAt(b++) - 32 << 16 >> 16, 179 | b += g; 180 | break; 181 | case 76: 182 | u(k[t.charCodeAt(b++) - 32]); 183 | break; 184 | case 77: 185 | y = v[--x], 186 | u(v[--x][y]); 187 | break; 188 | case 78: 189 | g = t.charCodeAt(b++) - 32, 190 | u(a(v, x -= g + 1, g)); 191 | break; 192 | case 79: 193 | g = t.charCodeAt(b++) - 32, 194 | u(k["$" + g]); 195 | break; 196 | case 81: 197 | h = v[--x] 198 | v[--x][f()] = h; 199 | break; 200 | case 82: 201 | u(v[--x][f()]); 202 | break; 203 | case 83: 204 | h = v[--x] 205 | k[t.charCodeAt(b++) - 32] = h; 206 | break; 207 | case 84: 208 | v[x++] = !0; 209 | break; 210 | case 85: 211 | v[x++] = void 0; 212 | break; 213 | case 86: 214 | u(v[x - 1]); 215 | break; 216 | case 88: 217 | h = v[--x], 218 | y = v[--x], 219 | v[x++] = h, 220 | v[x++] = y; 221 | break; 222 | case 89: 223 | u(function() { 224 | function e() { 225 | return r(e.y, arguments, k) 226 | } 227 | return e.y = f(), 228 | e.x = c, 229 | e 230 | }()); 231 | break; 232 | case 90: 233 | v[x++] = null; 234 | break; 235 | case 91: 236 | v[x++] = h; 237 | break; 238 | case 93: 239 | h = v[--x]; 240 | break; 241 | case 0: 242 | return v[--x]; 243 | default: 244 | u((g << 16 >> 16) - 16) 245 | } 246 | } 247 | var n = this 248 | , t = n.Function 249 | , s = Object.keys || function(e) { 250 | var a = {} 251 | , r = 0; 252 | for (var c in e) 253 | a[r++] = c; 254 | return a.length = r, 255 | a 256 | } 257 | , b = {} 258 | , k = {}; 259 | return r 260 | } 261 | ) 262 | ()('gr$Daten Иb/s!l y͒yĹg,(lfi~ah`{mv,-n|jqewVxp{rvmmx,&effkx[!cs"l".Pq%widthl"@q&heightl"vr*getContextx$"2d[!cs#l#,*;?|u.|uc{uq$fontl#vr(fillTextx$$龘ฑภ경2<[#c}l#2q*shadowBlurl#1q-shadowOffsetXl#$$limeq+shadowColorl#vr#arcx88802[%c}l#vr&strokex[ c}l"v,)}eOmyoZB]mx[ cs!0s$l$Pb>>s!0s%yA0s"l"l!r&lengthb&l!l Bd>&+l!l &+l!l 6d>&+l!l &+ s,y=o!o!]/q"13o!l q"10o!],l 2d>& s.{s-yMo!o!]0q"13o!]*Ld>>b|s!o!l q"10o!],l!& s/yIo!o!].q"13o!],o!]*Jd>>b|&o!]+l &+ s0l-l!&l-l!i\'1z141z4b/@d> ( - 0x2 * _0x15f638 & 0x6)) : 0x0) { 33 | _0x3df9f8 = _0x356c10['indexOf'](_0x3df9f8); 34 | } 35 | return _0x411a0f; 36 | }); 37 | } ()); 38 | var _0x172d34 = function(_0xa28d48, _0x346449) { 39 | var _0x55c23f = [], 40 | _0x3809ab = 0x0, 41 | _0x5298ee, 42 | _0x3c825f = '', 43 | _0x8b8e9a = ''; 44 | _0xa28d48 = window.atob(_0xa28d48); 45 | for (var _0xee1bef = 0x0, 46 | _0x3023b5 = _0xa28d48['length']; _0xee1bef < _0x3023b5; _0xee1bef++) { 47 | _0x8b8e9a += '%' + ('00' + _0xa28d48['charCodeAt'](_0xee1bef)['toString'](0x10))['slice']( - 0x2); 48 | } 49 | _0xa28d48 = decodeURIComponent(_0x8b8e9a); 50 | for (var _0x308939 = 0x0; _0x308939 < 0x100; _0x308939++) { 51 | _0x55c23f[_0x308939] = _0x308939; 52 | } 53 | for (_0x308939 = 0x0; _0x308939 < 0x100; _0x308939++) { 54 | _0x3809ab = (_0x3809ab + _0x55c23f[_0x308939] + _0x346449['charCodeAt'](_0x308939 % _0x346449['length'])) % 0x100; 55 | _0x5298ee = _0x55c23f[_0x308939]; 56 | _0x55c23f[_0x308939] = _0x55c23f[_0x3809ab]; 57 | _0x55c23f[_0x3809ab] = _0x5298ee; 58 | } 59 | _0x308939 = 0x0; 60 | _0x3809ab = 0x0; 61 | for (var _0x66c563 = 0x0; _0x66c563 < _0xa28d48['length']; _0x66c563++) { 62 | _0x308939 = (_0x308939 + 0x1) % 0x100; 63 | _0x3809ab = (_0x3809ab + _0x55c23f[_0x308939]) % 0x100; 64 | _0x5298ee = _0x55c23f[_0x308939]; 65 | _0x55c23f[_0x308939] = _0x55c23f[_0x3809ab]; 66 | _0x55c23f[_0x3809ab] = _0x5298ee; 67 | _0x3c825f += String['fromCharCode'](_0xa28d48['charCodeAt'](_0x66c563) ^ _0x55c23f[(_0x55c23f[_0x308939] + _0x55c23f[_0x3809ab]) % 0x100]); 68 | } 69 | return _0x3c825f; 70 | }; 71 | _0x56ae['rc4'] = _0x172d34; 72 | _0x56ae['data'] = {}; 73 | _0x56ae['initialized'] = !![]; 74 | } 75 | var _0x190c72 = _0x56ae['data'][_0xca96c7]; 76 | if (_0x190c72 === undefined) { 77 | if (_0x56ae['once'] === undefined) { 78 | _0x56ae['once'] = !![]; 79 | } 80 | _0x57cca1 = _0x56ae['rc4'](_0x57cca1, _0x241ea9); 81 | _0x56ae['data'][_0xca96c7] = _0x57cca1; 82 | } else { 83 | _0x57cca1 = _0x190c72; 84 | } 85 | return _0x57cca1; 86 | }; 87 | function _0x412a72(_0x2a28c0) { 88 | var _0x4257c9 = { 89 | 'bwGZX': _0x56ae('0x0', 'jo5I'), 90 | 'mGirf': function _0x2eb028(_0x5ab0bc, _0x5505f4) { 91 | return _0x5ab0bc < _0x5505f4; 92 | }, 93 | 'hOkXt': function _0x16449b(_0x22286c, _0x41c8cd) { 94 | return _0x22286c & _0x41c8cd; 95 | }, 96 | 'RJeYY': function _0x24beb6(_0x59303b, _0x576d3b) { 97 | return _0x59303b == _0x576d3b; 98 | }, 99 | 'cFxMb': function _0x45b03c(_0xadce3d, _0x5416a9) { 100 | return _0xadce3d >> _0x5416a9; 101 | }, 102 | 'spzgJ': function _0x3c313d(_0x19fd11, _0xcacabb) { 103 | return _0x19fd11 << _0xcacabb; 104 | }, 105 | 'VdlKD': function _0x2427d5(_0x23b25b, _0x23b39e) { 106 | return _0x23b25b & _0x23b39e; 107 | }, 108 | 'VDeWo': function _0x1ef1b0(_0x476993, _0x40dd2a) { 109 | return _0x476993 == _0x40dd2a; 110 | }, 111 | 'gHLRp': function _0x16afb3(_0x4bdebb, _0x1065a7) { 112 | return _0x4bdebb >> _0x1065a7; 113 | }, 114 | 'biRta': function _0x301047(_0x2ada60, _0x1c4232) { 115 | return _0x2ada60 | _0x1c4232; 116 | }, 117 | 'oKMpY': function _0x1d0b02(_0x547e37, _0x500868) { 118 | return _0x547e37 << _0x500868; 119 | }, 120 | 'HlUXJ': function _0x21902c(_0x16ae1a, _0x466bbf) { 121 | return _0x16ae1a >> _0x466bbf; 122 | }, 123 | 'vuJTm': function _0x2fea95(_0x34f7b5, _0x59e46f) { 124 | return _0x34f7b5 << _0x59e46f; 125 | }, 126 | 'lHuwG': function _0x1339d0(_0x3c775a, _0x3450ae) { 127 | return _0x3c775a >> _0x3450ae; 128 | }, 129 | 'fpeDs': function _0x52b661(_0x318fc3, _0x59aa7b) { 130 | return _0x318fc3 & _0x59aa7b; 131 | }, 132 | 'HqwlU': function _0x2144ca(_0x4799d4, _0x25b745) { 133 | return _0x4799d4 | _0x25b745; 134 | }, 135 | 'nPBKx': function _0x42b833(_0xe339b1, _0x5c500c) { 136 | return _0xe339b1 & _0x5c500c; 137 | }, 138 | 'ZRhVT': function _0xc9529d(_0x5ed560, _0x4383da) { 139 | return _0x5ed560 & _0x4383da; 140 | }, 141 | 'bdZKt': _0x56ae('0x1', '5jBa') 142 | }; 143 | var _0x6c47cd = _0x4257c9[_0x56ae('0x2', 'LFWf')][_0x56ae('0x3', 'Q@8l')]('|'), 144 | _0x3a5836 = 0x0; 145 | while ( !! []) { 146 | switch (_0x6c47cd[_0x3a5836++]) { 147 | case '0': 148 | _0x27d1f5 = ''; 149 | continue; 150 | case '1': 151 | var _0x27d1f5, _0x4262d0, _0xc876d4; 152 | continue; 153 | case '2': 154 | _0x4262d0 = 0x0; 155 | continue; 156 | case '3': 157 | while (_0x4257c9[_0x56ae('0x4', '*h#g')](_0x4262d0, _0xc876d4)) { 158 | _0x5526a7 = _0x4257c9[_0x56ae('0x5', 'a6w(')](_0x2a28c0['charCodeAt'](_0x4262d0++), 0xff); 159 | if (_0x4257c9['RJeYY'](_0x4262d0, _0xc876d4)) { 160 | _0x27d1f5 += _0x2097d8[_0x56ae('0x6', ')Z%%')](_0x4257c9[_0x56ae('0x7', 'iAGA')](_0x5526a7, 0x2)); 161 | _0x27d1f5 += _0x2097d8['charAt'](_0x4257c9[_0x56ae('0x8', 'IM$w')](_0x4257c9[_0x56ae('0x9', 'Dk(l')](_0x5526a7, 0x3), 0x4)); 162 | _0x27d1f5 += '=='; 163 | break; 164 | } 165 | _0x138cf5 = _0x2a28c0['charCodeAt'](_0x4262d0++); 166 | if (_0x4257c9[_0x56ae('0xa', 'HLR(')](_0x4262d0, _0xc876d4)) { 167 | _0x27d1f5 += _0x2097d8[_0x56ae('0xb', 'iAGA')](_0x4257c9['gHLRp'](_0x5526a7, 0x2)); 168 | _0x27d1f5 += _0x2097d8[_0x56ae('0xc', 'j%QO')](_0x4257c9[_0x56ae('0xd', ')Z%%')](_0x4257c9[_0x56ae('0xe', 'L6ge')](_0x4257c9[_0x56ae('0xf', '02EH')](_0x5526a7, 0x3), 0x4), _0x4257c9[_0x56ae('0x10', '5jBa')](_0x4257c9[_0x56ae('0x11', 'j%QO')](_0x138cf5, 0xf0), 0x4))); 169 | _0x27d1f5 += _0x2097d8[_0x56ae('0x12', '02EH')](_0x4257c9[_0x56ae('0x13', 'L6ge')](_0x4257c9['VdlKD'](_0x138cf5, 0xf), 0x2)); 170 | _0x27d1f5 += '='; 171 | break; 172 | } 173 | _0x4093e6 = _0x2a28c0[_0x56ae('0x14', '%FZJ')](_0x4262d0++); 174 | _0x27d1f5 += _0x2097d8[_0x56ae('0x15', 'd2rH')](_0x4257c9['lHuwG'](_0x5526a7, 0x2)); 175 | _0x27d1f5 += _0x2097d8['charAt'](_0x4257c9[_0x56ae('0x16', 'Zp5!')](_0x4257c9['VdlKD'](_0x5526a7, 0x3) << 0x4, _0x4257c9[_0x56ae('0x17', '%FZJ')](_0x138cf5, 0xf0) >> 0x4)); 176 | _0x27d1f5 += _0x2097d8[_0x56ae('0x12', '02EH')](_0x4257c9[_0x56ae('0x18', '*FHt')](_0x4257c9[_0x56ae('0x19', '*FHt')](_0x4257c9['nPBKx'](_0x138cf5, 0xf), 0x2), _0x4257c9[_0x56ae('0x1a', 'scqQ')](_0x4093e6, 0xc0) >> 0x6)); 177 | _0x27d1f5 += _0x2097d8[_0x56ae('0x1b', 'eygr')](_0x4257c9['ZRhVT'](_0x4093e6, 0x3f)); 178 | } 179 | continue; 180 | case '4': 181 | return _0x27d1f5; 182 | case '5': 183 | _0xc876d4 = _0x2a28c0['length']; 184 | continue; 185 | case '6': 186 | var _0x5526a7, _0x138cf5, _0x4093e6; 187 | continue; 188 | case '7': 189 | var _0x2097d8 = _0x4257c9[_0x56ae('0x1c', 'LFWf')]; 190 | continue; 191 | } 192 | break; 193 | } 194 | } 195 | function _0x344cd4() { 196 | var _0x53d9fc = { 197 | 'GjCbS': function _0x1a0314(_0x33da81, _0xe25eb5) { 198 | return _0x33da81 < _0xe25eb5; 199 | }, 200 | 'JBFUL': function _0x1af799(_0x51aa2f, _0x2e4887) { 201 | return _0x51aa2f + _0x2e4887; 202 | } 203 | }; 204 | var _0x3c9135 = 0x0; 205 | var _0x43beea = 0x0; 206 | for (_0x43beea = 0x0; _0x53d9fc[_0x56ae('0x1d', 'uGC9')](_0x43beea, wzwsquestion[_0x56ae('0x1e', 'V2r4')]); _0x43beea++) { 207 | _0x3c9135 += wzwsquestion[_0x56ae('0x1f', '!2cw')](_0x43beea); 208 | } 209 | _0x3c9135 *= wzwsfactor; 210 | _0x3c9135 += 0x1b207; 211 | return _0x53d9fc[_0x56ae('0x20', 'd2rH')](_0x56ae('0x21', 'Rau%'), _0x3c9135); 212 | } 213 | function _0x2ff265(_0x26b826, _0xea8bd1) { 214 | var _0x253f74 = { 215 | 'ogjLK': _0x56ae('0x22', 'Qy14'), 216 | 'izgsL': 'post', 217 | 'eMCME': function _0x3b581c(_0xd2391, _0x1a9ef1) { 218 | return _0xd2391 != _0x1a9ef1; 219 | }, 220 | 'aCWaI': function _0x5c65fc(_0x1402c7, _0x41e446) { 221 | return _0x1402c7 < _0x41e446; 222 | }, 223 | 'OTFrl': _0x56ae('0x23', 'Rau%') 224 | }; 225 | var _0x370b5e = _0x253f74[_0x56ae('0x24', '!2cw')][_0x56ae('0x25', 'i[Ts')]('|'), 226 | _0x1ba457 = 0x0; 227 | while ( !! []) { 228 | switch (_0x370b5e[_0x1ba457++]) { 229 | case '0': 230 | _0x15a9ed['method'] = _0x253f74[_0x56ae('0x26', 'uGC9')]; 231 | continue; 232 | case '1': 233 | return _0x15a9ed; 234 | case '2': 235 | var _0x15a9ed = document[_0x56ae('0x27', 'Q@8l')](_0x56ae('0x28', ')Z%%')); 236 | continue; 237 | case '3': 238 | if (_0x253f74[_0x56ae('0x29', 'YXCs')](_0xea8bd1['search']('='), -0x1)) { 239 | var _0x573df6 = _0xea8bd1[_0x56ae('0x2a', 'LFWf')]('&'); 240 | for (var _0x426cb4 = 0x0; _0x253f74[_0x56ae('0x2b', '57vf')](_0x426cb4, _0x573df6[_0x56ae('0x2c', '*FHt')]); _0x426cb4++) { 241 | var _0x3ddbc7 = _0x56ae('0x2d', 'V]Be')['split']('|'), 242 | _0x1fdb10 = 0x0; 243 | while ( !! []) { 244 | switch (_0x3ddbc7[_0x1fdb10++]) { 245 | case '0': 246 | _0x2a293f[_0x56ae('0x2e', 'iAGA')] = _0x422f0a[0x0]; 247 | continue; 248 | case '1': 249 | var _0x2a293f = document['createElement'](_0x253f74[_0x56ae('0x2f', 'a6w(')]); 250 | continue; 251 | case '2': 252 | var _0x422f0a = _0x8ad1c0['split']('='); 253 | continue; 254 | case '3': 255 | var _0x8ad1c0 = _0x573df6[_0x426cb4]; 256 | continue; 257 | case '4': 258 | _0x15a9ed[_0x56ae('0x30', 'WuNj')](_0x2a293f); 259 | continue; 260 | case '5': 261 | _0x2a293f['value'] = _0x422f0a[0x1]; 262 | continue; 263 | } 264 | break; 265 | } 266 | } 267 | } 268 | continue; 269 | case '4': 270 | _0x15a9ed[_0x56ae('0x31', '!2cw')](); 271 | continue; 272 | case '5': 273 | _0x15a9ed[_0x56ae('0x32', '02EH')] = _0x26b826; 274 | continue; 275 | case '6': 276 | _0x15a9ed['style']['display'] = _0x56ae('0x33', '%FZJ'); 277 | continue; 278 | case '7': 279 | document[_0x56ae('0x34', 'HLR(')]['appendChild'](_0x15a9ed); 280 | continue; 281 | } 282 | break; 283 | } 284 | } 285 | function _0x33f22a() { 286 | var _0x532424 = { 287 | 'hwQpj': function _0x3b4af9(_0x2ff2ab) { 288 | return _0x2ff2ab(); 289 | }, 290 | 'lYfvS': function _0x242f23(_0x57f673, _0x33b4b3) { 291 | return _0x57f673(_0x33b4b3); 292 | }, 293 | 'VvOsr': function _0x33a26c(_0xb8a476, _0x580dd6) { 294 | return _0xb8a476 + _0x580dd6; 295 | }, 296 | 'vOmWg': _0x56ae('0x35', 'YXCs'), 297 | 'LaaBO': function _0x1b637c(_0x5c57e1, _0x41b90a) { 298 | return _0x5c57e1 == _0x41b90a; 299 | }, 300 | 'eneJI': 'post' 301 | }; 302 | var _0xb14971 = _0x532424[_0x56ae('0x36', 'jo5I')](_0x344cd4); 303 | var _0x10ace8 = _0x532424[_0x56ae('0x37', 'a6w(')](_0x412a72, _0xb14971[_0x56ae('0x38', '*8t[')]()); 304 | var _0x35ace3 = _0x532424[_0x56ae('0x39', ')9A&')](dynamicurl, _0x532424[_0x56ae('0x3a', 'N&Yh')]) + _0x10ace8; 305 | if (_0x532424['LaaBO'](wzwsmethod, _0x532424[_0x56ae('0x3b', 'Q@8l')])) { 306 | _0x2ff265(_0x35ace3, wzwsparams); 307 | } else { 308 | window[_0x56ae('0x3c', ')9A&')] = _0x35ace3; 309 | } 310 | } 311 | _0x33f22a();; 312 | if (! (typeof encode_version !== _0x56ae('0x3d', 'QE(m') && encode_version === _0x56ae('0x3e', 'LFWf'))) { 313 | window[_0x56ae('0x3f', 'Q@8l')](_0x56ae('0x40', 'YtnB')); 314 | }; 315 | encode_version = 'sojson.v5'; 316 | -------------------------------------------------------------------------------- /00-通用加密/RSAKeyPair.js: -------------------------------------------------------------------------------- 1 | function RSAKeyPair(a, b, c) { 2 | this.e = biFromHex(a), 3 | this.d = biFromHex(b), 4 | this.m = biFromHex(c), 5 | this.chunkSize = 2 * biHighIndex(this.m), 6 | this.radix = 16, 7 | this.barrett = new BarrettMu(this.m) 8 | } 9 | function twoDigit(a) { 10 | return (10 > a ? "0" : "") + String(a) 11 | } 12 | function encryptedString(a, b) { 13 | for (var f, g, h, i, j, k, l, c = new Array, d = b.length, e = 0; d > e; ) 14 | c[e] = b.charCodeAt(e), 15 | e++; 16 | for (; 0 != c.length % a.chunkSize; ) 17 | c[e++] = 0; 18 | for (f = c.length, 19 | g = "", 20 | e = 0; f > e; e += a.chunkSize) { 21 | for (j = new BigInt, 22 | h = 0, 23 | i = e; i < e + a.chunkSize; ++h) 24 | j.digits[h] = c[i++], 25 | j.digits[h] += c[i++] << 8; 26 | k = a.barrett.powMod(j, a.e), 27 | l = 16 == a.radix ? biToHex(k) : biToString(k, a.radix), 28 | g += l + " " 29 | } 30 | return g.substring(0, g.length - 1) 31 | } 32 | function decryptedString(a, b) { 33 | var e, f, g, h, c = b.split(" "), d = ""; 34 | for (e = 0; e < c.length; ++e) 35 | for (h = 16 == a.radix ? biFromHex(c[e]) : biFromString(c[e], a.radix), 36 | g = a.barrett.powMod(h, a.d), 37 | f = 0; f <= biHighIndex(g); ++f) 38 | d += String.fromCharCode(255 & g.digits[f], g.digits[f] >> 8); 39 | return 0 == d.charCodeAt(d.length - 1) && (d = d.substring(0, d.length - 1)), 40 | d 41 | } 42 | function setMaxDigits(a) { 43 | maxDigits = a, 44 | ZERO_ARRAY = new Array(maxDigits); 45 | for (var b = 0; b < ZERO_ARRAY.length; b++) 46 | ZERO_ARRAY[b] = 0; 47 | bigZero = new BigInt, 48 | bigOne = new BigInt, 49 | bigOne.digits[0] = 1 50 | } 51 | function BigInt(a) { 52 | this.digits = "boolean" == typeof a && 1 == a ? null : ZERO_ARRAY.slice(0), 53 | this.isNeg = !1 54 | } 55 | function biFromDecimal(a) { 56 | for (var d, e, f, b = "-" == a.charAt(0), c = b ? 1 : 0; c < a.length && "0" == a.charAt(c); ) 57 | ++c; 58 | if (c == a.length) 59 | d = new BigInt; 60 | else { 61 | for (e = a.length - c, 62 | f = e % dpl10, 63 | 0 == f && (f = dpl10), 64 | d = biFromNumber(Number(a.substr(c, f))), 65 | c += f; c < a.length; ) 66 | d = biAdd(biMultiply(d, lr10), biFromNumber(Number(a.substr(c, dpl10)))), 67 | c += dpl10; 68 | d.isNeg = b 69 | } 70 | return d 71 | } 72 | function biCopy(a) { 73 | var b = new BigInt(!0); 74 | return b.digits = a.digits.slice(0), 75 | b.isNeg = a.isNeg, 76 | b 77 | } 78 | function biFromNumber(a) { 79 | var c, b = new BigInt; 80 | for (b.isNeg = 0 > a, 81 | a = Math.abs(a), 82 | c = 0; a > 0; ) 83 | b.digits[c++] = a & maxDigitVal, 84 | a >>= biRadixBits; 85 | return b 86 | } 87 | function reverseStr(a) { 88 | var c, b = ""; 89 | for (c = a.length - 1; c > -1; --c) 90 | b += a.charAt(c); 91 | return b 92 | } 93 | function biToString(a, b) { 94 | var d, e, c = new BigInt; 95 | for (c.digits[0] = b, 96 | d = biDivideModulo(a, c), 97 | e = hexatrigesimalToChar[d[1].digits[0]]; 1 == biCompare(d[0], bigZero); ) 98 | d = biDivideModulo(d[0], c), 99 | digit = d[1].digits[0], 100 | e += hexatrigesimalToChar[d[1].digits[0]]; 101 | return (a.isNeg ? "-" : "") + reverseStr(e) 102 | } 103 | function biToDecimal(a) { 104 | var c, d, b = new BigInt; 105 | for (b.digits[0] = 10, 106 | c = biDivideModulo(a, b), 107 | d = String(c[1].digits[0]); 1 == biCompare(c[0], bigZero); ) 108 | c = biDivideModulo(c[0], b), 109 | d += String(c[1].digits[0]); 110 | return (a.isNeg ? "-" : "") + reverseStr(d) 111 | } 112 | function digitToHex(a) { 113 | var b = 15 114 | , c = ""; 115 | for (i = 0; 4 > i; ++i) 116 | c += hexToChar[a & b], 117 | a >>>= 4; 118 | return reverseStr(c) 119 | } 120 | function biToHex(a) { 121 | var d, b = ""; 122 | for (biHighIndex(a), 123 | d = biHighIndex(a); d > -1; --d) 124 | b += digitToHex(a.digits[d]); 125 | return b 126 | } 127 | function charToHex(a) { 128 | var h, b = 48, c = b + 9, d = 97, e = d + 25, f = 65, g = 90; 129 | return h = a >= b && c >= a ? a - b : a >= f && g >= a ? 10 + a - f : a >= d && e >= a ? 10 + a - d : 0 130 | } 131 | function hexToDigit(a) { 132 | var d, b = 0, c = Math.min(a.length, 4); 133 | for (d = 0; c > d; ++d) 134 | b <<= 4, 135 | b |= charToHex(a.charCodeAt(d)); 136 | return b 137 | } 138 | function biFromHex(a) { 139 | var d, e, b = new BigInt, c = a.length; 140 | for (d = c, 141 | e = 0; d > 0; d -= 4, 142 | ++e) 143 | b.digits[e] = hexToDigit(a.substr(Math.max(d - 4, 0), Math.min(d, 4))); 144 | return b 145 | } 146 | function biFromString(a, b) { 147 | var g, h, i, j, c = "-" == a.charAt(0), d = c ? 1 : 0, e = new BigInt, f = new BigInt; 148 | for (f.digits[0] = 1, 149 | g = a.length - 1; g >= d; g--) 150 | h = a.charCodeAt(g), 151 | i = charToHex(h), 152 | j = biMultiplyDigit(f, i), 153 | e = biAdd(e, j), 154 | f = biMultiplyDigit(f, b); 155 | return e.isNeg = c, 156 | e 157 | } 158 | function biDump(a) { 159 | return (a.isNeg ? "-" : "") + a.digits.join(" ") 160 | } 161 | function biAdd(a, b) { 162 | var c, d, e, f; 163 | if (a.isNeg != b.isNeg) 164 | b.isNeg = !b.isNeg, 165 | c = biSubtract(a, b), 166 | b.isNeg = !b.isNeg; 167 | else { 168 | for (c = new BigInt, 169 | d = 0, 170 | f = 0; f < a.digits.length; ++f) 171 | e = a.digits[f] + b.digits[f] + d, 172 | c.digits[f] = 65535 & e, 173 | d = Number(e >= biRadix); 174 | c.isNeg = a.isNeg 175 | } 176 | return c 177 | } 178 | function biSubtract(a, b) { 179 | var c, d, e, f; 180 | if (a.isNeg != b.isNeg) 181 | b.isNeg = !b.isNeg, 182 | c = biAdd(a, b), 183 | b.isNeg = !b.isNeg; 184 | else { 185 | for (c = new BigInt, 186 | e = 0, 187 | f = 0; f < a.digits.length; ++f) 188 | d = a.digits[f] - b.digits[f] + e, 189 | c.digits[f] = 65535 & d, 190 | c.digits[f] < 0 && (c.digits[f] += biRadix), 191 | e = 0 - Number(0 > d); 192 | if (-1 == e) { 193 | for (e = 0, 194 | f = 0; f < a.digits.length; ++f) 195 | d = 0 - c.digits[f] + e, 196 | c.digits[f] = 65535 & d, 197 | c.digits[f] < 0 && (c.digits[f] += biRadix), 198 | e = 0 - Number(0 > d); 199 | c.isNeg = !a.isNeg 200 | } else 201 | c.isNeg = a.isNeg 202 | } 203 | return c 204 | } 205 | function biHighIndex(a) { 206 | for (var b = a.digits.length - 1; b > 0 && 0 == a.digits[b]; ) 207 | --b; 208 | return b 209 | } 210 | function biNumBits(a) { 211 | var e, b = biHighIndex(a), c = a.digits[b], d = (b + 1) * bitsPerDigit; 212 | for (e = d; e > d - bitsPerDigit && 0 == (32768 & c); --e) 213 | c <<= 1; 214 | return e 215 | } 216 | function biMultiply(a, b) { 217 | var d, h, i, k, c = new BigInt, e = biHighIndex(a), f = biHighIndex(b); 218 | for (k = 0; f >= k; ++k) { 219 | for (d = 0, 220 | i = k, 221 | j = 0; e >= j; ++j, 222 | ++i) 223 | h = c.digits[i] + a.digits[j] * b.digits[k] + d, 224 | c.digits[i] = h & maxDigitVal, 225 | d = h >>> biRadixBits; 226 | c.digits[k + e + 1] = d 227 | } 228 | return c.isNeg = a.isNeg != b.isNeg, 229 | c 230 | } 231 | function biMultiplyDigit(a, b) { 232 | var c, d, e, f; 233 | for (result = new BigInt, 234 | c = biHighIndex(a), 235 | d = 0, 236 | f = 0; c >= f; ++f) 237 | e = result.digits[f] + a.digits[f] * b + d, 238 | result.digits[f] = e & maxDigitVal, 239 | d = e >>> biRadixBits; 240 | return result.digits[1 + c] = d, 241 | result 242 | } 243 | function arrayCopy(a, b, c, d, e) { 244 | var g, h, f = Math.min(b + e, a.length); 245 | for (g = b, 246 | h = d; f > g; ++g, 247 | ++h) 248 | c[h] = a[g] 249 | } 250 | function biShiftLeft(a, b) { 251 | var e, f, g, h, c = Math.floor(b / bitsPerDigit), d = new BigInt; 252 | for (arrayCopy(a.digits, 0, d.digits, c, d.digits.length - c), 253 | e = b % bitsPerDigit, 254 | f = bitsPerDigit - e, 255 | g = d.digits.length - 1, 256 | h = g - 1; g > 0; --g, 257 | --h) 258 | d.digits[g] = d.digits[g] << e & maxDigitVal | (d.digits[h] & highBitMasks[e]) >>> f; 259 | return d.digits[0] = d.digits[g] << e & maxDigitVal, 260 | d.isNeg = a.isNeg, 261 | d 262 | } 263 | function biShiftRight(a, b) { 264 | var e, f, g, h, c = Math.floor(b / bitsPerDigit), d = new BigInt; 265 | for (arrayCopy(a.digits, c, d.digits, 0, a.digits.length - c), 266 | e = b % bitsPerDigit, 267 | f = bitsPerDigit - e, 268 | g = 0, 269 | h = g + 1; g < d.digits.length - 1; ++g, 270 | ++h) 271 | d.digits[g] = d.digits[g] >>> e | (d.digits[h] & lowBitMasks[e]) << f; 272 | return d.digits[d.digits.length - 1] >>>= e, 273 | d.isNeg = a.isNeg, 274 | d 275 | } 276 | function biMultiplyByRadixPower(a, b) { 277 | var c = new BigInt; 278 | return arrayCopy(a.digits, 0, c.digits, b, c.digits.length - b), 279 | c 280 | } 281 | function biDivideByRadixPower(a, b) { 282 | var c = new BigInt; 283 | return arrayCopy(a.digits, b, c.digits, 0, c.digits.length - b), 284 | c 285 | } 286 | function biModuloByRadixPower(a, b) { 287 | var c = new BigInt; 288 | return arrayCopy(a.digits, 0, c.digits, 0, b), 289 | c 290 | } 291 | function biCompare(a, b) { 292 | if (a.isNeg != b.isNeg) 293 | return 1 - 2 * Number(a.isNeg); 294 | for (var c = a.digits.length - 1; c >= 0; --c) 295 | if (a.digits[c] != b.digits[c]) 296 | return a.isNeg ? 1 - 2 * Number(a.digits[c] > b.digits[c]) : 1 - 2 * Number(a.digits[c] < b.digits[c]); 297 | return 0 298 | } 299 | function biDivideModulo(a, b) { 300 | var f, g, h, i, j, k, l, m, n, o, p, q, r, s, c = biNumBits(a), d = biNumBits(b), e = b.isNeg; 301 | if (d > c) 302 | return a.isNeg ? (f = biCopy(bigOne), 303 | f.isNeg = !b.isNeg, 304 | a.isNeg = !1, 305 | b.isNeg = !1, 306 | g = biSubtract(b, a), 307 | a.isNeg = !0, 308 | b.isNeg = e) : (f = new BigInt, 309 | g = biCopy(a)), 310 | new Array(f,g); 311 | for (f = new BigInt, 312 | g = a, 313 | h = Math.ceil(d / bitsPerDigit) - 1, 314 | i = 0; b.digits[h] < biHalfRadix; ) 315 | b = biShiftLeft(b, 1), 316 | ++i, 317 | ++d, 318 | h = Math.ceil(d / bitsPerDigit) - 1; 319 | for (g = biShiftLeft(g, i), 320 | c += i, 321 | j = Math.ceil(c / bitsPerDigit) - 1, 322 | k = biMultiplyByRadixPower(b, j - h); -1 != biCompare(g, k); ) 323 | ++f.digits[j - h], 324 | g = biSubtract(g, k); 325 | for (l = j; l > h; --l) { 326 | for (m = l >= g.digits.length ? 0 : g.digits[l], 327 | n = l - 1 >= g.digits.length ? 0 : g.digits[l - 1], 328 | o = l - 2 >= g.digits.length ? 0 : g.digits[l - 2], 329 | p = h >= b.digits.length ? 0 : b.digits[h], 330 | q = h - 1 >= b.digits.length ? 0 : b.digits[h - 1], 331 | f.digits[l - h - 1] = m == p ? maxDigitVal : Math.floor((m * biRadix + n) / p), 332 | r = f.digits[l - h - 1] * (p * biRadix + q), 333 | s = m * biRadixSquared + (n * biRadix + o); r > s; ) 334 | --f.digits[l - h - 1], 335 | r = f.digits[l - h - 1] * (p * biRadix | q), 336 | s = m * biRadix * biRadix + (n * biRadix + o); 337 | k = biMultiplyByRadixPower(b, l - h - 1), 338 | g = biSubtract(g, biMultiplyDigit(k, f.digits[l - h - 1])), 339 | g.isNeg && (g = biAdd(g, k), 340 | --f.digits[l - h - 1]) 341 | } 342 | return g = biShiftRight(g, i), 343 | f.isNeg = a.isNeg != e, 344 | a.isNeg && (f = e ? biAdd(f, bigOne) : biSubtract(f, bigOne), 345 | b = biShiftRight(b, i), 346 | g = biSubtract(b, g)), 347 | 0 == g.digits[0] && 0 == biHighIndex(g) && (g.isNeg = !1), 348 | new Array(f,g) 349 | } 350 | function biDivide(a, b) { 351 | return biDivideModulo(a, b)[0] 352 | } 353 | function biModulo(a, b) { 354 | return biDivideModulo(a, b)[1] 355 | } 356 | function biMultiplyMod(a, b, c) { 357 | return biModulo(biMultiply(a, b), c) 358 | } 359 | function biPow(a, b) { 360 | for (var c = bigOne, d = a; ; ) { 361 | if (0 != (1 & b) && (c = biMultiply(c, d)), 362 | b >>= 1, 363 | 0 == b) 364 | break; 365 | d = biMultiply(d, d) 366 | } 367 | return c 368 | } 369 | function biPowMod(a, b, c) { 370 | for (var d = bigOne, e = a, f = b; ; ) { 371 | if (0 != (1 & f.digits[0]) && (d = biMultiplyMod(d, e, c)), 372 | f = biShiftRight(f, 1), 373 | 0 == f.digits[0] && 0 == biHighIndex(f)) 374 | break; 375 | e = biMultiplyMod(e, e, c) 376 | } 377 | return d 378 | } 379 | function BarrettMu(a) { 380 | this.modulus = biCopy(a), 381 | this.k = biHighIndex(this.modulus) + 1; 382 | var b = new BigInt; 383 | b.digits[2 * this.k] = 1, 384 | this.mu = biDivide(b, this.modulus), 385 | this.bkplus1 = new BigInt, 386 | this.bkplus1.digits[this.k + 1] = 1, 387 | this.modulo = BarrettMu_modulo, 388 | this.multiplyMod = BarrettMu_multiplyMod, 389 | this.powMod = BarrettMu_powMod 390 | } 391 | function BarrettMu_modulo(a) { 392 | var i, b = biDivideByRadixPower(a, this.k - 1), c = biMultiply(b, this.mu), d = biDivideByRadixPower(c, this.k + 1), e = biModuloByRadixPower(a, this.k + 1), f = biMultiply(d, this.modulus), g = biModuloByRadixPower(f, this.k + 1), h = biSubtract(e, g); 393 | for (h.isNeg && (h = biAdd(h, this.bkplus1)), 394 | i = biCompare(h, this.modulus) >= 0; i; ) 395 | h = biSubtract(h, this.modulus), 396 | i = biCompare(h, this.modulus) >= 0; 397 | return h 398 | } 399 | function BarrettMu_multiplyMod(a, b) { 400 | var c = biMultiply(a, b); 401 | return this.modulo(c) 402 | } 403 | function BarrettMu_powMod(a, b) { 404 | var d, e, c = new BigInt; 405 | for (c.digits[0] = 1, 406 | d = a, 407 | e = b; ; ) { 408 | if (0 != (1 & e.digits[0]) && (c = this.multiplyMod(c, d)), 409 | e = biShiftRight(e, 1), 410 | 0 == e.digits[0] && 0 == biHighIndex(e)) 411 | break; 412 | d = this.multiplyMod(d, d) 413 | } 414 | return c 415 | } 416 | var maxDigits, ZERO_ARRAY, bigZero, bigOne, dpl10, lr10, hexatrigesimalToChar, hexToChar, highBitMasks, lowBitMasks, biRadixBase = 2, biRadixBits = 16, bitsPerDigit = biRadixBits, biRadix = 65536, biHalfRadix = biRadix >>> 1, biRadixSquared = biRadix * biRadix, maxDigitVal = biRadix - 1, maxInteger = 9999999999999998; 417 | setMaxDigits(20), 418 | dpl10 = 15, 419 | lr10 = biFromNumber(1e15), 420 | hexatrigesimalToChar = new Array("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"), 421 | hexToChar = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"), 422 | highBitMasks = new Array(0,32768,49152,57344,61440,63488,64512,65024,65280,65408,65472,65504,65520,65528,65532,65534,65535), 423 | lowBitMasks = new Array(0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535); 424 | 425 | 426 | // 这种RSA加密,每次加密相同明文,密文不会变 427 | // 下面的e为指数, n为模量,根据不同的网站修改即可。content为需加密的明文 428 | function encrypt(content) { 429 | var e = "010001" 430 | , n = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7" 431 | , b, c; 432 | return setMaxDigits(131), 433 | b = new RSAKeyPair(e, "", n), 434 | c = encryptedString(b, content) 435 | } 436 | console.log(encrypt("111111")) 437 | -------------------------------------------------------------------------------- /06-58同城登录(RSA)/tc58.js: -------------------------------------------------------------------------------- 1 | window = global; 2 | !function(e) { 3 | void 0 === e.RSAUtils && (e.RSAUtils = {}); 4 | var s, l, v, c = 16, N = 65536, m = N - 1, M = e.BigInt = function(i) { 5 | this.digits = "boolean" == typeof i && 1 == i ? null : s.slice(0), 6 | this.isNeg = !1 7 | } 8 | ; 9 | RSAUtils.setMaxDigits = function(i) { 10 | s = new Array(i); 11 | for (var t = 0; t < s.length; t++) 12 | s[t] = 0; 13 | l = new M, 14 | (v = new M).digits[0] = 1 15 | } 16 | , 17 | RSAUtils.setMaxDigits(20); 18 | RSAUtils.biFromNumber = function(i) { 19 | var t = new M; 20 | t.isNeg = i < 0, 21 | i = Math.abs(i); 22 | for (var s = 0; 0 < i; ) 23 | t.digits[s++] = i & m, 24 | i = Math.floor(i / N); 25 | return t 26 | } 27 | ; 28 | var g = RSAUtils.biFromNumber(1e15); 29 | RSAUtils.biFromDecimal = function(i) { 30 | for (var t, s = "-" == i.charAt(0), r = s ? 1 : 0; r < i.length && "0" == i.charAt(r); ) 31 | ++r; 32 | if (r == i.length) 33 | t = new M; 34 | else { 35 | var e = (i.length - r) % 15; 36 | for (0 == e && (e = 15), 37 | t = RSAUtils.biFromNumber(Number(i.substr(r, e))), 38 | r += e; r < i.length; ) 39 | t = RSAUtils.biAdd(RSAUtils.biMultiply(t, g), RSAUtils.biFromNumber(Number(i.substr(r, 15)))), 40 | r += 15; 41 | t.isNeg = s 42 | } 43 | return t 44 | } 45 | , 46 | RSAUtils.biCopy = function(i) { 47 | var t = new M(!0); 48 | return t.digits = i.digits.slice(0), 49 | t.isNeg = i.isNeg, 50 | t 51 | } 52 | , 53 | RSAUtils.reverseStr = function(i) { 54 | for (var t = "", s = i.length - 1; -1 < s; --s) 55 | t += i.charAt(s); 56 | return t 57 | } 58 | ; 59 | var n = ["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"]; 60 | RSAUtils.biToString = function(i, t) { 61 | var s = new M; 62 | s.digits[0] = t; 63 | for (var r = RSAUtils.biDivideModulo(i, s), e = n[r[1].digits[0]]; 1 == RSAUtils.biCompare(r[0], l); ) 64 | r = RSAUtils.biDivideModulo(r[0], s), 65 | digit = r[1].digits[0], 66 | e += n[r[1].digits[0]]; 67 | return (i.isNeg ? "-" : "") + RSAUtils.reverseStr(e) 68 | } 69 | , 70 | RSAUtils.biToDecimal = function(i) { 71 | var t = new M; 72 | t.digits[0] = 10; 73 | for (var s = RSAUtils.biDivideModulo(i, t), r = String(s[1].digits[0]); 1 == RSAUtils.biCompare(s[0], l); ) 74 | s = RSAUtils.biDivideModulo(s[0], t), 75 | r += String(s[1].digits[0]); 76 | return (i.isNeg ? "-" : "") + RSAUtils.reverseStr(r) 77 | } 78 | ; 79 | var r = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]; 80 | RSAUtils.digitToHex = function(t) { 81 | var s = ""; 82 | for (i = 0; i < 4; ++i) 83 | s += r[15 & t], 84 | t >>>= 4; 85 | return RSAUtils.reverseStr(s) 86 | } 87 | , 88 | RSAUtils.biToHex = function(i) { 89 | for (var t = "", s = (RSAUtils.biHighIndex(i), 90 | RSAUtils.biHighIndex(i)); -1 < s; --s) 91 | t += RSAUtils.digitToHex(i.digits[s]); 92 | return t 93 | } 94 | , 95 | RSAUtils.charToHex = function(i) { 96 | return 48 <= i && i <= 57 ? i - 48 : 65 <= i && i <= 90 ? 10 + i - 65 : 97 <= i && i <= 122 ? 10 + i - 97 : 0 97 | } 98 | , 99 | RSAUtils.hexToDigit = function(i) { 100 | for (var t = 0, s = Math.min(i.length, 4), r = 0; r < s; ++r) 101 | t <<= 4, 102 | t |= RSAUtils.charToHex(i.charCodeAt(r)); 103 | return t 104 | } 105 | , 106 | RSAUtils.biFromHex = function(i) { 107 | for (var t = new M, s = i.length, r = 0; 0 < s; s -= 4, 108 | ++r) 109 | t.digits[r] = RSAUtils.hexToDigit(i.substr(Math.max(s - 4, 0), Math.min(s, 4))); 110 | return t 111 | } 112 | , 113 | RSAUtils.biFromString = function(i, t) { 114 | var s = "-" == i.charAt(0) 115 | , r = s ? 1 : 0 116 | , e = new M 117 | , l = new M; 118 | l.digits[0] = 1; 119 | for (var g = i.length - 1; r <= g; g--) { 120 | var n = i.charCodeAt(g) 121 | , d = RSAUtils.charToHex(n) 122 | , o = RSAUtils.biMultiplyDigit(l, d); 123 | e = RSAUtils.biAdd(e, o), 124 | l = RSAUtils.biMultiplyDigit(l, t) 125 | } 126 | return e.isNeg = s, 127 | e 128 | } 129 | , 130 | RSAUtils.biDump = function(i) { 131 | return (i.isNeg ? "-" : "") + i.digits.join(" ") 132 | } 133 | , 134 | RSAUtils.biAdd = function(i, t) { 135 | var s; 136 | if (i.isNeg != t.isNeg) 137 | t.isNeg = !t.isNeg, 138 | s = RSAUtils.biSubtract(i, t), 139 | t.isNeg = !t.isNeg; 140 | else { 141 | s = new M; 142 | for (var r, e = 0, l = 0; l < i.digits.length; ++l) 143 | r = i.digits[l] + t.digits[l] + e, 144 | s.digits[l] = r % N, 145 | e = Number(N <= r); 146 | s.isNeg = i.isNeg 147 | } 148 | return s 149 | } 150 | , 151 | RSAUtils.biSubtract = function(i, t) { 152 | var s; 153 | if (i.isNeg != t.isNeg) 154 | t.isNeg = !t.isNeg, 155 | s = RSAUtils.biAdd(i, t), 156 | t.isNeg = !t.isNeg; 157 | else { 158 | var r, e; 159 | s = new M; 160 | for (var l = e = 0; l < i.digits.length; ++l) 161 | r = i.digits[l] - t.digits[l] + e, 162 | s.digits[l] = r % N, 163 | s.digits[l] < 0 && (s.digits[l] += N), 164 | e = 0 - Number(r < 0); 165 | if (-1 == e) { 166 | for (l = e = 0; l < i.digits.length; ++l) 167 | r = 0 - s.digits[l] + e, 168 | s.digits[l] = r % N, 169 | s.digits[l] < 0 && (s.digits[l] += N), 170 | e = 0 - Number(r < 0); 171 | s.isNeg = !i.isNeg 172 | } else 173 | s.isNeg = i.isNeg 174 | } 175 | return s 176 | } 177 | , 178 | RSAUtils.biHighIndex = function(i) { 179 | for (var t = i.digits.length - 1; 0 < t && 0 == i.digits[t]; ) 180 | --t; 181 | return t 182 | } 183 | , 184 | RSAUtils.biNumBits = function(i) { 185 | var t, s = RSAUtils.biHighIndex(i), r = i.digits[s], e = (s + 1) * c; 186 | for (t = e; e - c < t && 0 == (32768 & r); --t) 187 | r <<= 1; 188 | return t 189 | } 190 | , 191 | RSAUtils.biMultiply = function(i, t) { 192 | for (var s, r, e, l = new M, g = RSAUtils.biHighIndex(i), n = RSAUtils.biHighIndex(t), d = 0; d <= n; ++d) { 193 | for (e = d, 194 | j = s = 0; j <= g; ++j, 195 | ++e) 196 | r = l.digits[e] + i.digits[j] * t.digits[d] + s, 197 | l.digits[e] = r & m, 198 | s = r >>> 16; 199 | l.digits[d + g + 1] = s 200 | } 201 | return l.isNeg = i.isNeg != t.isNeg, 202 | l 203 | } 204 | , 205 | RSAUtils.biMultiplyDigit = function(i, t) { 206 | var s, r, e; 207 | result = new M, 208 | s = RSAUtils.biHighIndex(i); 209 | for (var l = r = 0; l <= s; ++l) 210 | e = result.digits[l] + i.digits[l] * t + r, 211 | result.digits[l] = e & m, 212 | r = e >>> 16; 213 | return result.digits[1 + s] = r, 214 | result 215 | } 216 | , 217 | RSAUtils.arrayCopy = function(i, t, s, r, e) { 218 | for (var l = Math.min(t + e, i.length), g = t, n = r; g < l; ++g, 219 | ++n) 220 | s[n] = i[g] 221 | } 222 | ; 223 | var d = [0, 32768, 49152, 57344, 61440, 63488, 64512, 65024, 65280, 65408, 65472, 65504, 65520, 65528, 65532, 65534, 65535]; 224 | RSAUtils.biShiftLeft = function(i, t) { 225 | var s = Math.floor(t / c) 226 | , r = new M; 227 | RSAUtils.arrayCopy(i.digits, 0, r.digits, s, r.digits.length - s); 228 | for (var e = t % c, l = c - e, g = r.digits.length - 1, n = g - 1; 0 < g; --g, 229 | --n) 230 | r.digits[g] = r.digits[g] << e & m | (r.digits[n] & d[e]) >>> l; 231 | return r.digits[0] = r.digits[g] << e & m, 232 | r.isNeg = i.isNeg, 233 | r 234 | } 235 | ; 236 | var o = [0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535]; 237 | function u(i) { 238 | var t = RSAUtils 239 | , s = t.biDivideByRadixPower(i, this.k - 1) 240 | , r = t.biMultiply(s, this.mu) 241 | , e = t.biDivideByRadixPower(r, this.k + 1) 242 | , l = t.biModuloByRadixPower(i, this.k + 1) 243 | , g = t.biMultiply(e, this.modulus) 244 | , n = t.biModuloByRadixPower(g, this.k + 1) 245 | , d = t.biSubtract(l, n); 246 | d.isNeg && (d = t.biAdd(d, this.bkplus1)); 247 | for (var o = 0 <= t.biCompare(d, this.modulus); o; ) 248 | d = t.biSubtract(d, this.modulus), 249 | o = 0 <= t.biCompare(d, this.modulus); 250 | return d 251 | } 252 | function S(i, t) { 253 | var s = RSAUtils.biMultiply(i, t); 254 | return this.modulo(s) 255 | } 256 | function a(i, t) { 257 | var s = new M; 258 | s.digits[0] = 1; 259 | for (var r = i, e = t; 0 != (1 & e.digits[0]) && (s = this.multiplyMod(s, r)), 260 | 0 != (e = RSAUtils.biShiftRight(e, 1)).digits[0] || 0 != RSAUtils.biHighIndex(e); ) 261 | r = this.multiplyMod(r, r); 262 | return s 263 | } 264 | RSAUtils.biShiftRight = function(i, t) { 265 | var s = Math.floor(t / c) 266 | , r = new M; 267 | RSAUtils.arrayCopy(i.digits, s, r.digits, 0, i.digits.length - s); 268 | for (var e = t % c, l = c - e, g = 0, n = g + 1; g < r.digits.length - 1; ++g, 269 | ++n) 270 | r.digits[g] = r.digits[g] >>> e | (r.digits[n] & o[e]) << l; 271 | return r.digits[r.digits.length - 1] >>>= e, 272 | r.isNeg = i.isNeg, 273 | r 274 | } 275 | , 276 | RSAUtils.biMultiplyByRadixPower = function(i, t) { 277 | var s = new M; 278 | return RSAUtils.arrayCopy(i.digits, 0, s.digits, t, s.digits.length - t), 279 | s 280 | } 281 | , 282 | RSAUtils.biDivideByRadixPower = function(i, t) { 283 | var s = new M; 284 | return RSAUtils.arrayCopy(i.digits, t, s.digits, 0, s.digits.length - t), 285 | s 286 | } 287 | , 288 | RSAUtils.biModuloByRadixPower = function(i, t) { 289 | var s = new M; 290 | return RSAUtils.arrayCopy(i.digits, 0, s.digits, 0, t), 291 | s 292 | } 293 | , 294 | RSAUtils.biCompare = function(i, t) { 295 | if (i.isNeg != t.isNeg) 296 | return 1 - 2 * Number(i.isNeg); 297 | for (var s = i.digits.length - 1; 0 <= s; --s) 298 | if (i.digits[s] != t.digits[s]) 299 | return i.isNeg ? 1 - 2 * Number(i.digits[s] > t.digits[s]) : 1 - 2 * Number(i.digits[s] < t.digits[s]); 300 | return 0 301 | } 302 | , 303 | RSAUtils.biDivideModulo = function(i, t) { 304 | var s, r, e = RSAUtils.biNumBits(i), l = RSAUtils.biNumBits(t), g = t.isNeg; 305 | if (e < l) 306 | return i.isNeg ? ((s = RSAUtils.biCopy(v)).isNeg = !t.isNeg, 307 | i.isNeg = !1, 308 | t.isNeg = !1, 309 | r = biSubtract(t, i), 310 | i.isNeg = !0, 311 | t.isNeg = g) : (s = new M, 312 | r = RSAUtils.biCopy(i)), 313 | [s, r]; 314 | s = new M, 315 | r = i; 316 | for (var n = Math.ceil(l / c) - 1, d = 0; t.digits[n] < 32768; ) 317 | t = RSAUtils.biShiftLeft(t, 1), 318 | ++d, 319 | ++l, 320 | n = Math.ceil(l / c) - 1; 321 | r = RSAUtils.biShiftLeft(r, d), 322 | e += d; 323 | for (var o = Math.ceil(e / c) - 1, u = RSAUtils.biMultiplyByRadixPower(t, o - n); -1 != RSAUtils.biCompare(r, u); ) 324 | ++s.digits[o - n], 325 | r = RSAUtils.biSubtract(r, u); 326 | for (var S = o; n < S; --S) { 327 | var a = S >= r.digits.length ? 0 : r.digits[S] 328 | , b = S - 1 >= r.digits.length ? 0 : r.digits[S - 1] 329 | , A = S - 2 >= r.digits.length ? 0 : r.digits[S - 2] 330 | , R = n >= t.digits.length ? 0 : t.digits[n] 331 | , h = n - 1 >= t.digits.length ? 0 : t.digits[n - 1]; 332 | s.digits[S - n - 1] = a == R ? m : Math.floor((a * N + b) / R); 333 | for (var U = s.digits[S - n - 1] * (R * N + h), f = 4294967296 * a + (b * N + A); f < U; ) 334 | --s.digits[S - n - 1], 335 | U = s.digits[S - n - 1] * (R * N | h), 336 | f = a * N * N + (b * N + A); 337 | u = RSAUtils.biMultiplyByRadixPower(t, S - n - 1), 338 | (r = RSAUtils.biSubtract(r, RSAUtils.biMultiplyDigit(u, s.digits[S - n - 1]))).isNeg && (r = RSAUtils.biAdd(r, u), 339 | --s.digits[S - n - 1]) 340 | } 341 | return r = RSAUtils.biShiftRight(r, d), 342 | s.isNeg = i.isNeg != g, 343 | i.isNeg && (s = g ? RSAUtils.biAdd(s, v) : RSAUtils.biSubtract(s, v), 344 | t = RSAUtils.biShiftRight(t, d), 345 | r = RSAUtils.biSubtract(t, r)), 346 | 0 == r.digits[0] && 0 == RSAUtils.biHighIndex(r) && (r.isNeg = !1), 347 | [s, r] 348 | } 349 | , 350 | RSAUtils.biDivide = function(i, t) { 351 | return RSAUtils.biDivideModulo(i, t)[0] 352 | } 353 | , 354 | RSAUtils.biModulo = function(i, t) { 355 | return RSAUtils.biDivideModulo(i, t)[1] 356 | } 357 | , 358 | RSAUtils.biMultiplyMod = function(i, t, s) { 359 | return RSAUtils.biModulo(RSAUtils.biMultiply(i, t), s) 360 | } 361 | , 362 | RSAUtils.biPow = function(i, t) { 363 | for (var s = v, r = i; 0 != (1 & t) && (s = RSAUtils.biMultiply(s, r)), 364 | 0 != (t >>= 1); ) 365 | r = RSAUtils.biMultiply(r, r); 366 | return s 367 | } 368 | , 369 | RSAUtils.biPowMod = function(i, t, s) { 370 | for (var r = v, e = i, l = t; 0 != (1 & l.digits[0]) && (r = RSAUtils.biMultiplyMod(r, e, s)), 371 | 0 != (l = RSAUtils.biShiftRight(l, 1)).digits[0] || 0 != RSAUtils.biHighIndex(l); ) 372 | e = RSAUtils.biMultiplyMod(e, e, s); 373 | return r 374 | } 375 | , 376 | e.BarrettMu = function(i) { 377 | this.modulus = RSAUtils.biCopy(i), 378 | this.k = RSAUtils.biHighIndex(this.modulus) + 1; 379 | var t = new M; 380 | t.digits[2 * this.k] = 1, 381 | this.mu = RSAUtils.biDivide(t, this.modulus), 382 | this.bkplus1 = new M, 383 | this.bkplus1.digits[this.k + 1] = 1, 384 | this.modulo = u, 385 | this.multiplyMod = S, 386 | this.powMod = a 387 | } 388 | ; 389 | function b(i, t, s) { 390 | var r = RSAUtils; 391 | this.e = r.biFromHex(i), 392 | this.d = r.biFromHex(t), 393 | this.m = r.biFromHex(s), 394 | this.chunkSize = 2 * r.biHighIndex(this.m), 395 | this.radix = 16, 396 | this.barrett = new e.BarrettMu(this.m) 397 | } 398 | RSAUtils.getKeyPair = function(i, t, s) { 399 | return new b(i,t,s) 400 | } 401 | , 402 | void 0 === e.twoDigit && (e.twoDigit = function(i) { 403 | return (i < 10 ? "0" : "") + String(i) 404 | } 405 | ), 406 | RSAUtils.encryptedString = function(i, t) { 407 | for (var s = [], r = t.length, e = 0; e < r; ) 408 | s[e] = t.charCodeAt(e), 409 | e++; 410 | for (; s.length % i.chunkSize != 0; ) 411 | s[e++] = 0; 412 | var l, g, n, d = s.length, o = ""; 413 | for (e = 0; e < d; e += i.chunkSize) { 414 | for (n = new M, 415 | l = 0, 416 | g = e; g < e + i.chunkSize; ++l) 417 | n.digits[l] = s[g++], 418 | n.digits[l] += s[g++] << 8; 419 | var u = i.barrett.powMod(n, i.e); 420 | o += (16 == i.radix ? RSAUtils.biToHex(u) : RSAUtils.biToString(u, i.radix)) + " " 421 | } 422 | return o.substring(0, o.length - 1) 423 | } 424 | , 425 | RSAUtils.decryptedString = function(i, t) { 426 | var s, r, e, l = t.split(" "), g = ""; 427 | for (s = 0; s < l.length; ++s) { 428 | var n; 429 | for (n = 16 == i.radix ? RSAUtils.biFromHex(l[s]) : RSAUtils.biFromString(l[s], i.radix), 430 | e = i.barrett.powMod(n, i.d), 431 | r = 0; r <= RSAUtils.biHighIndex(e); ++r) 432 | g += String.fromCharCode(255 & e.digits[r], e.digits[r] >> 8) 433 | } 434 | return 0 == g.charCodeAt(g.length - 1) && (g = g.substring(0, g.length - 1)), 435 | g 436 | } 437 | , 438 | RSAUtils.setMaxDigits(130) 439 | }(window); 440 | function encryptString(i) { 441 | var t = "010001" 442 | , s = "008baf14121377fc76eaf7794b8a8af17085628c3590df47e6534574efcfd81ef8635fcdc67d141c15f51649a89533df0db839331e30b8f8e4440ebf7ccbcc494f4ba18e9f492534b8aafc1b1057429ac851d3d9eb66e86fce1b04527c7b95a2431b07ea277cde2365876e2733325df04389a9d891c5d36b7bc752140db74cb69f"; 443 | var r = RSAUtils.getKeyPair(t, "", s); 444 | return RSAUtils.encryptedString(r, 1411093327735 + i) 445 | } 446 | console.log(encryptString('111111')) 447 | -------------------------------------------------------------------------------- /00-通用加密/RSAEncrypt.js: -------------------------------------------------------------------------------- 1 | var navigator = {}; 2 | navigator.appName = "Netscape"; 3 | 4 | var RSA = RSA || function() { 5 | function t(t, e) { 6 | return new r(t,e) 7 | } 8 | function e(t, e) { 9 | if (e < t.length + 11) 10 | return uv_alert("Message too long for RSA"), 11 | null; 12 | for (var i = new Array, n = t.length - 1; n >= 0 && e > 0; ) { 13 | var o = t.charCodeAt(n--); 14 | i[--e] = o 15 | } 16 | i[--e] = 0; 17 | for (var p = new Y, s = new Array; e > 2; ) { 18 | for (s[0] = 0; 0 == s[0]; ) 19 | p.nextBytes(s); 20 | i[--e] = s[0] 21 | } 22 | return i[--e] = 2, 23 | i[--e] = 0, 24 | new r(i) 25 | } 26 | function i() { 27 | this.n = null, 28 | this.e = 0, 29 | this.d = null, 30 | this.p = null, 31 | this.q = null, 32 | this.dmp1 = null, 33 | this.dmq1 = null, 34 | this.coeff = null 35 | } 36 | function n(e, i) { 37 | null != e && null != i && e.length > 0 && i.length > 0 ? (this.n = t(e, 16), 38 | this.e = parseInt(i, 16)) : uv_alert("Invalid RSA public key") 39 | } 40 | function o(t) { 41 | return t.modPowInt(this.e, this.n) 42 | } 43 | function p(t) { 44 | var i = e(t, this.n.bitLength() + 7 >> 3); 45 | if (null == i) 46 | return null; 47 | var n = this.doPublic(i); 48 | if (null == n) 49 | return null; 50 | var o = n.toString(16); 51 | return 0 == (1 & o.length) ? o : "0" + o 52 | } 53 | function r(t, e, i) { 54 | null != t && ("number" == typeof t ? this.fromNumber(t, e, i) : null == e && "string" != typeof t ? this.fromString(t, 256) : this.fromString(t, e)) 55 | } 56 | function s() { 57 | return new r(null) 58 | } 59 | function a(t, e, i, n, o, p) { 60 | for (; --p >= 0; ) { 61 | var r = e * this[t++] + i[n] + o; 62 | o = Math.floor(r / 67108864), 63 | i[n++] = 67108863 & r 64 | } 65 | return o 66 | } 67 | function l(t, e, i, n, o, p) { 68 | for (var r = 32767 & e, s = e >> 15; --p >= 0; ) { 69 | var a = 32767 & this[t] 70 | , l = this[t++] >> 15 71 | , c = s * a + l * r; 72 | a = r * a + ((32767 & c) << 15) + i[n] + (1073741823 & o), 73 | o = (a >>> 30) + (c >>> 15) + s * l + (o >>> 30), 74 | i[n++] = 1073741823 & a 75 | } 76 | return o 77 | } 78 | function c(t, e, i, n, o, p) { 79 | for (var r = 16383 & e, s = e >> 14; --p >= 0; ) { 80 | var a = 16383 & this[t] 81 | , l = this[t++] >> 14 82 | , c = s * a + l * r; 83 | a = r * a + ((16383 & c) << 14) + i[n] + o, 84 | o = (a >> 28) + (c >> 14) + s * l, 85 | i[n++] = 268435455 & a 86 | } 87 | return o 88 | } 89 | function u(t) { 90 | return at.charAt(t) 91 | } 92 | function g(t, e) { 93 | var i = lt[t.charCodeAt(e)]; 94 | return null == i ? -1 : i 95 | } 96 | function d(t) { 97 | for (var e = this.t - 1; e >= 0; --e) 98 | t[e] = this[e]; 99 | t.t = this.t, 100 | t.s = this.s 101 | } 102 | function h(t) { 103 | this.t = 1, 104 | this.s = t < 0 ? -1 : 0, 105 | t > 0 ? this[0] = t : t < -1 ? this[0] = t + DV : this.t = 0 106 | } 107 | function f(t) { 108 | var e = s(); 109 | return e.fromInt(t), 110 | e 111 | } 112 | function _(t, e) { 113 | var i; 114 | if (16 == e) 115 | i = 4; 116 | else if (8 == e) 117 | i = 3; 118 | else if (256 == e) 119 | i = 8; 120 | else if (2 == e) 121 | i = 1; 122 | else if (32 == e) 123 | i = 5; 124 | else { 125 | if (4 != e) 126 | return void this.fromRadix(t, e); 127 | i = 2 128 | } 129 | this.t = 0, 130 | this.s = 0; 131 | for (var n = t.length, o = !1, p = 0; --n >= 0; ) { 132 | var s = 8 == i ? 255 & t[n] : g(t, n); 133 | s < 0 ? "-" == t.charAt(n) && (o = !0) : (o = !1, 134 | 0 == p ? this[this.t++] = s : p + i > this.DB ? (this[this.t - 1] |= (s & (1 << this.DB - p) - 1) << p, 135 | this[this.t++] = s >> this.DB - p) : this[this.t - 1] |= s << p, 136 | (p += i) >= this.DB && (p -= this.DB)) 137 | } 138 | 8 == i && 0 != (128 & t[0]) && (this.s = -1, 139 | p > 0 && (this[this.t - 1] |= (1 << this.DB - p) - 1 << p)), 140 | this.clamp(), 141 | o && r.ZERO.subTo(this, this) 142 | } 143 | function m() { 144 | for (var t = this.s & this.DM; this.t > 0 && this[this.t - 1] == t; ) 145 | --this.t 146 | } 147 | function $(t) { 148 | if (this.s < 0) 149 | return "-" + this.negate().toString(t); 150 | var e; 151 | if (16 == t) 152 | e = 4; 153 | else if (8 == t) 154 | e = 3; 155 | else if (2 == t) 156 | e = 1; 157 | else if (32 == t) 158 | e = 5; 159 | else { 160 | if (4 != t) 161 | return this.toRadix(t); 162 | e = 2 163 | } 164 | var i, n = (1 << e) - 1, o = !1, p = "", r = this.t, s = this.DB - r * this.DB % e; 165 | if (r-- > 0) 166 | for (s < this.DB && (i = this[r] >> s) > 0 && (o = !0, 167 | p = u(i)); r >= 0; ) 168 | s < e ? (i = (this[r] & (1 << s) - 1) << e - s, 169 | i |= this[--r] >> (s += this.DB - e)) : (i = this[r] >> (s -= e) & n, 170 | s <= 0 && (s += this.DB, 171 | --r)), 172 | i > 0 && (o = !0), 173 | o && (p += u(i)); 174 | return o ? p : "0" 175 | } 176 | function v() { 177 | var t = s(); 178 | return r.ZERO.subTo(this, t), 179 | t 180 | } 181 | function y() { 182 | return this.s < 0 ? this.negate() : this 183 | } 184 | function w(t) { 185 | var e = this.s - t.s; 186 | if (0 != e) 187 | return e; 188 | var i = this.t; 189 | if (0 != (e = i - t.t)) 190 | return e; 191 | for (; --i >= 0; ) 192 | if (0 != (e = this[i] - t[i])) 193 | return e; 194 | return 0 195 | } 196 | function k(t) { 197 | var e, i = 1; 198 | return 0 != (e = t >>> 16) && (t = e, 199 | i += 16), 200 | 0 != (e = t >> 8) && (t = e, 201 | i += 8), 202 | 0 != (e = t >> 4) && (t = e, 203 | i += 4), 204 | 0 != (e = t >> 2) && (t = e, 205 | i += 2), 206 | 0 != (e = t >> 1) && (t = e, 207 | i += 1), 208 | i 209 | } 210 | function b() { 211 | return this.t <= 0 ? 0 : this.DB * (this.t - 1) + k(this[this.t - 1] ^ this.s & this.DM) 212 | } 213 | function q(t, e) { 214 | var i; 215 | for (i = this.t - 1; i >= 0; --i) 216 | e[i + t] = this[i]; 217 | for (i = t - 1; i >= 0; --i) 218 | e[i] = 0; 219 | e.t = this.t + t, 220 | e.s = this.s 221 | } 222 | function S(t, e) { 223 | for (var i = t; i < this.t; ++i) 224 | e[i - t] = this[i]; 225 | e.t = Math.max(this.t - t, 0), 226 | e.s = this.s 227 | } 228 | function C(t, e) { 229 | var i, n = t % this.DB, o = this.DB - n, p = (1 << o) - 1, r = Math.floor(t / this.DB), s = this.s << n & this.DM; 230 | for (i = this.t - 1; i >= 0; --i) 231 | e[i + r + 1] = this[i] >> o | s, 232 | s = (this[i] & p) << n; 233 | for (i = r - 1; i >= 0; --i) 234 | e[i] = 0; 235 | e[r] = s, 236 | e.t = this.t + r + 1, 237 | e.s = this.s, 238 | e.clamp() 239 | } 240 | function T(t, e) { 241 | e.s = this.s; 242 | var i = Math.floor(t / this.DB); 243 | if (i >= this.t) 244 | return void (e.t = 0); 245 | var n = t % this.DB 246 | , o = this.DB - n 247 | , p = (1 << n) - 1; 248 | e[0] = this[i] >> n; 249 | for (var r = i + 1; r < this.t; ++r) 250 | e[r - i - 1] |= (this[r] & p) << o, 251 | e[r - i] = this[r] >> n; 252 | n > 0 && (e[this.t - i - 1] |= (this.s & p) << o), 253 | e.t = this.t - i, 254 | e.clamp() 255 | } 256 | function x(t, e) { 257 | for (var i = 0, n = 0, o = Math.min(t.t, this.t); i < o; ) 258 | n += this[i] - t[i], 259 | e[i++] = n & this.DM, 260 | n >>= this.DB; 261 | if (t.t < this.t) { 262 | for (n -= t.s; i < this.t; ) 263 | n += this[i], 264 | e[i++] = n & this.DM, 265 | n >>= this.DB; 266 | n += this.s 267 | } else { 268 | for (n += this.s; i < t.t; ) 269 | n -= t[i], 270 | e[i++] = n & this.DM, 271 | n >>= this.DB; 272 | n -= t.s 273 | } 274 | e.s = n < 0 ? -1 : 0, 275 | n < -1 ? e[i++] = this.DV + n : n > 0 && (e[i++] = n), 276 | e.t = i, 277 | e.clamp() 278 | } 279 | function L(t, e) { 280 | var i = this.abs() 281 | , n = t.abs() 282 | , o = i.t; 283 | for (e.t = o + n.t; --o >= 0; ) 284 | e[o] = 0; 285 | for (o = 0; o < n.t; ++o) 286 | e[o + i.t] = i.am(0, n[o], e, o, 0, i.t); 287 | e.s = 0, 288 | e.clamp(), 289 | this.s != t.s && r.ZERO.subTo(e, e) 290 | } 291 | function N(t) { 292 | for (var e = this.abs(), i = t.t = 2 * e.t; --i >= 0; ) 293 | t[i] = 0; 294 | for (i = 0; i < e.t - 1; ++i) { 295 | var n = e.am(i, e[i], t, 2 * i, 0, 1); 296 | (t[i + e.t] += e.am(i + 1, 2 * e[i], t, 2 * i + 1, n, e.t - i - 1)) >= e.DV && (t[i + e.t] -= e.DV, 297 | t[i + e.t + 1] = 1) 298 | } 299 | t.t > 0 && (t[t.t - 1] += e.am(i, e[i], t, 2 * i, 0, 1)), 300 | t.s = 0, 301 | t.clamp() 302 | } 303 | function E(t, e, i) { 304 | var n = t.abs(); 305 | if (!(n.t <= 0)) { 306 | var o = this.abs(); 307 | if (o.t < n.t) 308 | return null != e && e.fromInt(0), 309 | void (null != i && this.copyTo(i)); 310 | null == i && (i = s()); 311 | var p = s() 312 | , a = this.s 313 | , l = t.s 314 | , c = this.DB - k(n[n.t - 1]); 315 | c > 0 ? (n.lShiftTo(c, p), 316 | o.lShiftTo(c, i)) : (n.copyTo(p), 317 | o.copyTo(i)); 318 | var u = p.t 319 | , g = p[u - 1]; 320 | if (0 != g) { 321 | var d = g * (1 << this.F1) + (u > 1 ? p[u - 2] >> this.F2 : 0) 322 | , h = this.FV / d 323 | , f = (1 << this.F1) / d 324 | , _ = 1 << this.F2 325 | , m = i.t 326 | , $ = m - u 327 | , v = null == e ? s() : e; 328 | for (p.dlShiftTo($, v), 329 | i.compareTo(v) >= 0 && (i[i.t++] = 1, 330 | i.subTo(v, i)), 331 | r.ONE.dlShiftTo(u, v), 332 | v.subTo(p, p); p.t < u; ) 333 | p[p.t++] = 0; 334 | for (; --$ >= 0; ) { 335 | var y = i[--m] == g ? this.DM : Math.floor(i[m] * h + (i[m - 1] + _) * f); 336 | if ((i[m] += p.am(0, y, i, $, 0, u)) < y) 337 | for (p.dlShiftTo($, v), 338 | i.subTo(v, i); i[m] < --y; ) 339 | i.subTo(v, i) 340 | } 341 | null != e && (i.drShiftTo(u, e), 342 | a != l && r.ZERO.subTo(e, e)), 343 | i.t = u, 344 | i.clamp(), 345 | c > 0 && i.rShiftTo(c, i), 346 | a < 0 && r.ZERO.subTo(i, i) 347 | } 348 | } 349 | } 350 | function P(t) { 351 | var e = s(); 352 | return this.abs().divRemTo(t, null, e), 353 | this.s < 0 && e.compareTo(r.ZERO) > 0 && t.subTo(e, e), 354 | e 355 | } 356 | function A(t) { 357 | this.m = t 358 | } 359 | function I(t) { 360 | return t.s < 0 || t.compareTo(this.m) >= 0 ? t.mod(this.m) : t 361 | } 362 | function Q(t) { 363 | return t 364 | } 365 | function M(t) { 366 | t.divRemTo(this.m, null, t) 367 | } 368 | function D(t, e, i) { 369 | t.multiplyTo(e, i), 370 | this.reduce(i) 371 | } 372 | function U(t, e) { 373 | t.squareTo(e), 374 | this.reduce(e) 375 | } 376 | function B() { 377 | if (this.t < 1) 378 | return 0; 379 | var t = this[0]; 380 | if (0 == (1 & t)) 381 | return 0; 382 | var e = 3 & t; 383 | return e = e * (2 - (15 & t) * e) & 15, 384 | e = e * (2 - (255 & t) * e) & 255, 385 | e = e * (2 - ((65535 & t) * e & 65535)) & 65535, 386 | e = e * (2 - t * e % this.DV) % this.DV, 387 | e > 0 ? this.DV - e : -e 388 | } 389 | function H(t) { 390 | this.m = t, 391 | this.mp = t.invDigit(), 392 | this.mpl = 32767 & this.mp, 393 | this.mph = this.mp >> 15, 394 | this.um = (1 << t.DB - 15) - 1, 395 | this.mt2 = 2 * t.t 396 | } 397 | function O(t) { 398 | var e = s(); 399 | return t.abs().dlShiftTo(this.m.t, e), 400 | e.divRemTo(this.m, null, e), 401 | t.s < 0 && e.compareTo(r.ZERO) > 0 && this.m.subTo(e, e), 402 | e 403 | } 404 | function V(t) { 405 | var e = s(); 406 | return t.copyTo(e), 407 | this.reduce(e), 408 | e 409 | } 410 | function j(t) { 411 | for (; t.t <= this.mt2; ) 412 | t[t.t++] = 0; 413 | for (var e = 0; e < this.m.t; ++e) { 414 | var i = 32767 & t[e] 415 | , n = i * this.mpl + ((i * this.mph + (t[e] >> 15) * this.mpl & this.um) << 15) & t.DM; 416 | for (i = e + this.m.t, 417 | t[i] += this.m.am(0, n, t, e, 0, this.m.t); t[i] >= t.DV; ) 418 | t[i] -= t.DV, 419 | t[++i]++ 420 | } 421 | t.clamp(), 422 | t.drShiftTo(this.m.t, t), 423 | t.compareTo(this.m) >= 0 && t.subTo(this.m, t) 424 | } 425 | function R(t, e) { 426 | t.squareTo(e), 427 | this.reduce(e) 428 | } 429 | function F(t, e, i) { 430 | t.multiplyTo(e, i), 431 | this.reduce(i) 432 | } 433 | function G() { 434 | return 0 == (this.t > 0 ? 1 & this[0] : this.s) 435 | } 436 | function z(t, e) { 437 | if (t > 4294967295 || t < 1) 438 | return r.ONE; 439 | var i = s() 440 | , n = s() 441 | , o = e.convert(this) 442 | , p = k(t) - 1; 443 | for (o.copyTo(i); --p >= 0; ) 444 | if (e.sqrTo(i, n), 445 | (t & 1 << p) > 0) 446 | e.mulTo(n, o, i); 447 | else { 448 | var a = i; 449 | i = n, 450 | n = a 451 | } 452 | return e.revert(i) 453 | } 454 | function W(t, e) { 455 | var i; 456 | return i = t < 256 || e.isEven() ? new A(e) : new H(e), 457 | this.exp(t, i) 458 | } 459 | function X(t) { 460 | ut[gt++] ^= 255 & t, 461 | ut[gt++] ^= t >> 8 & 255, 462 | ut[gt++] ^= t >> 16 & 255, 463 | ut[gt++] ^= t >> 24 & 255, 464 | gt >= ft && (gt -= ft) 465 | } 466 | function Z() { 467 | X((new Date).getTime()) 468 | } 469 | function K() { 470 | if (null == ct) { 471 | for (Z(), 472 | ct = nt(), 473 | ct.init(ut), 474 | gt = 0; gt < ut.length; ++gt) 475 | ut[gt] = 0; 476 | gt = 0 477 | } 478 | return ct.next() 479 | } 480 | function J(t) { 481 | var e; 482 | for (e = 0; e < t.length; ++e) 483 | t[e] = K() 484 | } 485 | function Y() {} 486 | function tt() { 487 | this.i = 0, 488 | this.j = 0, 489 | this.S = new Array 490 | } 491 | function et(t) { 492 | var e, i, n; 493 | for (e = 0; e < 256; ++e) 494 | this.S[e] = e; 495 | for (i = 0, 496 | e = 0; e < 256; ++e) 497 | i = i + this.S[e] + t[e % t.length] & 255, 498 | n = this.S[e], 499 | this.S[e] = this.S[i], 500 | this.S[i] = n; 501 | this.i = 0, 502 | this.j = 0 503 | } 504 | function it() { 505 | var t; 506 | return this.i = this.i + 1 & 255, 507 | this.j = this.j + this.S[this.i] & 255, 508 | t = this.S[this.i], 509 | this.S[this.i] = this.S[this.j], 510 | this.S[this.j] = t, 511 | this.S[t + this.S[this.i] & 255] 512 | } 513 | function nt() { 514 | return new tt 515 | } 516 | function ot(t, e, n) { 517 | var o = new i; 518 | return o.setPublic(e, n), 519 | o.encrypt(t) 520 | } 521 | i.prototype.doPublic = o, 522 | i.prototype.setPublic = n, 523 | i.prototype.encrypt = p; 524 | var pt; 525 | "Microsoft Internet Explorer" == navigator.appName ? (r.prototype.am = l, 526 | pt = 30) : "Netscape" != navigator.appName ? (r.prototype.am = a, 527 | pt = 26) : (r.prototype.am = c, 528 | pt = 28), 529 | r.prototype.DB = pt, 530 | r.prototype.DM = (1 << pt) - 1, 531 | r.prototype.DV = 1 << pt; 532 | r.prototype.FV = Math.pow(2, 52), 533 | r.prototype.F1 = 52 - pt, 534 | r.prototype.F2 = 2 * pt - 52; 535 | var rt, st, at = "0123456789abcdefghijklmnopqrstuvwxyz", lt = new Array; 536 | for (rt = "0".charCodeAt(0), 537 | st = 0; st <= 9; ++st) 538 | lt[rt++] = st; 539 | for (rt = "a".charCodeAt(0), 540 | st = 10; st < 36; ++st) 541 | lt[rt++] = st; 542 | for (rt = "A".charCodeAt(0), 543 | st = 10; st < 36; ++st) 544 | lt[rt++] = st; 545 | A.prototype.convert = I, 546 | A.prototype.revert = Q, 547 | A.prototype.reduce = M, 548 | A.prototype.mulTo = D, 549 | A.prototype.sqrTo = U, 550 | H.prototype.convert = O, 551 | H.prototype.revert = V, 552 | H.prototype.reduce = j, 553 | H.prototype.mulTo = F, 554 | H.prototype.sqrTo = R, 555 | r.prototype.copyTo = d, 556 | r.prototype.fromInt = h, 557 | r.prototype.fromString = _, 558 | r.prototype.clamp = m, 559 | r.prototype.dlShiftTo = q, 560 | r.prototype.drShiftTo = S, 561 | r.prototype.lShiftTo = C, 562 | r.prototype.rShiftTo = T, 563 | r.prototype.subTo = x, 564 | r.prototype.multiplyTo = L, 565 | r.prototype.squareTo = N, 566 | r.prototype.divRemTo = E, 567 | r.prototype.invDigit = B, 568 | r.prototype.isEven = G, 569 | r.prototype.exp = z, 570 | r.prototype.toString = $, 571 | r.prototype.negate = v, 572 | r.prototype.abs = y, 573 | r.prototype.compareTo = w, 574 | r.prototype.bitLength = b, 575 | r.prototype.mod = P, 576 | r.prototype.modPowInt = W, 577 | r.ZERO = f(0), 578 | r.ONE = f(1); 579 | var ct, ut, gt; 580 | if (null == ut) { 581 | ut = new Array, 582 | gt = 0; 583 | var dt; 584 | if ("Netscape" == navigator.appName && navigator.appVersion < "5" && window.crypto && window.crypto.random) { 585 | var ht = window.crypto.random(32); 586 | for (dt = 0; dt < ht.length; ++dt) 587 | ut[gt++] = 255 & ht.charCodeAt(dt) 588 | } 589 | for (; gt < ft; ) 590 | dt = Math.floor(65536 * Math.random()), 591 | ut[gt++] = dt >>> 8, 592 | ut[gt++] = 255 & dt; 593 | gt = 0, 594 | Z() 595 | } 596 | Y.prototype.nextBytes = J, 597 | tt.prototype.init = et, 598 | tt.prototype.next = it; 599 | var ft = 256; 600 | return { 601 | rsa_encrypt: ot 602 | } 603 | }() 604 | 605 | // 这种RSA加密,加密相同明文,密文会变 606 | function RSAEncrypt(t) { 607 | var e = "00833c4af965ff7a8409f8b5d5a83d87f2f19d7c1eb40dc59a98d2346cbb145046b2c6facc25b5cc363443f0f7ebd9524b7c1e1917bf7d849212339f6c1d3711b115ecb20f0c89fc2182a985ea28cbb4adf6a321ff7e715ba9b8d7261d1c140485df3b705247a70c28c9068caabbedbf9510dada6d13d99e57642b853a73406817"; 608 | var n = "010001"; 609 | return RSA.rsa_encrypt(t, e, n) 610 | } 611 | console.log(RSAEncrypt("111111")) 612 | -------------------------------------------------------------------------------- /05-TAPD登录AES加密/tapd.js: -------------------------------------------------------------------------------- 1 | var CryptoJS = CryptoJS || function(t, e) { 2 | var r = {} 3 | , i = r.lib = {} 4 | , n = function() {} 5 | , s = i.Base = { 6 | extend: function(t) { 7 | n.prototype = this; 8 | var e = new n; 9 | return t && e.mixIn(t), 10 | e.hasOwnProperty("init") || (e.init = function() { 11 | e.$super.init.apply(this, arguments) 12 | } 13 | ), 14 | e.init.prototype = e, 15 | e.$super = this, 16 | e 17 | }, 18 | create: function() { 19 | var t = this.extend(); 20 | return t.init.apply(t, arguments), 21 | t 22 | }, 23 | init: function() {}, 24 | mixIn: function(t) { 25 | for (var e in t) 26 | t.hasOwnProperty(e) && (this[e] = t[e]); 27 | t.hasOwnProperty("toString") && (this.toString = t.toString) 28 | }, 29 | clone: function() { 30 | return this.init.prototype.extend(this) 31 | } 32 | } 33 | , o = i.WordArray = s.extend({ 34 | init: function(t, r) { 35 | t = this.words = t || [], 36 | this.sigBytes = r != e ? r : 4 * t.length 37 | }, 38 | toString: function(t) { 39 | return (t || a).stringify(this) 40 | }, 41 | concat: function(t) { 42 | var e = this.words 43 | , r = t.words 44 | , i = this.sigBytes; 45 | if (t = t.sigBytes, 46 | this.clamp(), 47 | i % 4) 48 | for (var n = 0; t > n; n++) 49 | e[i + n >>> 2] |= (r[n >>> 2] >>> 24 - 8 * (n % 4) & 255) << 24 - 8 * ((i + n) % 4); 50 | else if (65535 < r.length) 51 | for (n = 0; t > n; n += 4) 52 | e[i + n >>> 2] = r[n >>> 2]; 53 | else 54 | e.push.apply(e, r); 55 | return this.sigBytes += t, 56 | this 57 | }, 58 | clamp: function() { 59 | var e = this.words 60 | , r = this.sigBytes; 61 | e[r >>> 2] &= 4294967295 << 32 - 8 * (r % 4), 62 | e.length = t.ceil(r / 4) 63 | }, 64 | clone: function() { 65 | var t = s.clone.call(this); 66 | return t.words = this.words.slice(0), 67 | t 68 | }, 69 | random: function(e) { 70 | for (var r = [], i = 0; e > i; i += 4) 71 | r.push(4294967296 * t.random() | 0); 72 | return new o.init(r,e) 73 | } 74 | }) 75 | , c = r.enc = {} 76 | , a = c.Hex = { 77 | stringify: function(t) { 78 | var e = t.words; 79 | t = t.sigBytes; 80 | for (var r = [], i = 0; t > i; i++) { 81 | var n = e[i >>> 2] >>> 24 - 8 * (i % 4) & 255; 82 | r.push((n >>> 4).toString(16)), 83 | r.push((15 & n).toString(16)) 84 | } 85 | return r.join("") 86 | }, 87 | parse: function(t) { 88 | for (var e = t.length, r = [], i = 0; e > i; i += 2) 89 | r[i >>> 3] |= parseInt(t.substr(i, 2), 16) << 24 - 4 * (i % 8); 90 | return new o.init(r,e / 2) 91 | } 92 | } 93 | , f = c.Latin1 = { 94 | stringify: function(t) { 95 | var e = t.words; 96 | t = t.sigBytes; 97 | for (var r = [], i = 0; t > i; i++) 98 | r.push(String.fromCharCode(e[i >>> 2] >>> 24 - 8 * (i % 4) & 255)); 99 | return r.join("") 100 | }, 101 | parse: function(t) { 102 | for (var e = t.length, r = [], i = 0; e > i; i++) 103 | r[i >>> 2] |= (255 & t.charCodeAt(i)) << 24 - 8 * (i % 4); 104 | return new o.init(r,e) 105 | } 106 | } 107 | , h = c.Utf8 = { 108 | stringify: function(t) { 109 | try { 110 | return decodeURIComponent(escape(f.stringify(t))) 111 | } catch (e) { 112 | throw Error("Malformed UTF-8 data") 113 | } 114 | }, 115 | parse: function(t) { 116 | return f.parse(unescape(encodeURIComponent(t))) 117 | } 118 | } 119 | , u = i.BufferedBlockAlgorithm = s.extend({ 120 | reset: function() { 121 | this._data = new o.init, 122 | this._nDataBytes = 0 123 | }, 124 | _append: function(t) { 125 | "string" == typeof t && (t = h.parse(t)), 126 | this._data.concat(t), 127 | this._nDataBytes += t.sigBytes 128 | }, 129 | _process: function(e) { 130 | var r = this._data 131 | , i = r.words 132 | , n = r.sigBytes 133 | , s = this.blockSize 134 | , c = n / (4 * s) 135 | , c = e ? t.ceil(c) : t.max((0 | c) - this._minBufferSize, 0); 136 | if (e = c * s, 137 | n = t.min(4 * e, n), 138 | e) { 139 | for (var a = 0; e > a; a += s) 140 | this._doProcessBlock(i, a); 141 | a = i.splice(0, e), 142 | r.sigBytes -= n 143 | } 144 | return new o.init(a,n) 145 | }, 146 | clone: function() { 147 | var t = s.clone.call(this); 148 | return t._data = this._data.clone(), 149 | t 150 | }, 151 | _minBufferSize: 0 152 | }); 153 | i.Hasher = u.extend({ 154 | cfg: s.extend(), 155 | init: function(t) { 156 | this.cfg = this.cfg.extend(t), 157 | this.reset() 158 | }, 159 | reset: function() { 160 | u.reset.call(this), 161 | this._doReset() 162 | }, 163 | update: function(t) { 164 | return this._append(t), 165 | this._process(), 166 | this 167 | }, 168 | finalize: function(t) { 169 | return t && this._append(t), 170 | this._doFinalize() 171 | }, 172 | blockSize: 16, 173 | _createHelper: function(t) { 174 | return function(e, r) { 175 | return new t.init(r).finalize(e) 176 | } 177 | }, 178 | _createHmacHelper: function(t) { 179 | return function(e, r) { 180 | return new p.HMAC.init(t,r).finalize(e) 181 | } 182 | } 183 | }); 184 | var p = r.algo = {}; 185 | return r 186 | }(Math); 187 | !function() { 188 | var t = CryptoJS 189 | , e = t.lib.WordArray; 190 | t.enc.Base64 = { 191 | stringify: function(t) { 192 | var e = t.words 193 | , r = t.sigBytes 194 | , i = this._map; 195 | t.clamp(), 196 | t = []; 197 | for (var n = 0; r > n; n += 3) 198 | for (var s = (e[n >>> 2] >>> 24 - 8 * (n % 4) & 255) << 16 | (e[n + 1 >>> 2] >>> 24 - 8 * ((n + 1) % 4) & 255) << 8 | e[n + 2 >>> 2] >>> 24 - 8 * ((n + 2) % 4) & 255, o = 0; 4 > o && r > n + .75 * o; o++) 199 | t.push(i.charAt(s >>> 6 * (3 - o) & 63)); 200 | if (e = i.charAt(64)) 201 | for (; t.length % 4; ) 202 | t.push(e); 203 | return t.join("") 204 | }, 205 | parse: function(t) { 206 | var r = t.length 207 | , i = this._map 208 | , n = i.charAt(64); 209 | n && (n = t.indexOf(n), 210 | -1 != n && (r = n)); 211 | for (var n = [], s = 0, o = 0; r > o; o++) 212 | if (o % 4) { 213 | var c = i.indexOf(t.charAt(o - 1)) << 2 * (o % 4) 214 | , a = i.indexOf(t.charAt(o)) >>> 6 - 2 * (o % 4); 215 | n[s >>> 2] |= (c | a) << 24 - 8 * (s % 4), 216 | s++ 217 | } 218 | return e.create(n, s) 219 | }, 220 | _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" 221 | } 222 | }(), 223 | function(t) { 224 | function e(t, e, r, i, n, s, o) { 225 | return t = t + (e & r | ~e & i) + n + o, 226 | (t << s | t >>> 32 - s) + e 227 | } 228 | function r(t, e, r, i, n, s, o) { 229 | return t = t + (e & i | r & ~i) + n + o, 230 | (t << s | t >>> 32 - s) + e 231 | } 232 | function i(t, e, r, i, n, s, o) { 233 | return t = t + (e ^ r ^ i) + n + o, 234 | (t << s | t >>> 32 - s) + e 235 | } 236 | function n(t, e, r, i, n, s, o) { 237 | return t = t + (r ^ (e | ~i)) + n + o, 238 | (t << s | t >>> 32 - s) + e 239 | } 240 | for (var s = CryptoJS, o = s.lib, c = o.WordArray, a = o.Hasher, o = s.algo, f = [], h = 0; 64 > h; h++) 241 | f[h] = 4294967296 * t.abs(t.sin(h + 1)) | 0; 242 | o = o.MD5 = a.extend({ 243 | _doReset: function() { 244 | this._hash = new c.init([1732584193, 4023233417, 2562383102, 271733878]) 245 | }, 246 | _doProcessBlock: function(t, s) { 247 | for (var o = 0; 16 > o; o++) { 248 | var c = s + o 249 | , a = t[c]; 250 | t[c] = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8) 251 | } 252 | var o = this._hash.words 253 | , c = t[s + 0] 254 | , a = t[s + 1] 255 | , h = t[s + 2] 256 | , u = t[s + 3] 257 | , p = t[s + 4] 258 | , d = t[s + 5] 259 | , l = t[s + 6] 260 | , y = t[s + 7] 261 | , _ = t[s + 8] 262 | , v = t[s + 9] 263 | , g = t[s + 10] 264 | , B = t[s + 11] 265 | , m = t[s + 12] 266 | , x = t[s + 13] 267 | , S = t[s + 14] 268 | , k = t[s + 15] 269 | , z = o[0] 270 | , C = o[1] 271 | , w = o[2] 272 | , D = o[3] 273 | , z = e(z, C, w, D, c, 7, f[0]) 274 | , D = e(D, z, C, w, a, 12, f[1]) 275 | , w = e(w, D, z, C, h, 17, f[2]) 276 | , C = e(C, w, D, z, u, 22, f[3]) 277 | , z = e(z, C, w, D, p, 7, f[4]) 278 | , D = e(D, z, C, w, d, 12, f[5]) 279 | , w = e(w, D, z, C, l, 17, f[6]) 280 | , C = e(C, w, D, z, y, 22, f[7]) 281 | , z = e(z, C, w, D, _, 7, f[8]) 282 | , D = e(D, z, C, w, v, 12, f[9]) 283 | , w = e(w, D, z, C, g, 17, f[10]) 284 | , C = e(C, w, D, z, B, 22, f[11]) 285 | , z = e(z, C, w, D, m, 7, f[12]) 286 | , D = e(D, z, C, w, x, 12, f[13]) 287 | , w = e(w, D, z, C, S, 17, f[14]) 288 | , C = e(C, w, D, z, k, 22, f[15]) 289 | , z = r(z, C, w, D, a, 5, f[16]) 290 | , D = r(D, z, C, w, l, 9, f[17]) 291 | , w = r(w, D, z, C, B, 14, f[18]) 292 | , C = r(C, w, D, z, c, 20, f[19]) 293 | , z = r(z, C, w, D, d, 5, f[20]) 294 | , D = r(D, z, C, w, g, 9, f[21]) 295 | , w = r(w, D, z, C, k, 14, f[22]) 296 | , C = r(C, w, D, z, p, 20, f[23]) 297 | , z = r(z, C, w, D, v, 5, f[24]) 298 | , D = r(D, z, C, w, S, 9, f[25]) 299 | , w = r(w, D, z, C, u, 14, f[26]) 300 | , C = r(C, w, D, z, _, 20, f[27]) 301 | , z = r(z, C, w, D, x, 5, f[28]) 302 | , D = r(D, z, C, w, h, 9, f[29]) 303 | , w = r(w, D, z, C, y, 14, f[30]) 304 | , C = r(C, w, D, z, m, 20, f[31]) 305 | , z = i(z, C, w, D, d, 4, f[32]) 306 | , D = i(D, z, C, w, _, 11, f[33]) 307 | , w = i(w, D, z, C, B, 16, f[34]) 308 | , C = i(C, w, D, z, S, 23, f[35]) 309 | , z = i(z, C, w, D, a, 4, f[36]) 310 | , D = i(D, z, C, w, p, 11, f[37]) 311 | , w = i(w, D, z, C, y, 16, f[38]) 312 | , C = i(C, w, D, z, g, 23, f[39]) 313 | , z = i(z, C, w, D, x, 4, f[40]) 314 | , D = i(D, z, C, w, c, 11, f[41]) 315 | , w = i(w, D, z, C, u, 16, f[42]) 316 | , C = i(C, w, D, z, l, 23, f[43]) 317 | , z = i(z, C, w, D, v, 4, f[44]) 318 | , D = i(D, z, C, w, m, 11, f[45]) 319 | , w = i(w, D, z, C, k, 16, f[46]) 320 | , C = i(C, w, D, z, h, 23, f[47]) 321 | , z = n(z, C, w, D, c, 6, f[48]) 322 | , D = n(D, z, C, w, y, 10, f[49]) 323 | , w = n(w, D, z, C, S, 15, f[50]) 324 | , C = n(C, w, D, z, d, 21, f[51]) 325 | , z = n(z, C, w, D, m, 6, f[52]) 326 | , D = n(D, z, C, w, u, 10, f[53]) 327 | , w = n(w, D, z, C, g, 15, f[54]) 328 | , C = n(C, w, D, z, a, 21, f[55]) 329 | , z = n(z, C, w, D, _, 6, f[56]) 330 | , D = n(D, z, C, w, k, 10, f[57]) 331 | , w = n(w, D, z, C, l, 15, f[58]) 332 | , C = n(C, w, D, z, x, 21, f[59]) 333 | , z = n(z, C, w, D, p, 6, f[60]) 334 | , D = n(D, z, C, w, B, 10, f[61]) 335 | , w = n(w, D, z, C, h, 15, f[62]) 336 | , C = n(C, w, D, z, v, 21, f[63]); 337 | o[0] = o[0] + z | 0, 338 | o[1] = o[1] + C | 0, 339 | o[2] = o[2] + w | 0, 340 | o[3] = o[3] + D | 0 341 | }, 342 | _doFinalize: function() { 343 | var e = this._data 344 | , r = e.words 345 | , i = 8 * this._nDataBytes 346 | , n = 8 * e.sigBytes; 347 | r[n >>> 5] |= 128 << 24 - n % 32; 348 | var s = t.floor(i / 4294967296); 349 | for (r[(n + 64 >>> 9 << 4) + 15] = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8), 350 | r[(n + 64 >>> 9 << 4) + 14] = 16711935 & (i << 8 | i >>> 24) | 4278255360 & (i << 24 | i >>> 8), 351 | e.sigBytes = 4 * (r.length + 1), 352 | this._process(), 353 | e = this._hash, 354 | r = e.words, 355 | i = 0; 4 > i; i++) 356 | n = r[i], 357 | r[i] = 16711935 & (n << 8 | n >>> 24) | 4278255360 & (n << 24 | n >>> 8); 358 | return e 359 | }, 360 | clone: function() { 361 | var t = a.clone.call(this); 362 | return t._hash = this._hash.clone(), 363 | t 364 | } 365 | }), 366 | s.MD5 = a._createHelper(o), 367 | s.HmacMD5 = a._createHmacHelper(o) 368 | }(Math), 369 | function() { 370 | var t = CryptoJS 371 | , e = t.lib 372 | , r = e.Base 373 | , i = e.WordArray 374 | , e = t.algo 375 | , n = e.EvpKDF = r.extend({ 376 | cfg: r.extend({ 377 | keySize: 4, 378 | hasher: e.MD5, 379 | iterations: 1 380 | }), 381 | init: function(t) { 382 | this.cfg = this.cfg.extend(t) 383 | }, 384 | compute: function(t, e) { 385 | for (var r = this.cfg, n = r.hasher.create(), s = i.create(), o = s.words, c = r.keySize, r = r.iterations; o.length < c; ) { 386 | a && n.update(a); 387 | var a = n.update(t).finalize(e); 388 | n.reset(); 389 | for (var f = 1; r > f; f++) 390 | a = n.finalize(a), 391 | n.reset(); 392 | s.concat(a) 393 | } 394 | return s.sigBytes = 4 * c, 395 | s 396 | } 397 | }); 398 | t.EvpKDF = function(t, e, r) { 399 | return n.create(r).compute(t, e) 400 | } 401 | }(), 402 | CryptoJS.lib.Cipher || function(t) { 403 | var e = CryptoJS 404 | , r = e.lib 405 | , i = r.Base 406 | , n = r.WordArray 407 | , s = r.BufferedBlockAlgorithm 408 | , o = e.enc.Base64 409 | , c = e.algo.EvpKDF 410 | , a = r.Cipher = s.extend({ 411 | cfg: i.extend(), 412 | createEncryptor: function(t, e) { 413 | return this.create(this._ENC_XFORM_MODE, t, e) 414 | }, 415 | createDecryptor: function(t, e) { 416 | return this.create(this._DEC_XFORM_MODE, t, e) 417 | }, 418 | init: function(t, e, r) { 419 | this.cfg = this.cfg.extend(r), 420 | this._xformMode = t, 421 | this._key = e, 422 | this.reset() 423 | }, 424 | reset: function() { 425 | s.reset.call(this), 426 | this._doReset() 427 | }, 428 | process: function(t) { 429 | return this._append(t), 430 | this._process() 431 | }, 432 | finalize: function(t) { 433 | return t && this._append(t), 434 | this._doFinalize() 435 | }, 436 | keySize: 4, 437 | ivSize: 4, 438 | _ENC_XFORM_MODE: 1, 439 | _DEC_XFORM_MODE: 2, 440 | _createHelper: function(t) { 441 | return { 442 | encrypt: function(e, r, i) { 443 | return ("string" == typeof r ? l : d).encrypt(t, e, r, i) 444 | }, 445 | decrypt: function(e, r, i) { 446 | return ("string" == typeof r ? l : d).decrypt(t, e, r, i) 447 | } 448 | } 449 | } 450 | }); 451 | r.StreamCipher = a.extend({ 452 | _doFinalize: function() { 453 | return this._process(!0) 454 | }, 455 | blockSize: 1 456 | }); 457 | var f = e.mode = {} 458 | , h = function(e, r, i) { 459 | var n = this._iv; 460 | n ? this._iv = t : n = this._prevBlock; 461 | for (var s = 0; i > s; s++) 462 | e[r + s] ^= n[s] 463 | } 464 | , u = (r.BlockCipherMode = i.extend({ 465 | createEncryptor: function(t, e) { 466 | return this.Encryptor.create(t, e) 467 | }, 468 | createDecryptor: function(t, e) { 469 | return this.Decryptor.create(t, e) 470 | }, 471 | init: function(t, e) { 472 | this._cipher = t, 473 | this._iv = e 474 | } 475 | })).extend(); 476 | u.Encryptor = u.extend({ 477 | processBlock: function(t, e) { 478 | var r = this._cipher 479 | , i = r.blockSize; 480 | h.call(this, t, e, i), 481 | r.encryptBlock(t, e), 482 | this._prevBlock = t.slice(e, e + i) 483 | } 484 | }), 485 | u.Decryptor = u.extend({ 486 | processBlock: function(t, e) { 487 | var r = this._cipher 488 | , i = r.blockSize 489 | , n = t.slice(e, e + i); 490 | r.decryptBlock(t, e), 491 | h.call(this, t, e, i), 492 | this._prevBlock = n 493 | } 494 | }), 495 | f = f.CBC = u, 496 | u = (e.pad = {}).Pkcs7 = { 497 | pad: function(t, e) { 498 | for (var r = 4 * e, r = r - t.sigBytes % r, i = r << 24 | r << 16 | r << 8 | r, s = [], o = 0; r > o; o += 4) 499 | s.push(i); 500 | r = n.create(s, r), 501 | t.concat(r) 502 | }, 503 | unpad: function(t) { 504 | t.sigBytes -= 255 & t.words[t.sigBytes - 1 >>> 2] 505 | } 506 | }, 507 | r.BlockCipher = a.extend({ 508 | cfg: a.cfg.extend({ 509 | mode: f, 510 | padding: u 511 | }), 512 | reset: function() { 513 | a.reset.call(this); 514 | var t = this.cfg 515 | , e = t.iv 516 | , t = t.mode; 517 | if (this._xformMode == this._ENC_XFORM_MODE) 518 | var r = t.createEncryptor; 519 | else 520 | r = t.createDecryptor, 521 | this._minBufferSize = 1; 522 | this._mode = r.call(t, this, e && e.words) 523 | }, 524 | _doProcessBlock: function(t, e) { 525 | this._mode.processBlock(t, e) 526 | }, 527 | _doFinalize: function() { 528 | var t = this.cfg.padding; 529 | if (this._xformMode == this._ENC_XFORM_MODE) { 530 | t.pad(this._data, this.blockSize); 531 | var e = this._process(!0) 532 | } else 533 | e = this._process(!0), 534 | t.unpad(e); 535 | return e 536 | }, 537 | blockSize: 4 538 | }); 539 | var p = r.CipherParams = i.extend({ 540 | init: function(t) { 541 | this.mixIn(t) 542 | }, 543 | toString: function(t) { 544 | return (t || this.formatter).stringify(this) 545 | } 546 | }) 547 | , f = (e.format = {}).OpenSSL = { 548 | stringify: function(t) { 549 | var e = t.ciphertext; 550 | return t = t.salt, 551 | (t ? n.create([1398893684, 1701076831]).concat(t).concat(e) : e).toString(o) 552 | }, 553 | parse: function(t) { 554 | t = o.parse(t); 555 | var e = t.words; 556 | if (1398893684 == e[0] && 1701076831 == e[1]) { 557 | var r = n.create(e.slice(2, 4)); 558 | e.splice(0, 4), 559 | t.sigBytes -= 16 560 | } 561 | return p.create({ 562 | ciphertext: t, 563 | salt: r 564 | }) 565 | } 566 | } 567 | , d = r.SerializableCipher = i.extend({ 568 | cfg: i.extend({ 569 | format: f 570 | }), 571 | encrypt: function(t, e, r, i) { 572 | i = this.cfg.extend(i); 573 | var n = t.createEncryptor(r, i); 574 | return e = n.finalize(e), 575 | n = n.cfg, 576 | p.create({ 577 | ciphertext: e, 578 | key: r, 579 | iv: n.iv, 580 | algorithm: t, 581 | mode: n.mode, 582 | padding: n.padding, 583 | blockSize: t.blockSize, 584 | formatter: i.format 585 | }) 586 | }, 587 | decrypt: function(t, e, r, i) { 588 | return i = this.cfg.extend(i), 589 | e = this._parse(e, i.format), 590 | t.createDecryptor(r, i).finalize(e.ciphertext) 591 | }, 592 | _parse: function(t, e) { 593 | return "string" == typeof t ? e.parse(t, this) : t 594 | } 595 | }) 596 | , e = (e.kdf = {}).OpenSSL = { 597 | execute: function(t, e, r, i) { 598 | return i || (i = n.random(8)), 599 | t = c.create({ 600 | keySize: e + r 601 | }).compute(t, i), 602 | r = n.create(t.words.slice(e), 4 * r), 603 | t.sigBytes = 4 * e, 604 | p.create({ 605 | key: t, 606 | iv: r, 607 | salt: i 608 | }) 609 | } 610 | } 611 | , l = r.PasswordBasedCipher = d.extend({ 612 | cfg: d.cfg.extend({ 613 | kdf: e 614 | }), 615 | encrypt: function(t, e, r, i) { 616 | return i = this.cfg.extend(i), 617 | r = i.kdf.execute(r, t.keySize, t.ivSize), 618 | i.iv = r.iv, 619 | t = d.encrypt.call(this, t, e, r.key, i), 620 | t.mixIn(r), 621 | t 622 | }, 623 | decrypt: function(t, e, r, i) { 624 | return i = this.cfg.extend(i), 625 | e = this._parse(e, i.format), 626 | r = i.kdf.execute(r, t.keySize, t.ivSize, e.salt), 627 | i.iv = r.iv, 628 | d.decrypt.call(this, t, e, r.key, i) 629 | } 630 | }) 631 | }(), 632 | function() { 633 | for (var t = CryptoJS, e = t.lib.BlockCipher, r = t.algo, i = [], n = [], s = [], o = [], c = [], a = [], f = [], h = [], u = [], p = [], d = [], l = 0; 256 > l; l++) 634 | d[l] = 128 > l ? l << 1 : l << 1 ^ 283; 635 | for (var y = 0, _ = 0, l = 0; 256 > l; l++) { 636 | var v = _ ^ _ << 1 ^ _ << 2 ^ _ << 3 ^ _ << 4 637 | , v = v >>> 8 ^ 255 & v ^ 99; 638 | i[y] = v, 639 | n[v] = y; 640 | var g = d[y] 641 | , B = d[g] 642 | , m = d[B] 643 | , x = 257 * d[v] ^ 16843008 * v; 644 | s[y] = x << 24 | x >>> 8, 645 | o[y] = x << 16 | x >>> 16, 646 | c[y] = x << 8 | x >>> 24, 647 | a[y] = x, 648 | x = 16843009 * m ^ 65537 * B ^ 257 * g ^ 16843008 * y, 649 | f[v] = x << 24 | x >>> 8, 650 | h[v] = x << 16 | x >>> 16, 651 | u[v] = x << 8 | x >>> 24, 652 | p[v] = x, 653 | y ? (y = g ^ d[d[d[m ^ g]]], 654 | _ ^= d[d[_]]) : y = _ = 1 655 | } 656 | var S = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54] 657 | , r = r.AES = e.extend({ 658 | _doReset: function() { 659 | for (var t = this._key, e = t.words, r = t.sigBytes / 4, t = 4 * ((this._nRounds = r + 6) + 1), n = this._keySchedule = [], s = 0; t > s; s++) 660 | if (r > s) 661 | n[s] = e[s]; 662 | else { 663 | var o = n[s - 1]; 664 | s % r ? r > 6 && 4 == s % r && (o = i[o >>> 24] << 24 | i[o >>> 16 & 255] << 16 | i[o >>> 8 & 255] << 8 | i[255 & o]) : (o = o << 8 | o >>> 24, 665 | o = i[o >>> 24] << 24 | i[o >>> 16 & 255] << 16 | i[o >>> 8 & 255] << 8 | i[255 & o], 666 | o ^= S[s / r | 0] << 24), 667 | n[s] = n[s - r] ^ o 668 | } 669 | for (e = this._invKeySchedule = [], 670 | r = 0; t > r; r++) 671 | s = t - r, 672 | o = r % 4 ? n[s] : n[s - 4], 673 | e[r] = 4 > r || 4 >= s ? o : f[i[o >>> 24]] ^ h[i[o >>> 16 & 255]] ^ u[i[o >>> 8 & 255]] ^ p[i[255 & o]] 674 | }, 675 | encryptBlock: function(t, e) { 676 | this._doCryptBlock(t, e, this._keySchedule, s, o, c, a, i) 677 | }, 678 | decryptBlock: function(t, e) { 679 | var r = t[e + 1]; 680 | t[e + 1] = t[e + 3], 681 | t[e + 3] = r, 682 | this._doCryptBlock(t, e, this._invKeySchedule, f, h, u, p, n), 683 | r = t[e + 1], 684 | t[e + 1] = t[e + 3], 685 | t[e + 3] = r 686 | }, 687 | _doCryptBlock: function(t, e, r, i, n, s, o, c) { 688 | for (var a = this._nRounds, f = t[e] ^ r[0], h = t[e + 1] ^ r[1], u = t[e + 2] ^ r[2], p = t[e + 3] ^ r[3], d = 4, l = 1; a > l; l++) 689 | var y = i[f >>> 24] ^ n[h >>> 16 & 255] ^ s[u >>> 8 & 255] ^ o[255 & p] ^ r[d++] 690 | , _ = i[h >>> 24] ^ n[u >>> 16 & 255] ^ s[p >>> 8 & 255] ^ o[255 & f] ^ r[d++] 691 | , v = i[u >>> 24] ^ n[p >>> 16 & 255] ^ s[f >>> 8 & 255] ^ o[255 & h] ^ r[d++] 692 | , p = i[p >>> 24] ^ n[f >>> 16 & 255] ^ s[h >>> 8 & 255] ^ o[255 & u] ^ r[d++] 693 | , f = y 694 | , h = _ 695 | , u = v; 696 | y = (c[f >>> 24] << 24 | c[h >>> 16 & 255] << 16 | c[u >>> 8 & 255] << 8 | c[255 & p]) ^ r[d++], 697 | _ = (c[h >>> 24] << 24 | c[u >>> 16 & 255] << 16 | c[p >>> 8 & 255] << 8 | c[255 & f]) ^ r[d++], 698 | v = (c[u >>> 24] << 24 | c[p >>> 16 & 255] << 16 | c[f >>> 8 & 255] << 8 | c[255 & h]) ^ r[d++], 699 | p = (c[p >>> 24] << 24 | c[f >>> 16 & 255] << 16 | c[h >>> 8 & 255] << 8 | c[255 & u]) ^ r[d++], 700 | t[e] = y, 701 | t[e + 1] = _, 702 | t[e + 2] = v, 703 | t[e + 3] = p 704 | }, 705 | keySize: 8 706 | }); 707 | t.AES = e._createHelper(r) 708 | }(); 709 | CryptoJS.pad.ZeroPadding = { 710 | pad: function(s, a) { 711 | var i = 4 * a; 712 | s.clamp(), 713 | s.sigBytes += i - (s.sigBytes % i || i) 714 | }, 715 | unpad: function(s) { 716 | for (var a = s.words, i = s.sigBytes - 1; !(a[i >>> 2] >>> 24 - i % 4 * 8 & 255); ) 717 | i--; 718 | s.sigBytes = i + 1 719 | } 720 | }; 721 | 722 | function aes(content) { 723 | var password_input, encrypt_iv, encrypt_key; 724 | var o = CryptoJS.MD5(Math.random() + "").toString(); 725 | for (t = CryptoJS.AES.encrypt(content, o, { 726 | mode: CryptoJS.mode.CBC, 727 | padding: CryptoJS.pad.ZeroPadding 728 | }), 729 | password_encode = t.ciphertext.toString(CryptoJS.enc.Base64); password_input != password_encode;) 730 | password_input = password_encode; 731 | encrypt_iv = t.iv.toString(CryptoJS.enc.Base64), 732 | encrypt_key = t.key.toString(CryptoJS.enc.Base64) 733 | for (var t = "", n = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", o = 0; 16 > o; o++) 734 | t += n.charAt(Math.floor(Math.random() * n.length)); 735 | return JSON.stringify({ 736 | password: password_input, 737 | encrypt_iv: encrypt_iv, 738 | encrypt_key: encrypt_key, 739 | dsc_token: t 740 | }) 741 | } 742 | console.log(aes("111111")) 743 | --------------------------------------------------------------------------------