├── README.md ├── 网易易盾JS分析 ├── my_rid.js ├── test_d.py ├── test_cp_fp.py ├── test_resp.py ├── README.md ├── fp_params.md ├── my_cb.js └── my_trace.js ├── JS混淆 ├── cookies生成.md ├── README.md ├── js加解密.md └── CryptoJS_test.js ├── AES ├── 电信189.js ├── 有赞商场.js └── 百草味.js ├── DES ├── 国鑫所.js └── 融金所.js ├── RSA ├── test.js ├── Barrett.js ├── 手机京东登录.js ├── BigInt.js ├── RSA_Stripped.js └── RSA.js ├── SHA1 ├── 海南航空.js └── e商.js └── md5 ├── 微信公众号.js ├── 万创帮.js └── 叮当快药.js /README.md: -------------------------------------------------------------------------------- 1 | ## 代码目录 2 | 3 | 目录名表示加密方式 4 | 5 | -------------------------------------------------------------------------------- /网易易盾JS分析/my_rid.js: -------------------------------------------------------------------------------- 1 | var my_rid = function() { 2 | var e = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 3 | , t = 32 4 | , i = []; 5 | for (; t-- > 0; ) 6 | i[t] = e.charAt(Math.random() * e.length); 7 | return i.join("") 8 | }; 9 | console.log(my_rid()) 10 | -------------------------------------------------------------------------------- /JS混淆/cookies生成.md: -------------------------------------------------------------------------------- 1 | ## 如何找到 cookies 的生成算法 2 | 3 | ### 1.找到 cookies 生成的链接,直接搜参数 4 | 一般搜不到,会有混淆,可以尝试搜索 document.cookies() 或者 $.cookies()。 5 | 6 | ### 2.找生成文件 7 | 判断混淆后,在控制台资源面板中找 cookies 生成的代码文件。 8 | * 1. 先清空 cookies 和缓存 9 | * 2. 对感觉是 cookies 生成算法的文件下断点 10 | * 3. 打开加载 cookies 的页面或者链接 11 | * 4. 是否进入断电,如果进入断点,可以吧 JS 文件拷贝出来,然后自己写个空页面引入 JS 文件,然后看用浏览器打开页面,看是否加载 cookies。 -------------------------------------------------------------------------------- /AES/电信189.js: -------------------------------------------------------------------------------- 1 | const CryptoJS = require('crypto-js') 2 | 3 | aesEncrypt = function(e) { 4 | var a = CryptoJS.MD5("login.189.cn"); 5 | var c = CryptoJS.enc.Utf8.parse(a); 6 | var b = CryptoJS.enc.Utf8.parse("1234567812345678"); 7 | var d = CryptoJS.AES.encrypt(e, c, { 8 | iv: b 9 | }); 10 | return d + "" 11 | } 12 | 13 | var encry_pwd = aesEncrypt('a12345678') 14 | console.log(encry_pwd) 15 | -------------------------------------------------------------------------------- /JS混淆/README.md: -------------------------------------------------------------------------------- 1 | ## 常见的混淆方式 2 | 3 | ### 一.字节集混淆 4 | > 将代码的字母逐个转换为 ASCII 码,然后放回一个数组。 5 | > 解决方法:遍历 ASCII 数组,转换后拼接即可。 6 | 7 | ### 二.数组混淆 8 | > 将所有函数名和变量放入一个数组,调用的时候取数组成员调用 9 | > 解决方法:将数组内的值直接替换函数和变量名。 10 | 11 | ### 三.变量名混淆 12 | > 把变量名、函数名、参数名等,替换成没有语义,看着又很像的名字, 13 | > 解决方法:将相同部分用正则替换掉。 14 | > 或者用十六进制文本表示字符串。 15 | > 解决方法:用一些 JS 美化工具,直接将代码中的十六进制转换为字符串。 16 | 17 | ### 四.控制流平坦化 18 | > 将正常的 for 循环等代码转换为 switch-case 代码 19 | > 暂时只能一步一步调试。 20 | -------------------------------------------------------------------------------- /JS混淆/js加解密.md: -------------------------------------------------------------------------------- 1 | ## JS 加解密 2 | 3 | ctypto-js github地址 : https://github.com/brix/crypto-js 4 | 5 | ### 1. 编码 6 | 7 | * unicode 编码: escape unescape 8 | 9 | * URL 编码: encodeURIComponent decodeURIComponent 10 | * Base64/btoa/atob 编码: 所有的数据都能被编码为只用 65 个字符就能表示的文本。 A-Za-z0-9+/= 11 | 12 | 13 | ### 2. 单向散列函数(消息摘要算法) 14 | 15 | * 加密后的密文定长 16 | 17 | * 明文不一样,散列后结果一定不一样 18 | * 不可逆 19 | * 一般用于签名 sign 20 | 21 | 常见的函数有: MD5(解密后密文32位), SHA1(40位), SHA256, SHA512, HmacMD5, HmacSHA1, HmacSHA256 22 | -------------------------------------------------------------------------------- /AES/有赞商场.js: -------------------------------------------------------------------------------- 1 | // https://account.youzan.com/login 2 | 3 | const CryptoJS = require('crypto-js'); 4 | 5 | function test(e){ 6 | var t = CryptoJS; 7 | var r = t.enc.Utf8.parse("youzan.com.aesiv") 8 | var o = t.enc.Utf8.parse("youzan.com._key_"); 9 | return e = t.enc.Utf8.parse(e), 10 | t.AES.encrypt(e, o, { 11 | mode: t.mode.CBC, 12 | padding: t.pad.Iso10126, 13 | iv: r 14 | }).toString() 15 | } 16 | 17 | pwd = 'a12345678' 18 | console.log(test(pwd)) 19 | -------------------------------------------------------------------------------- /DES/国鑫所.js: -------------------------------------------------------------------------------- 1 | // https://wechat.gclfax.com/html/register/login.html?title=%E7%99%BB%E5%BD%95 2 | 3 | 4 | const CryptoJS = require('crypto-js') 5 | 6 | function tripledes(message) { 7 | //required 8 | // 9 | // 10 | var key = 'Pog4iu6OqIkKRpDT'; 11 | var keyHex = CryptoJS.enc.Utf8.parse(key); 12 | var encrypted = CryptoJS.DES.encrypt(message, keyHex, { 13 | mode: CryptoJS.mode.ECB, 14 | padding: CryptoJS.pad.Pkcs7 15 | }); 16 | // console.log('直接 toString' + encrypted.toString()) // 对加密结果直接 toString 就是 base64 17 | // var enstr = CryptoJS.enc.Base64.parse(encrypted.toString()); 18 | // return enstr.toString().toUpperCase(); 19 | return encrypted.ciphertext.toString().toUpperCase() 20 | } 21 | 22 | var pwd = tripledes('15615618453') 23 | console.log(pwd) // DD4428E46F6EEEB059B9FFCA5128F3B5 24 | -------------------------------------------------------------------------------- /网易易盾JS分析/test_d.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import execjs 3 | 4 | headers = { 5 | 'Sec-Fetch-Mode': 'cors', 6 | 'Referer': 'https://dl.reg.163.com/webzj/v1.0.1/pub/index2_new.html?cd=https%3A%2F%2Fcc.res.netease.com%2F_next%2F_static%2Fstatic%2Fstyles%2F&cf=urs_component.css%3Fversion%3D20190904&MGID=1570606259476.5786&wdaId=&pkid=PFClpTB&product=cc', 7 | 'Origin': 'https://dl.reg.163.com', 8 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', 9 | 'Content-type': 'application/x-www-form-urlencoded', 10 | } 11 | 12 | d_js_path = r'C:\Users\86137\OneDrive\桌面\js_study\JS逆向\滑块验证码js破解\my_d.js' 13 | with open(d_js_path, 'r') as f: 14 | d_code = f.read() 15 | 16 | my_d = execjs.compile(d_code).call('my_d') 17 | # print(my_d) 18 | 19 | 20 | data = { 21 | 'd': 'abc', 22 | 'v': '38eaf165', 23 | 'cb': '_WM_' 24 | } 25 | 26 | response = requests.post('https://webzjac.reg.163.com/v2/d', headers=headers, data=data) 27 | print(response.text) 28 | 29 | data = { 30 | 'd': 'abc', 31 | 'v': '38eaf165', 32 | 'cb': '_WM_' 33 | } 34 | 35 | response = requests.post('https://webzjac.reg.163.com/v2/b', headers=headers, data=data) 36 | print(response.text) -------------------------------------------------------------------------------- /AES/百草味.js: -------------------------------------------------------------------------------- 1 | // https://m.vipbcw.com/register/index 2 | const CryptoJS = require('crypto-js') 3 | 4 | var pwd = 'a12345678' 5 | var phone = '13751685424' 6 | var captcha = '5526' 7 | var timestemp = Date.parse(new Date) / 1e3 8 | 9 | function test(pwd, phone, captcha, timestemp){ 10 | var submit_data = { 11 | mobile_phone: phone, 12 | password: pwd, 13 | phone_captcha: captcha 14 | } 15 | 16 | var submit_json = JSON.stringify(submit_data) 17 | 18 | var md5_data = `data={${submit_json}}&device=WechatMall/1.0/2.2.1×temp=${timestemp}&token=FD92DF750B32765DA01A119BE1601D46` 19 | 20 | var to_encry_data = { 21 | data: submit_json, 22 | device: "WechatMall/1.0/2.2.1", 23 | timestemp: timestemp, 24 | token: "", 25 | sign: CryptoJS.MD5(md5_data), 26 | token: "" 27 | } 28 | 29 | var r = JSON.stringify(to_encry_data) 30 | , o = "b92dff3973ebdc1786803c2ce976a627" 31 | , i = o.substring(0, 16); 32 | o = CryptoJS.enc.Utf8.parse(o), 33 | i = CryptoJS.enc.Utf8.parse(i); 34 | var u = CryptoJS.enc.Utf8.parse(r); 35 | var params = CryptoJS.AES.encrypt(u, o, { 36 | iv: i, 37 | mode: CryptoJS.mode.CBC, 38 | padding: CryptoJS.pad.ZeroPadding 39 | }).toString(); 40 | return params 41 | } 42 | 43 | console.log(test(pwd, phone, captcha, timestemp)) -------------------------------------------------------------------------------- /网易易盾JS分析/test_cp_fp.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import execjs 3 | 4 | js_path = r'C:\\Users\\86137\\OneDrive\\桌面\\js_study\\JS逆向\\滑块验证码js破解\\my_cp.js' 5 | with open(js_path, encoding='utf-8') as f: 6 | js_data = f.read() 7 | 8 | my_cb = execjs.compile(js_data).call('my_cb') 9 | 10 | headers = { 11 | 'Sec-Fetch-Mode': 'no-cors', 12 | 'Referer': 'https://dl.reg.163.com/webzj/v1.0.1/pub/index2_new.html?cd=https%3A%2F%2Fcc.res.netease.com%2F_next%2F_static%2Fstatic%2Fstyles%2F&cf=urs_component.css%3Fversion%3D20190904&MGID=1569480120894.9639&wdaId=&pkid=PFClpTB&product=cc', 13 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', 14 | } 15 | 16 | fp = r'swL4OvIjzam6f8697KaZ1YnViIP/bKvi6p3lyzLSKIRZsJa23LZT\yIAHur8\1RLpWgIosjhnpqeki\UGMO381vqt\SzdhBciwNhsv4E/z+abwqN+V/dadrJ1oqBe7gPTe++qWSSoLW2\bjoiAl1PickwhhKaS6\rbdDdnAP48RIgOA+:1570447154508' 17 | params = ( 18 | ('id', '744e2a6324ec5370616241baf4507538'), 19 | ('fp', fp), 20 | ('https', 'true'), 21 | ('type', '2'), 22 | ('version', '2.11.4'), 23 | ('dpr', '1.25'), 24 | ('dev', '1'), 25 | ('cb', my_cb), 26 | ('ipv6', 'false'), 27 | ('runEnv', '10'), 28 | ('width', '220'), 29 | ('token', ''), 30 | ('referer', 'https://dl.reg.163.com/webzj/v1.0.1/pub/index2_new.html'), 31 | ('callback', '__JSONP_skwoqtr_0'), 32 | ) 33 | 34 | response = requests.get('https://webzjcaptcha.reg.163.com/api/v2/get', headers=headers, params=params) 35 | print(response.text) 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /RSA/test.js: -------------------------------------------------------------------------------- 1 | const JSEncrypt = require('node-jsencrypt') 2 | 3 | const publicKey = `-----BEGIN PUBLIC KEY----- 4 | MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlOJu6TyygqxfWT7eLtGDwajtN 5 | FOb9I5XRb6khyfD1Yt3YiCgQWMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76 6 | xFxdU6jE0NQ+Z+zEdhUTooNRaY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4 7 | gwQco1KRMDSmXSMkDwIDAQAB 8 | -----END PUBLIC KEY-----` 9 | 10 | const privateKey = `-----BEGIN RSA PRIVATE KEY----- 11 | MIICXQIBAAKBgQDlOJu6TyygqxfWT7eLtGDwajtNFOb9I5XRb6khyfD1Yt3YiCgQ 12 | WMNW649887VGJiGr/L5i2osbl8C9+WJTeucF+S76xFxdU6jE0NQ+Z+zEdhUTooNR 13 | aY5nZiu5PgDB0ED/ZKBUSLKL7eibMxZtMlUDHjm4gwQco1KRMDSmXSMkDwIDAQAB 14 | AoGAfY9LpnuWK5Bs50UVep5c93SJdUi82u7yMx4iHFMc/Z2hfenfYEzu+57fI4fv 15 | xTQ//5DbzRR/XKb8ulNv6+CHyPF31xk7YOBfkGI8qjLoq06V+FyBfDSwL8KbLyeH 16 | m7KUZnLNQbk8yGLzB3iYKkRHlmUanQGaNMIJziWOkN+N9dECQQD0ONYRNZeuM8zd 17 | 8XJTSdcIX4a3gy3GGCJxOzv16XHxD03GW6UNLmfPwenKu+cdrQeaqEixrCejXdAF 18 | z/7+BSMpAkEA8EaSOeP5Xr3ZrbiKzi6TGMwHMvC7HdJxaBJbVRfApFrE0/mPwmP5 19 | rN7QwjrMY+0+AbXcm8mRQyQ1+IGEembsdwJBAN6az8Rv7QnD/YBvi52POIlRSSIM 20 | V7SwWvSK4WSMnGb1ZBbhgdg57DXaspcwHsFV7hByQ5BvMtIduHcT14ECfcECQATe 21 | aTgjFnqE/lQ22Rk0eGaYO80cc643BXVGafNfd9fcvwBMnk0iGX0XRsOozVt5Azil 22 | psLBYuApa66NcVHJpCECQQDTjI2AQhFc1yRnCU/YgDnSpJVm1nASoRUnU8Jfm3Oz 23 | uku7JUXcVpt08DFSceCEX9unCuMcT72rAQlLpdZir876 24 | -----END RSA PRIVATE KEY-----` 25 | 26 | const fnencrypt = (password) => { 27 | let encryptor = new JSEncrypt(); // JSEncrypt对象 28 | encryptor.setPublicKey(publicKey); // 公钥 29 | let rsaPassWord = encryptor.encrypt(password); // 密码进行加密 30 | return rsaPassWord; 31 | }; 32 | 33 | const fndecrypt = (password) => { 34 | let decryptor = new JSEncrypt(); 35 | decryptor.setPrivateKey(privateKey); // 私钥 36 | let rsaPassWord = decryptor.decrypt(password); 37 | return rsaPassWord; 38 | }; 39 | 40 | const pwd = fnencrypt('a12345678') 41 | console.log(pwd) 42 | 43 | const decrypt_pwd = fndecrypt(pwd) 44 | console.log(`de_pwd: ${decrypt_pwd}`) 45 | 46 | -------------------------------------------------------------------------------- /RSA/Barrett.js: -------------------------------------------------------------------------------- 1 | // BarrettMu, a class for performing Barrett modular reduction computations in 2 | // JavaScript. 3 | // 4 | // Requires BigInt.js. 5 | // 6 | // Copyright 2004-2005 David Shapiro. 7 | // 8 | // You may use, re-use, abuse, copy, and modify this code to your liking, but 9 | // please keep this header. 10 | // 11 | // Thanks! 12 | // 13 | // Dave Shapiro 14 | // dave@ohdave.com 15 | 16 | function BarrettMu(m) 17 | { 18 | this.modulus = biCopy(m); 19 | this.k = biHighIndex(this.modulus) + 1; 20 | var b2k = new BigInt(); 21 | b2k.digits[2 * this.k] = 1; // b2k = b^(2k) 22 | this.mu = biDivide(b2k, this.modulus); 23 | this.bkplus1 = new BigInt(); 24 | this.bkplus1.digits[this.k + 1] = 1; // bkplus1 = b^(k+1) 25 | this.modulo = BarrettMu_modulo; 26 | this.multiplyMod = BarrettMu_multiplyMod; 27 | this.powMod = BarrettMu_powMod; 28 | } 29 | 30 | function BarrettMu_modulo(x) 31 | { 32 | var q1 = biDivideByRadixPower(x, this.k - 1); 33 | var q2 = biMultiply(q1, this.mu); 34 | var q3 = biDivideByRadixPower(q2, this.k + 1); 35 | var r1 = biModuloByRadixPower(x, this.k + 1); 36 | var r2term = biMultiply(q3, this.modulus); 37 | var r2 = biModuloByRadixPower(r2term, this.k + 1); 38 | var r = biSubtract(r1, r2); 39 | if (r.isNeg) { 40 | r = biAdd(r, this.bkplus1); 41 | } 42 | var rgtem = biCompare(r, this.modulus) >= 0; 43 | while (rgtem) { 44 | r = biSubtract(r, this.modulus); 45 | rgtem = biCompare(r, this.modulus) >= 0; 46 | } 47 | return r; 48 | } 49 | 50 | function BarrettMu_multiplyMod(x, y) 51 | { 52 | /* 53 | x = this.modulo(x); 54 | y = this.modulo(y); 55 | */ 56 | var xy = biMultiply(x, y); 57 | return this.modulo(xy); 58 | } 59 | 60 | function BarrettMu_powMod(x, y) 61 | { 62 | var result = new BigInt(); 63 | result.digits[0] = 1; 64 | var a = x; 65 | var k = y; 66 | while (true) { 67 | if ((k.digits[0] & 1) != 0) result = this.multiplyMod(result, a); 68 | k = biShiftRight(k, 1); 69 | if (k.digits[0] == 0 && biHighIndex(k) == 0) break; 70 | a = this.multiplyMod(a, a); 71 | } 72 | return result; 73 | } 74 | 75 | -------------------------------------------------------------------------------- /JS混淆/CryptoJS_test.js: -------------------------------------------------------------------------------- 1 | const CryptoJS = require("crypto-js"); 2 | 3 | var md5 = CryptoJS.MD5('test') 4 | // 显示转换 5 | console.log('md5: ' + md5.toString()) 6 | // 隐式转换 7 | // console.log(md5 + '') 8 | 9 | var sha1 = CryptoJS.SHA1('test') 10 | console.log('sha1: ' + sha1.toString()) 11 | 12 | // Hmac 系列加密需要 2 个参数,第一个是被加密的字符串,第二个是秘钥 13 | var HmacSHA1 = CryptoJS.HmacSHA1('test', '11111111') 14 | console.log('HmacSHA1: ' + HmacSHA1.toString()) 15 | 16 | 17 | // 通过先创建加密对象的方式加密 18 | // var sha256 = CryptoJS.algo.SHA256.create(); 19 | // sha256.update("Message Part 1"); 20 | // sha256.update("Message Part 2"); 21 | // sha256.update("Message Part 3"); 22 | // ​var hash = sha256.finalize(); 23 | 24 | /* 将字符串以一定的方式解析成字节集,才能对字节集进行偏移等操作,默认是加密算法以 Utf8 进行解析,以 HEX 输出 25 | var words = CryptoJS.enc.Base64.parse("SGVsbG8sIFdvcmxkIQ=="); 26 | var base64 = CryptoJS.enc.Base64.stringify(words); 27 | ​ 28 | var words = CryptoJS.enc.Latin1.parse("Hello, World!"); 29 | var latin1 = CryptoJS.enc.Latin1.stringify(words); 30 | ​ 31 | var words = CryptoJS.enc.Hex.parse("48656c6c6f2c20576f726c6421"); 32 | var hex = CryptoJS.enc.Hex.stringify(words); 33 | ​ 34 | var words = CryptoJS.enc.Utf8.parse("𔭢"); 35 | var utf8 = CryptoJS.enc.Utf8.stringify(words); 36 | ​ 37 | var words = CryptoJS.enc.Utf16.parse("Hello, World!"); 38 | var utf16 = CryptoJS.enc.Utf16.stringify(words); 39 | ​ 40 | var words = CryptoJS.enc.Utf16LE.parse("Hello, World!"); 41 | var utf16 = CryptoJS.enc.Utf16LE.stringify(words); 42 | */ 43 | 44 | 45 | // 密码可以不解析,默认会使用 Utf8 解析 46 | var pwd = CryptoJS.enc.Utf8.parse('hello word') 47 | console.log('直接对 Utf8 的字符串 toString: ', pwd.toString()) // 是 hex 16进制 48 | // 秘钥一定要解析 49 | var key = CryptoJS.enc.Utf8.parse('1234567812345678') // 16位秘钥 50 | var iv = CryptoJS.enc.Utf8.parse('1234567812345678') // 16位秘钥 51 | 52 | var cfg = { 53 | mode: CryptoJS.mode.CBC, // 指明加密方式, ECB 模式不需要 iv 54 | padding: CryptoJS.pad.Pkcs7, // 指明填充方式 55 | iv:iv, // 偏移量 56 | } 57 | //AES 加密 参数 (被加密字符串, 秘钥, 对象(加密模式,加密填充方式,偏移向量)) 58 | var aes = CryptoJS.AES.encrypt(pwd, key, cfg) // 一个位数组 59 | 60 | console.log('aes: ' + aes.toString()) // 对 aes 直接 toString 是 Base64 的输出: 61 | console.log('ciphertext: ' + aes.ciphertext.toString()) 62 | 63 | // AES 解密 64 | var de_aes = CryptoJS.AES.decrypt(aes, key, cfg); 65 | // 要指明 toString 的解析方法 66 | console.log( de_aes.toString(CryptoJS.enc.Utf8) ); 67 | 68 | 69 | var words = CryptoJS.enc.Base64.parse("SGVsbG8sIFdvcmxkIQ=="); 70 | console.log('对 base64 对象直接 toString: ' + words.toString()) // hex 16进制 71 | // console.log(words.toString(CryptoJS.enc.Base64)) 72 | 73 | var base64 = CryptoJS.enc.Base64.stringify(words); 74 | console.log(base64) 75 | 76 | 77 | -------------------------------------------------------------------------------- /SHA1/海南航空.js: -------------------------------------------------------------------------------- 1 | // http://m.hnair.com/#/login/true?_k=ikwtzd 2 | 3 | const CryptoJS = require('crypto-js') 4 | 5 | var certificateHash = '6093941774D84495A5D15D8F909CAA1E'; 6 | var hardCode = '21047C596EAD45209346AE29F0350491'; 7 | 8 | var phoneNum = "13751658555"; 9 | var pwd = "a12345"; 10 | var timestamp = new Date().getTime(); 11 | console.log(timestamp) 12 | 13 | var str = '10149\ 14 | 9E4BBDDEC6C8416EA380E418161A7CD3\ 15 | com.hnair.spa.web.standardstandard\ 16 | 7.5.0\ 17 | defualt_web_diddefualt_web_gtcid' + phoneNum + pwd + 18 | '5d85af4coNPNVSDPti5xzSpYqxfggK2vm7mnKj11\ 19 | HTML5\ 20 | zh-CN\ 21 | slatslng\ 22 | Win32' + timestamp + 23 | '5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1-480true'; 24 | 25 | var sign = CryptoJS.HmacSHA1(str + certificateHash, hardCode) 26 | console.log(sign.toString().toUpperCase()) // 64E4F3CAE3D8FA0F6E3FCD4877FC87159CD40613 27 | 28 | // var desc = "iat%2BQ5z8%2B4dasDscyyGDjMM2vOwzkmj4/HYHyt4USMYv00S0gRAsTIAwcVrh5P1%2BI/2mYkOtSM/qXxx9ijCaeCEXZ5TEWmg8fq7qr5Gp2wO6yzzMQpFq6PbZ00ZDLq4XP8VZR18QAicdVU8RRaljHgylMXRYM2Y0XBPUMR4eJBlp7AgE5HXw/NgIHqxVX65FJJtvQYzAxS/6ZPNSLlROInGvb%2B6APGfVJO/XL1%2BkHN72MAoVtdkETaGopOEeJsj/9EIgBn4bqMs7l1C/3I0mKJJjt3uI4kMF8eCfwMC7JalQVJD%2BKvGG2gC3mBGxtdb0XAuSfMjUxF/IXCC03Or1NGYhNCdGHElU2ZCFR0Lb7C4=".replace(/%2B/g, '+') 29 | // console.log(desc) 30 | 31 | 32 | var process = function(e) { 33 | var t = -979402 34 | , r = 979402; 35 | _nuz = -705100, 36 | _nux = 705102, 37 | _mlq = 1, 38 | _zmmn = -1, 39 | _xhce = 664917, 40 | _pvaa = -713216, 41 | _tmlq = 713456, 42 | _bbm = 933985, 43 | _lxz = 33853, 44 | _sbx = -93056, 45 | _nnuy = "lit", 46 | _uuz = "map", 47 | _jggu = "it", 48 | _yyf = "function", 49 | _oos = "_", 50 | _hsvuz = "sub", 51 | _isus = "cha", 52 | _paww = "str", 53 | _lyydw = "sp", 54 | _qndkq = "cha", 55 | _muzz = "spl", 56 | _unny = "base", 57 | _heeqc = Object(); 58 | var n = { 59 | _base: "", 60 | _baseTable: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", 61 | _baseTables: [-2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -2, -1, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, -2, -2, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -2, -2, -2, -2, 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, -2, -2, -2, -2, -2, -2, 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, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2], 62 | _baseLink: "120112130113220101010101011201011201121313220101", 63 | _basefunction: function(e, t) { 64 | switch (e = 2 * e, 65 | str_1 = this._baseLink[e], 66 | str_2 = this._baseLink[e + 1], 67 | result = "", 68 | result = t.substring(0, str_2), 69 | parseInt(str_1)) { 70 | case _mlq: 71 | this._base += this._baseTables[result]; 72 | break; 73 | case _mlq + _zmmn: 74 | this._base += this._baseTable[result]; 75 | break; 76 | default: 77 | this._base += result 78 | } 79 | return t.substring(this._baseLink[e + 1]) 80 | } 81 | }; 82 | n._baseLink = n._baseLink[_lyydw + _nnuy](""), 83 | n._baseTable = n._baseTable[_muzz + _jggu](""); 84 | for (var i = t + r; i < n._baseLink.length / (_nux + _nuz); i++) 85 | e = n._basefunction(i, e); 86 | return n._base 87 | }; 88 | 89 | 90 | 91 | var str_json = {"xy":["{\"x\":null,\"y\":null,\"t\":1569060216085}","{\"x\":null,\"y\":null,\"t\":1569060229536}","{\"x\":null,\"y\":null,\"t\":1569060272043}","{\"x\":null,\"y\":null,\"t\":1569060274611}"],"fingerprint":783100800} 92 | str_json = JSON.stringify(str_json) 93 | console.log(JSON.stringify(str_json)) 94 | 95 | var zre = '483991120105853551256740710651221217723' 96 | var zzre = process(zre) 97 | 98 | function eq_u(e, t) { 99 | var r = CryptoJS.enc.Utf8.parse(t) 100 | var encrypted = CryptoJS.DES.encrypt(e, r, { 101 | mode: CryptoJS.mode.ECB, 102 | padding: CryptoJS.pad.Pkcs7, 103 | }); 104 | return encrypted.toString() 105 | } 106 | console.log(zzre) 107 | var des = eq_u(str_json, zzre) 108 | 109 | console.log(des) -------------------------------------------------------------------------------- /网易易盾JS分析/test_resp.py: -------------------------------------------------------------------------------- 1 | import requests 2 | from datetime import datetime 3 | import time 4 | import random 5 | import json 6 | import re 7 | import execjs 8 | import cv2 9 | 10 | session = requests.Session() 11 | headers = { 12 | 'Sec-Fetch-Mode': 'cors', 13 | 'Referer': 'https://dl.reg.163.com/webzj/v1.0.1/pub/index2_new.html?cd=https%3A%2F%2Fcc.res.netease.com%2F_next%2F_static%2Fstatic%2Fstyles%2F&cf=urs_component.css%3Fversion%3D20190904&MGID=1570335110013.2468&wdaId=&pkid=PFClpTB&product=cc', 14 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36', 15 | 'Content-Type': 'application/json', 16 | } 17 | origin_width = 320 18 | wycc_width = 220 19 | wycc_id = '744e2a6324ec5370616241baf4507538' 20 | 21 | def findfic(target='background.jpg', template='front.png'): 22 | """ 23 | 生成滑块匹配距离 24 | :param target: 滑块背景图 25 | :param template: 滑块图片路径 26 | :return: 模板匹配距离 27 | """ 28 | target_rgb = cv2.imread(target) 29 | target_gray = cv2.cvtColor(target_rgb, cv2.COLOR_BGR2GRAY) 30 | template_rgb = cv2.imread(template, 0) 31 | # 使用相关性系数匹配, 结果越接近1 表示越匹配 32 | # https://www.cnblogs.com/ssyfj/p/9271883.html 33 | res = cv2.matchTemplate(target_gray, template_rgb, cv2.TM_CCOEFF_NORMED) 34 | # opencv 的函数 minMaxLoc:在给定的矩阵中寻找最大和最小值,并给出它们的位置 35 | min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) 36 | # 因为滑块只需要 x 坐标的距离,放回坐标元组的 [0] 即可 37 | if abs(1 - min_val) <= abs(1 - max_val): 38 | distance = min_loc[0] 39 | else: 40 | distance = max_loc[0] 41 | return distance 42 | 43 | 44 | def my_rtid(): 45 | e = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 46 | t = 32 47 | str_list = [e[int(random.random() * len(e))] for i in range(t)] 48 | return ''.join(str_list) 49 | # print(my_rtid()) 50 | rtid = my_rtid() 51 | timestamp = int(time.time() * 1000) 52 | callback = '__JSONP_qaue9y7_0' 53 | 54 | # 第一个请求, 初始化滑块 55 | init_params = ( 56 | ('pd', 'cc'), 57 | ('pkid', 'PFClpTB'), 58 | ('pkht', 'cc.163.com'), 59 | ('channel', '0'), 60 | ('topURL', 'http://cc.163.com/category/'), 61 | ('rtid', rtid), 62 | # ('nocache', '1570335112543'), 63 | ('nocache', timestamp), 64 | ) 65 | init_resp = session.get('https://dl.reg.163.com/dl/ini', headers=headers, params=init_params) 66 | # print('init_resp: ', init_resp.text) 67 | 68 | # 第二个请求,获得滑块的图片 69 | fp_js_path = r'C:\Users\86137\OneDrive\桌面\js_study\JS逆向\滑块验证码js破解\my_fp.js' 70 | with open(fp_js_path, 'r') as f: 71 | fp_code = f.read() 72 | fp = execjs.compile(fp_code).call('my_fp') 73 | print(fp) 74 | 75 | cb_js_path = r'C:\Users\86137\OneDrive\桌面\js_study\JS逆向\滑块验证码js破解\my_cb.js' 76 | with open(cb_js_path, 'r') as f: 77 | cb_code = f.read() 78 | cb = execjs.compile(cb_code).call('my_cb') 79 | print(cb) 80 | 81 | params = ( 82 | ('id', wycc_id), 83 | ('fp', fp), 84 | ('https', 'true'), 85 | ('type', '2'), 86 | ('version', '2.11.4'), 87 | ('dpr', '1.25'), 88 | ('dev', '1'), 89 | ('cb', cb), 90 | ('ipv6', 'false'), 91 | ('runEnv', '10'), 92 | ('width', '220'), 93 | ('token', ''), 94 | ('referer', 'https://dl.reg.163.com/webzj/v1.0.1/pub/index2_new.html'), 95 | ('callback',callback), 96 | ) 97 | 98 | get_resp = session.get('https://webzjcaptcha.reg.163.com/api/v2/get', headers=headers, params=params) 99 | print(get_resp.text) 100 | get_json = re.search(rf'{callback}\((.*?)\)', get_resp.text).group(1) 101 | get_dict = json.loads(get_json) 102 | 103 | bg = get_dict['data']['bg'][0] 104 | front = get_dict['data']['front'][0] 105 | token = get_dict['data']['token'] 106 | print(bg, front, token) 107 | 108 | bg_resp = session.get(bg, headers=headers) 109 | with open('./background.jpg', 'wb') as f: 110 | f.write(bg_resp.content) 111 | 112 | front_resp = session.get(front, headers=headers) 113 | with open('./front.png', 'wb') as f: 114 | f.write(front_resp.content) 115 | 116 | distance = findfic('background.jpg', 'front.png') 117 | true_distance = distance * (wycc_width / origin_width) 118 | print(distance, round(true_distance)) 119 | 120 | trace_js_path = r'C:\Users\86137\OneDrive\桌面\js_study\JS逆向\滑块验证码js破解\my_trace.js' 121 | with open(trace_js_path, 'r', encoding='utf-8') as f: 122 | trace_code = f.read() 123 | trace_data, new_cb = execjs.compile(trace_code).call('my_trace', token, true_distance) 124 | print(trace_data, new_cb) 125 | trace_data = json.loads(trace_data) 126 | 127 | 128 | time.sleep(1) 129 | check_params = ( 130 | ('id', wycc_id), 131 | ('token', token), 132 | # ('acToken', my_actoken), 133 | ('data', json.dumps(trace_data)), 134 | ('width', '220'), 135 | ('type', '2'), 136 | ('version', '2.11.4'), 137 | ('cb', new_cb), 138 | ('extraData', ''), 139 | ('runEnv', '10'), 140 | ('referer', 'https://dl.reg.163.com/webzj/v1.0.1/pub/index2_new.html'), 141 | ('callback', callback), 142 | ) 143 | check_resp = session.get('https://webzjcaptcha.reg.163.com/api/v2/check', headers=headers, params=check_params) 144 | print(check_resp.text) 145 | -------------------------------------------------------------------------------- /md5/微信公众号.js: -------------------------------------------------------------------------------- 1 | // https://mp.weixin.qq.com/ 2 | 3 | function e(n, r) { 4 | var t = (65535 & n) + (65535 & r) 5 | return (n >> 16) + (r >> 16) + (t >> 16) << 16 | 65535 & t 6 | } 7 | function u(n, r, t, u, o, c) { 8 | return e(function(n, r) { 9 | return n << r | n >>> 32 - r 10 | }(e(e(r, n), e(u, c)), o), t) 11 | } 12 | function o(n, r, t, e, o, c, f) { 13 | return u(r & t | ~r & e, n, r, o, c, f) 14 | } 15 | function c(n, r, t, e, o, c, f) { 16 | return u(r & e | t & ~e, n, r, o, c, f) 17 | } 18 | function f(n, r, t, e, o, c, f) { 19 | return u(r ^ t ^ e, n, r, o, c, f) 20 | } 21 | function i(n, r, t, e, o, c, f) { 22 | return u(t ^ (r | ~e), n, r, o, c, f) 23 | } 24 | function a(n, r) { 25 | n[r >> 5] |= 128 << r % 32, 26 | n[14 + (r + 64 >>> 9 << 4)] = r 27 | var t, u, a, h, d, g = 1732584193, l = -271733879, v = -1732584194, s = 271733878 28 | for (t = 0; t < n.length; t += 16) 29 | u = g, 30 | a = l, 31 | h = v, 32 | d = s, 33 | l = i(l = i(l = i(l = i(l = f(l = f(l = f(l = f(l = c(l = c(l = c(l = c(l = o(l = o(l = o(l = o(l, v = o(v, s = o(s, g = o(g, l, v, s, n[t], 7, -680876936), l, v, n[t + 1], 12, -389564586), g, l, n[t + 2], 17, 606105819), s, g, n[t + 3], 22, -1044525330), v = o(v, s = o(s, g = o(g, l, v, s, n[t + 4], 7, -176418897), l, v, n[t + 5], 12, 1200080426), g, l, n[t + 6], 17, -1473231341), s, g, n[t + 7], 22, -45705983), v = o(v, s = o(s, g = o(g, l, v, s, n[t + 8], 7, 1770035416), l, v, n[t + 9], 12, -1958414417), g, l, n[t + 10], 17, -42063), s, g, n[t + 11], 22, -1990404162), v = o(v, s = o(s, g = o(g, l, v, s, n[t + 12], 7, 1804603682), l, v, n[t + 13], 12, -40341101), g, l, n[t + 14], 17, -1502002290), s, g, n[t + 15], 22, 1236535329), v = c(v, s = c(s, g = c(g, l, v, s, n[t + 1], 5, -165796510), l, v, n[t + 6], 9, -1069501632), g, l, n[t + 11], 14, 643717713), s, g, n[t], 20, -373897302), v = c(v, s = c(s, g = c(g, l, v, s, n[t + 5], 5, -701558691), l, v, n[t + 10], 9, 38016083), g, l, n[t + 15], 14, -660478335), s, g, n[t + 4], 20, -405537848), v = c(v, s = c(s, g = c(g, l, v, s, n[t + 9], 5, 568446438), l, v, n[t + 14], 9, -1019803690), g, l, n[t + 3], 14, -187363961), s, g, n[t + 8], 20, 1163531501), v = c(v, s = c(s, g = c(g, l, v, s, n[t + 13], 5, -1444681467), l, v, n[t + 2], 9, -51403784), g, l, n[t + 7], 14, 1735328473), s, g, n[t + 12], 20, -1926607734), v = f(v, s = f(s, g = f(g, l, v, s, n[t + 5], 4, -378558), l, v, n[t + 8], 11, -2022574463), g, l, n[t + 11], 16, 1839030562), s, g, n[t + 14], 23, -35309556), v = f(v, s = f(s, g = f(g, l, v, s, n[t + 1], 4, -1530992060), l, v, n[t + 4], 11, 1272893353), g, l, n[t + 7], 16, -155497632), s, g, n[t + 10], 23, -1094730640), v = f(v, s = f(s, g = f(g, l, v, s, n[t + 13], 4, 681279174), l, v, n[t], 11, -358537222), g, l, n[t + 3], 16, -722521979), s, g, n[t + 6], 23, 76029189), v = f(v, s = f(s, g = f(g, l, v, s, n[t + 9], 4, -640364487), l, v, n[t + 12], 11, -421815835), g, l, n[t + 15], 16, 530742520), s, g, n[t + 2], 23, -995338651), v = i(v, s = i(s, g = i(g, l, v, s, n[t], 6, -198630844), l, v, n[t + 7], 10, 1126891415), g, l, n[t + 14], 15, -1416354905), s, g, n[t + 5], 21, -57434055), v = i(v, s = i(s, g = i(g, l, v, s, n[t + 12], 6, 1700485571), l, v, n[t + 3], 10, -1894986606), g, l, n[t + 10], 15, -1051523), s, g, n[t + 1], 21, -2054922799), v = i(v, s = i(s, g = i(g, l, v, s, n[t + 8], 6, 1873313359), l, v, n[t + 15], 10, -30611744), g, l, n[t + 6], 15, -1560198380), s, g, n[t + 13], 21, 1309151649), v = i(v, s = i(s, g = i(g, l, v, s, n[t + 4], 6, -145523070), l, v, n[t + 11], 10, -1120210379), g, l, n[t + 2], 15, 718787259), s, g, n[t + 9], 21, -343485551), 34 | g = e(g, u), 35 | l = e(l, a), 36 | v = e(v, h), 37 | s = e(s, d) 38 | return [g, l, v, s] 39 | } 40 | function h(n) { 41 | var r, t = "" 42 | for (r = 0; r < 32 * n.length; r += 8) 43 | t += String.fromCharCode(n[r >> 5] >>> r % 32 & 255) 44 | return t 45 | } 46 | function d(n) { 47 | var r, t = [] 48 | for (t[(n.length >> 2) - 1] = void 0, 49 | r = 0; r < t.length; r += 1) 50 | t[r] = 0 51 | for (r = 0; r < 8 * n.length; r += 8) 52 | t[r >> 5] |= (255 & n.charCodeAt(r / 8)) << r % 32 53 | return t 54 | } 55 | function g(n) { 56 | var r, t, e = "" 57 | for (t = 0; t < n.length; t += 1) 58 | r = n.charCodeAt(t), 59 | e += "0123456789abcdef".charAt(r >>> 4 & 15) + "0123456789abcdef".charAt(15 & r) 60 | return e 61 | } 62 | function l(n) { 63 | return unescape(encodeURIComponent(n)) 64 | } 65 | function v(n) { 66 | return function(n) { 67 | return h(a(d(n), 8 * n.length)) 68 | }(l(n)) 69 | } 70 | function s(n, r) { 71 | return function(n, r) { 72 | var t, e, u = d(n), o = [], c = [] 73 | for (o[15] = c[15] = void 0, 74 | u.length > 16 && (u = a(u, 8 * n.length)), 75 | t = 0; t < 16; t += 1) 76 | o[t] = 909522486 ^ u[t], 77 | c[t] = 1549556828 ^ u[t] 78 | return e = a(o.concat(d(r)), 512 + 8 * r.length), 79 | h(a(c.concat(e), 640)) 80 | }(l(n), l(r)) 81 | } 82 | 83 | var md5 = function(n, r, t) { 84 | return r ? t ? s(r, n) : function(n, r) { 85 | return g(s(n, r)) 86 | }(r, n) : t ? v(n) : function(n) { 87 | return g(v(n)) 88 | }(n) 89 | } 90 | 91 | function test(pwd){ 92 | console.log('123') 93 | return md5(pwd); 94 | } 95 | 96 | 97 | console.log(test('cjx8852077.')) -------------------------------------------------------------------------------- /网易易盾JS分析/README.md: -------------------------------------------------------------------------------- 1 | ## 网易易盾 JS 分析 2 | 3 | 以 网易 cc 的登录为入口 http://cc.163.com/category/live/ 右上角登录 4 | 5 | 6 | 7 | ### 一. 找到网易滑块相关的 url 8 | 9 | * 1. https://dl.reg.163.com/dl/ini?pd=cc&pkid=PFClpTB&pkht=cc.163.com&channel=0&topURL=http%3A%2F%2Fcc.163.com%2Fcategory%2Flive%2F&rtid=Pv7h7Vt1SxFSOXMDaLvtzcQdXqEB4Tmr&nocache=1570326450700 10 | 11 | >作用: 初始化易盾滑块 12 | 参数: (参数名,参数) 13 | ('pd', 'cc') 网易 cc 的标志,固定 14 | ('pkid', 'PFClpTB') 网易 cc 的 id,固定 15 | ('pkht', 'cc.163.com') 网易 cc 的 域名,固定 16 | ('channel', '0') 固定 17 | ('topURL', 'http://cc.163.com/category/') 点击登录的页面,可以固定 18 | ('rtid', rtid) rtid, JS 生成 19 | ('nocache', '1570335112543') 不使用缓存,参数是时间戳。 20 | 21 | 22 | 2. https://webzjcaptcha.reg.163.com/api/v2/get?id=744e2a6324ec5370616241baf4507538&fp=xkgWXll%5CCiMCXJfeNAZ5r6wqufPOotJ1KhT7WVB%2FUHtA9q7%2FCHYSLA2ekaE4smQrAkLHux9S8%5CCh7cLlUv5fddky%2FELCShEDKIuQM%2FeYJsRCRtRGdntvV%2BtubW9KZU0aaaV%2Fb74rJ2SsRVJ4YKq9RT20jS7KjU1AVgh0Y3fRlPezE6qd%3A1570327351808&https=true&type=2&version=2.11.4&dpr=1.25&dev=1&cb=xjFA7%5C%5C6JE0yFfEfmt7Xk40JTPxKgT8p%5C5Ap0e2%5CfYUjl7%5C8%5CMscKxDMSicOiafO&ipv6=false&runEnv=10&width=220&token=&referer=https%3A%2F%2Fdl.reg.163.com%2Fwebzj%2Fv1.0.1%2Fpub%2Findex2_new.html&callback=__JSONP_561dkr0_0 23 | 24 | > 作用:获取滑块背景图和滑块图片, 还有该次滑动请求的 token 25 | > 参数: 26 | ('id', '744e2a6324ec5370616241baf4507538') 网易 cc 的请求易盾的 id (固定) 27 | ('fp', 'xkgWXll%5CCiMCXJfeNAZ5r6wqufPOotJ1KhT7WVB%2FUHtA9q7%2FCHYSLA2ekaE4smQrAkLHux9S8%5CCh7cLlUv5fddky%2FELCShEDKIuQM%2FeYJsRCRtRGdntvV%2BtubW9KZU0aaaV%2Fb74rJ2SsRVJ4YKq9RT20jS7KjU1AVgh0Y3fRlPezE6qd%3A1570327351808') 指纹算法, JS 生成 28 | ('https', 'true') 固定 29 | ('type', '2') 固定 30 | ('version', '2.11.4') 易盾版本号 (固定) 31 | ('dpr', '1.25') 固定 32 | ('dev', '1') 固定 33 | ('cb', 'xjFA7%5C%5C6JE0yFfEfmt7Xk40JTPxKgT8p%5C5Ap0e2%5CfYUjl7%5C8%5CMscKxDMSicOiafO') JS 生成 34 | ('ipv6', 'false') 固定 35 | ('runEnv', '10') 固定 36 | ('width', '220') 滑块的实际宽度 37 | ('token', '') 空值 固定 38 | ('referer', 'https://dl.reg.163.com/webzj/v1.0.1/pub/index2_new.html') 固定 39 | ('callback','__JSONP_561dkr0_0') 放回 JSON 数据的前缀,可自己随意指定,例如: 'abc' 40 | 41 | > 重点: fp: 指纹算法,对应 cookies 中的 gdxidpyhxdE 42 | 特征: 一般指纹算法会取浏览器的一组数据放入一个数组,再用数组的 join 方法拼接,再进入一个摘要算法取一个哈希值。 43 | 解决方法: 找到 join 的数组,随机改变一些值,例如浏览器版本号,屏幕大小等等。 44 | 45 | 3. https://webzjcaptcha.reg.163.com/api/v2/check?id=744e2a6324ec5370616241baf4507538&token=e60692d05e1c47328f77c9f401e65364&acToken=9ca17ae2e6ffcda170e2e6ee8eb6688b88feafb86de9968ea7d44e968f9a84f365b194bcd4ef3aa793998aec2af0feaec3b92ab2b2e188e15f95928b91ee5f969b9fb6d55a8ab1f791ce80b89e8ab0b76295b6ee9e&data=%7B%22d%22%3A%22BfQ1UDLNIcrm1r8cwIu%2FCwzZnCoFNrz4n%2FExJSS9bJGTnk5hazmLfVqRxypkKbEx%2FUuKBpb%2FVyPTSsMvqB7pHMlaptfJtOjgHDogOIAh8%5C%5CdwKb5eZcizMuFrt0eNt%2FZ0k2BamUbgE%2BX6MsKE%2Byqr%5C%5CvBTMWoxe2khXsgP2IVzaaiJw6zRcQ2Xa7F9zNQRqgxmcOdT%2FEExql1x0GtiFZ889OCQVvQXSY5c7BerCsbLfcDVf%2FQ2tkOs1ZJzGh%2FyiiY%2Bal6F7pYaUPgwqBAyI%2FIcL%2BvpD4JmxcgAQRqyglfQGBr5mP2lsL%5C%5CN7R1wfbWHKbmxjp1JagxU%2Fwj%5C%5Chk8I1z7cEkygkwJaMsktXc51Z8gMwwnVj5oxysXQow8vM7VAmudC%2BRhlzeNi4WLawa6AVNBaEjKgSWPitTF2Ej7ehm2ieD%2FjemzrwB7F8ez9qEgl9vCjh2qZ5kwzrCpzi%2Ba5xquT4cTnSfvDJ61rYSNB9u%2BxmaHRh8GHlX60VSHT8vXn09OIPf6HrdQbuCLQng1eXc1GR8nUqWAPZB7E6I7cE%2F0qkf6J2250wFBX5YYQfKd0hU7UXhzPtID9rDdWKTOnRh7paiIiQeH9wb7I%2F8nT92FAq%2BOaeoJEMmgweLLMC9DCjV1s55DRLo2bRDibWORjutMgkkI97mkknCUAxP9Y%5C%5C%5C%5C4EGRnlRkMrhEPH9jydxNRRLaPHPyGRVWLKVPXbJY257h%5C%5CNfbGF7o%5C%5Ca0pX4MITuwwX5qojIHU5i%2FtxaEkLd5f%5C%5CB6E%5C%5C0a%2BYE5hXqalmP2vLxXSvx6Id2rDdWnX7ERtAY7v%2FbFqqH4aVJj8PkhIw0SZ2vtTF2An9ZLCbnI4SMkQ7Aq%5C%5ClmgCDKcgqM6IUhdG2225tIrDdhmr7%5C%5CxOE0BVdKbNAhkMRXl6TIvz67DPZ3%22%2C%22m%22%3A%22%22%2C%22p%22%3A%22vcFH9K7I%5C%5C%2BdKLNnZyT%5C%5CXQcc4gqEd72pssbWXzjFBhywxvnvSdkqgXp33%22%2C%22ext%22%3A%22t9hyjeLOLM%2BF47azSHf5cNmHFGzrI9GV%22%7D&width=220&type=2&version=2.11.4&cb=kpTz%5C55I77EvE7PK88JZf0W%5C61IjJ8P6baf2indJhw%2BCo%5CpY%2FGNb4kWfoXWh0Ifx&extraData=%40163.com&runEnv=10&referer=https%3A%2F%2Fdl.reg.163.com%2Fwebzj%2Fv1.0.1%2Fpub%2Findex2_new.html&callback=__JSONP_deqjc4q_1 46 | 47 | >作用:提交轨迹数据,返回滑动成功的标志 48 | >参数: 49 | ('id', '744e2a6324ec5370616241baf4507538') 固定 50 | ('token', 'e60692d05e1c47328f77c9f401e65364') 链接 2 中返回的 token 51 | ('acToken', '9ca17ae2e6ffcda170e2e6ee8eb6688b88feafb86de9968ea7d44e968f9a84f365b194bcd4ef3aa793998aec2af0feaec3b92ab2b2e188e15f95928b91ee5f969b9fb6d55a8ab1f791ce80b89e8ab0b76295b6ee9e') 目前网易无验证这个参数,实测可以携带 52 | ('data', '%7B%22d%22%3A%22BfQ1UDLNIcrm1r8cwIu%2FCwzZnCoFNrz4n%2FExJSS9bJGTnk5hazmLfVqRxypkKbEx%2FUuKBpb%2FVyPTSsMvqB7pHMlaptfJtOjgHDogOIAh8%5C%5CdwKb5eZcizMuFrt0eNt%2FZ0k2BamUbgE%2BX6MsKE%2Byqr%5C%5CvBTMWoxe2khXsgP2IVzaaiJw6zRcQ2Xa7F9zNQRqgxmcOdT%2FEExql1x0GtiFZ889OCQVvQXSY5c7BerCsbLfcDVf%2FQ2tkOs1ZJzGh%2FyiiY%2Bal6F7pYaUPgwqBAyI%2FIcL%2BvpD4JmxcgAQRqyglfQGBr5mP2lsL%5C%5CN7R1wfbWHKbmxjp1JagxU%2Fwj%5C%5Chk8I1z7cEkygkwJaMsktXc51Z8gMwwnVj5oxysXQow8vM7VAmudC%2BRhlzeNi4WLawa6AVNBaEjKgSWPitTF2Ej7ehm2ieD%2FjemzrwB7F8ez9qEgl9vCjh2qZ5kwzrCpzi%2Ba5xquT4cTnSfvDJ61rYSNB9u%2BxmaHRh8GHlX60VSHT8vXn09OIPf6HrdQbuCLQng1eXc1GR8nUqWAPZB7E6I7cE%2F0qkf6J2250wFBX5YYQfKd0hU7UXhzPtID9rDdWKTOnRh7paiIiQeH9wb7I%2F8nT92FAq%2BOaeoJEMmgweLLMC9DCjV1s55DRLo2bRDibWORjutMgkkI97mkknCUAxP9Y%5C%5C%5C%5C4EGRnlRkMrhEPH9jydxNRRLaPHPyGRVWLKVPXbJY257h%5C%5CNfbGF7o%5C%5Ca0pX4MITuwwX5qojIHU5i%2FtxaEkLd5f%5C%5CB6E%5C%5C0a%2BYE5hXqalmP2vLxXSvx6Id2rDdWnX7ERtAY7v%2FbFqqH4aVJj8PkhIw0SZ2vtTF2An9ZLCbnI4SMkQ7Aq%5C%5ClmgCDKcgqM6IUhdG2225tIrDdhmr7%5C%5CxOE0BVdKbNAhkMRXl6TIvz67DPZ3%22%2C%22m%22%3A%22%22%2C%22p%22%3A%22vcFH9K7I%5C%5C%2BdKLNnZyT%5C%5CXQcc4gqEd72pssbWXzjFBhywxvnvSdkqgXp33%22%2C%22ext%22%3A%22t9hyjeLOLM%2BF47azSHf5cNmHFGzrI9GV%22%7D') 加密后的轨迹, JS 生成 53 | ('width', '220') 滑块图片实际宽度, 固定 54 | ('type', '2') 固定 55 | ('version', '2.11.4') 固定 56 | ('cb', 'kpTz%5C55I77EvE7PK88JZf0W%5C61IjJ8P6baf2indJhw%2BCo%5CpY%2FGNb4kWfoXWh0Ifx') 和链接 2 中的 cb 是同一个算法, 重新生成的 cb 57 | ('extraData', '') 这是请求登录对应的网易账号,可使用空值 58 | ('runEnv', '10') 固定 59 | ('referer', 'https://dl.reg.163.com/webzj/v1.0.1/pub/index2_new.html') 固定 60 | ('callback', callback) 放回 JSON 数据的前缀,可自己随意指定,例如: 'abc' 61 | 62 | > 注意点: width 参数,这是真正的滑块图片宽度,和链接 2 中返回的图片的宽度是不一样的,实际提交的距离要按原图像的宽度除以这个宽度进行计算。 63 | 64 | ### 二. 找出加密函数的 JS 代码,在本地 node 环境模拟生成。 65 | 66 | 1. rtid 修改后的 JS 文件 --> my_rtid.js 67 | 68 | 2. cb 修改后的 JS 文件 --> my_cb.js 69 | 70 | 3. fp 修改后的 JS 文件 --> my_fp.js 71 | 72 | 4. 利用 opencv 识别滑块滑动距离 --> test_resp 中的 findfic 函数。 73 | 74 | 5. data 生成轨迹和轨迹加密,修改后的 JS 文件 --> my_trace.js 75 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /md5/万创帮.js: -------------------------------------------------------------------------------- 1 | // https://m.wcbchina.com/login/other-login.html 2 | 3 | function c(x, c) { 4 | x[c >> 5] |= 128 << c % 32, 5 | x[(c + 64 >>> 9 << 4) + 14] = c; 6 | for (var a = 1732584193, _ = -271733879, y = -1732584194, d = 271733878, i = 0; i < x.length; i += 16) { 7 | var b = a 8 | , B = _ 9 | , D = y 10 | , E = d; 11 | a = h(a, _, y, d, x[i + 0], 7, -680876936), 12 | d = h(d, a, _, y, x[i + 1], 12, -389564586), 13 | y = h(y, d, a, _, x[i + 2], 17, 606105819), 14 | _ = h(_, y, d, a, x[i + 3], 22, -1044525330), 15 | a = h(a, _, y, d, x[i + 4], 7, -176418897), 16 | d = h(d, a, _, y, x[i + 5], 12, 1200080426), 17 | y = h(y, d, a, _, x[i + 6], 17, -1473231341), 18 | _ = h(_, y, d, a, x[i + 7], 22, -45705983), 19 | a = h(a, _, y, d, x[i + 8], 7, 1770035416), 20 | d = h(d, a, _, y, x[i + 9], 12, -1958414417), 21 | y = h(y, d, a, _, x[i + 10], 17, -42063), 22 | _ = h(_, y, d, a, x[i + 11], 22, -1990404162), 23 | a = h(a, _, y, d, x[i + 12], 7, 1804603682), 24 | d = h(d, a, _, y, x[i + 13], 12, -40341101), 25 | y = h(y, d, a, _, x[i + 14], 17, -1502002290), 26 | _ = h(_, y, d, a, x[i + 15], 22, 1236535329), 27 | a = g(a, _, y, d, x[i + 1], 5, -165796510), 28 | d = g(d, a, _, y, x[i + 6], 9, -1069501632), 29 | y = g(y, d, a, _, x[i + 11], 14, 643717713), 30 | _ = g(_, y, d, a, x[i + 0], 20, -373897302), 31 | a = g(a, _, y, d, x[i + 5], 5, -701558691), 32 | d = g(d, a, _, y, x[i + 10], 9, 38016083), 33 | y = g(y, d, a, _, x[i + 15], 14, -660478335), 34 | _ = g(_, y, d, a, x[i + 4], 20, -405537848), 35 | a = g(a, _, y, d, x[i + 9], 5, 568446438), 36 | d = g(d, a, _, y, x[i + 14], 9, -1019803690), 37 | y = g(y, d, a, _, x[i + 3], 14, -187363961), 38 | _ = g(_, y, d, a, x[i + 8], 20, 1163531501), 39 | a = g(a, _, y, d, x[i + 13], 5, -1444681467), 40 | d = g(d, a, _, y, x[i + 2], 9, -51403784), 41 | y = g(y, d, a, _, x[i + 7], 14, 1735328473), 42 | _ = g(_, y, d, a, x[i + 12], 20, -1926607734), 43 | a = v(a, _, y, d, x[i + 5], 4, -378558), 44 | d = v(d, a, _, y, x[i + 8], 11, -2022574463), 45 | y = v(y, d, a, _, x[i + 11], 16, 1839030562), 46 | _ = v(_, y, d, a, x[i + 14], 23, -35309556), 47 | a = v(a, _, y, d, x[i + 1], 4, -1530992060), 48 | d = v(d, a, _, y, x[i + 4], 11, 1272893353), 49 | y = v(y, d, a, _, x[i + 7], 16, -155497632), 50 | _ = v(_, y, d, a, x[i + 10], 23, -1094730640), 51 | a = v(a, _, y, d, x[i + 13], 4, 681279174), 52 | d = v(d, a, _, y, x[i + 0], 11, -358537222), 53 | y = v(y, d, a, _, x[i + 3], 16, -722521979), 54 | _ = v(_, y, d, a, x[i + 6], 23, 76029189), 55 | a = v(a, _, y, d, x[i + 9], 4, -640364487), 56 | d = v(d, a, _, y, x[i + 12], 11, -421815835), 57 | y = v(y, d, a, _, x[i + 15], 16, 530742520), 58 | _ = v(_, y, d, a, x[i + 2], 23, -995338651), 59 | a = A(a, _, y, d, x[i + 0], 6, -198630844), 60 | d = A(d, a, _, y, x[i + 7], 10, 1126891415), 61 | y = A(y, d, a, _, x[i + 14], 15, -1416354905), 62 | _ = A(_, y, d, a, x[i + 5], 21, -57434055), 63 | a = A(a, _, y, d, x[i + 12], 6, 1700485571), 64 | d = A(d, a, _, y, x[i + 3], 10, -1894986606), 65 | y = A(y, d, a, _, x[i + 10], 15, -1051523), 66 | _ = A(_, y, d, a, x[i + 1], 21, -2054922799), 67 | a = A(a, _, y, d, x[i + 8], 6, 1873313359), 68 | d = A(d, a, _, y, x[i + 15], 10, -30611744), 69 | y = A(y, d, a, _, x[i + 6], 15, -1560198380), 70 | _ = A(_, y, d, a, x[i + 13], 21, 1309151649), 71 | a = A(a, _, y, d, x[i + 4], 6, -145523070), 72 | d = A(d, a, _, y, x[i + 11], 10, -1120210379), 73 | y = A(y, d, a, _, x[i + 2], 15, 718787259), 74 | _ = A(_, y, d, a, x[i + 9], 21, -343485551), 75 | a = C(a, b), 76 | _ = C(_, B), 77 | y = C(y, D), 78 | d = C(d, E) 79 | } 80 | return Array(a, _, y, d) 81 | } 82 | function a(q, c, a, x, s, t) { 83 | return C(y(C(C(c, q), C(x, t)), s), a) 84 | } 85 | function h(c, h, g, d, x, s, t) { 86 | return a(h & g | ~h & d, c, h, x, s, t) 87 | } 88 | function g(c, h, g, d, x, s, t) { 89 | return a(h & d | g & ~d, c, h, x, s, t) 90 | } 91 | function v(c, h, g, d, x, s, t) { 92 | return a(h ^ g ^ d, c, h, x, s, t) 93 | } 94 | function A(c, h, g, d, x, s, t) { 95 | return a(g ^ (h | ~d), c, h, x, s, t) 96 | } 97 | function _(a, h) { 98 | var g = b(a); 99 | g.length > 16 && (g = c(g, a.length * U)); 100 | for (var v = Array(16), A = Array(16), i = 0; 16 > i; i++) 101 | v[i] = 909522486 ^ g[i], 102 | A[i] = 1549556828 ^ g[i]; 103 | var _ = c(v.concat(b(h)), 512 + h.length * U); 104 | return c(A.concat(_), 640) 105 | } 106 | function C(x, c) { 107 | var a = (65535 & x) + (65535 & c) 108 | , h = (x >> 16) + (c >> 16) + (a >> 16); 109 | return h << 16 | 65535 & a 110 | } 111 | function y(c, a) { 112 | return c << a | c >>> 32 - a 113 | } 114 | function b(c) { 115 | for (var a = Array(), h = (1 << U) - 1, i = 0; i < c.length * U; i += U) 116 | a[i >> 5] |= (c.charCodeAt(i / U) & h) << i % 32; 117 | return a 118 | } 119 | function B(c) { 120 | for (var a = "", h = (1 << U) - 1, i = 0; i < 32 * c.length; i += U) 121 | a += String.fromCharCode(c[i >> 5] >>> i % 32 & h); 122 | return a 123 | } 124 | function D(c) { 125 | for (var a = F ? "0123456789ABCDEF" : "0123456789abcdef", h = "", i = 0; i < 4 * c.length; i++) 126 | h += a.charAt(c[i >> 2] >> i % 4 * 8 + 4 & 15) + a.charAt(c[i >> 2] >> i % 4 * 8 & 15); 127 | return h 128 | } 129 | function E(c) { 130 | for (var a = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", h = "", i = 0; i < 4 * c.length; i += 3) 131 | for (var g = (c[i >> 2] >> 8 * (i % 4) & 255) << 16 | (c[i + 1 >> 2] >> 8 * ((i + 1) % 4) & 255) << 8 | c[i + 2 >> 2] >> 8 * ((i + 2) % 4) & 255, v = 0; 4 > v; v++) 132 | h += 8 * i + 6 * v > 32 * c.length ? S : a.charAt(g >> 6 * (3 - v) & 63); 133 | return h 134 | } 135 | var F = 0 136 | , S = "" 137 | , U = 8 138 | , j = { 139 | hex_md5: function(s) { 140 | return D(c(b(s), s.length * U)).toUpperCase() 141 | }, 142 | b64_md5: function(s) { 143 | return E(c(b(s), s.length * U)) 144 | }, 145 | str_md5: function(s) { 146 | return B(c(b(s), s.length * U)) 147 | }, 148 | hex_hmac_md5: function(c, a) { 149 | return D(_(c, a)) 150 | }, 151 | b64_hmac_md5: function(c, a) { 152 | return E(_(c, a)) 153 | }, 154 | str_hmac_md5: function(c, a) { 155 | return B(_(c, a)) 156 | } 157 | }; 158 | md5 = j; 159 | 160 | var time = new Date().getTime(); 161 | time = '1568564879630'; 162 | console.log(time); 163 | var sign = md5.hex_md5(time).toUpperCase(); 164 | console.log(sign); 165 | 166 | 167 | -------------------------------------------------------------------------------- /md5/叮当快药.js: -------------------------------------------------------------------------------- 1 | // https://m.ddky.com/regsiter.html 2 | 3 | function md5(t) { 4 | function e(t, e) { 5 | return t << e | t >>> 32 - e 6 | } 7 | function s(t, e) { 8 | var s, i, o, n, a; 9 | return o = 2147483648 & t, 10 | n = 2147483648 & e, 11 | s = 1073741824 & t, 12 | i = 1073741824 & e, 13 | a = (1073741823 & t) + (1073741823 & e), 14 | s & i ? 2147483648 ^ a ^ o ^ n : s | i ? 1073741824 & a ? 3221225472 ^ a ^ o ^ n : 1073741824 ^ a ^ o ^ n : a ^ o ^ n 15 | } 16 | function i(t, e, s) { 17 | return t & e | ~t & s 18 | } 19 | function o(t, e, s) { 20 | return t & s | e & ~s 21 | } 22 | function n(t, e, s) { 23 | return t ^ e ^ s 24 | } 25 | function a(t, e, s) { 26 | return e ^ (t | ~s) 27 | } 28 | function r(t, o, n, a, r, c, d) { 29 | return t = s(t, s(s(i(o, n, a), r), d)), 30 | s(e(t, c), o) 31 | } 32 | function c(t, i, n, a, r, c, d) { 33 | return t = s(t, s(s(o(i, n, a), r), d)), 34 | s(e(t, c), i) 35 | } 36 | function d(t, i, o, a, r, c, d) { 37 | return t = s(t, s(s(n(i, o, a), r), d)), 38 | s(e(t, c), i) 39 | } 40 | function l(t, i, o, n, r, c, d) { 41 | return t = s(t, s(s(a(i, o, n), r), d)), 42 | s(e(t, c), i) 43 | } 44 | function u(t) { 45 | var e, s = t.length, i = s + 8, o = (i - i % 64) / 64, n = 16 * (o + 1), a = Array(n - 1), r = 0, c = 0; 46 | while (c < s) 47 | e = (c - c % 4) / 4, 48 | r = c % 4 * 8, 49 | a[e] = a[e] | t.charCodeAt(c) << r, 50 | c++; 51 | return e = (c - c % 4) / 4, 52 | r = c % 4 * 8, 53 | a[e] = a[e] | 128 << r, 54 | a[n - 2] = s << 3, 55 | a[n - 1] = s >>> 29, 56 | a 57 | } 58 | function h(t) { 59 | var e, s, i = "", o = ""; 60 | for (s = 0; s <= 3; s++) 61 | e = t >>> 8 * s & 255, 62 | o = "0" + e.toString(16), 63 | i += o.substr(o.length - 2, 2); 64 | return i 65 | } 66 | function m(t) { 67 | t = t.replace(/\r\n/g, "\n"); 68 | for (var e = "", s = 0; s < t.length; s++) { 69 | var i = t.charCodeAt(s); 70 | i < 128 ? e += String.fromCharCode(i) : i > 127 && i < 2048 ? (e += String.fromCharCode(i >> 6 | 192), 71 | e += String.fromCharCode(63 & i | 128)) : (e += String.fromCharCode(i >> 12 | 224), 72 | e += String.fromCharCode(i >> 6 & 63 | 128), 73 | e += String.fromCharCode(63 & i | 128)) 74 | } 75 | return e 76 | } 77 | var p, g, f, A, v, I, y, C, b, w = Array(), k = 7, S = 12, V = 17, E = 22, B = 5, x = 9, O = 14, j = 20, T = 4, Q = 11, D = 16, U = 23, N = 6, F = 10, R = 15, L = 21; 78 | for (t = m(t), 79 | w = u(t), 80 | I = 1732584193, 81 | y = 4023233417, 82 | C = 2562383102, 83 | b = 271733878, 84 | p = 0; p < w.length; p += 16) 85 | g = I, 86 | f = y, 87 | A = C, 88 | v = b, 89 | I = r(I, y, C, b, w[p + 0], k, 3614090360), 90 | b = r(b, I, y, C, w[p + 1], S, 3905402710), 91 | C = r(C, b, I, y, w[p + 2], V, 606105819), 92 | y = r(y, C, b, I, w[p + 3], E, 3250441966), 93 | I = r(I, y, C, b, w[p + 4], k, 4118548399), 94 | b = r(b, I, y, C, w[p + 5], S, 1200080426), 95 | C = r(C, b, I, y, w[p + 6], V, 2821735955), 96 | y = r(y, C, b, I, w[p + 7], E, 4249261313), 97 | I = r(I, y, C, b, w[p + 8], k, 1770035416), 98 | b = r(b, I, y, C, w[p + 9], S, 2336552879), 99 | C = r(C, b, I, y, w[p + 10], V, 4294925233), 100 | y = r(y, C, b, I, w[p + 11], E, 2304563134), 101 | I = r(I, y, C, b, w[p + 12], k, 1804603682), 102 | b = r(b, I, y, C, w[p + 13], S, 4254626195), 103 | C = r(C, b, I, y, w[p + 14], V, 2792965006), 104 | y = r(y, C, b, I, w[p + 15], E, 1236535329), 105 | I = c(I, y, C, b, w[p + 1], B, 4129170786), 106 | b = c(b, I, y, C, w[p + 6], x, 3225465664), 107 | C = c(C, b, I, y, w[p + 11], O, 643717713), 108 | y = c(y, C, b, I, w[p + 0], j, 3921069994), 109 | I = c(I, y, C, b, w[p + 5], B, 3593408605), 110 | b = c(b, I, y, C, w[p + 10], x, 38016083), 111 | C = c(C, b, I, y, w[p + 15], O, 3634488961), 112 | y = c(y, C, b, I, w[p + 4], j, 3889429448), 113 | I = c(I, y, C, b, w[p + 9], B, 568446438), 114 | b = c(b, I, y, C, w[p + 14], x, 3275163606), 115 | C = c(C, b, I, y, w[p + 3], O, 4107603335), 116 | y = c(y, C, b, I, w[p + 8], j, 1163531501), 117 | I = c(I, y, C, b, w[p + 13], B, 2850285829), 118 | b = c(b, I, y, C, w[p + 2], x, 4243563512), 119 | C = c(C, b, I, y, w[p + 7], O, 1735328473), 120 | y = c(y, C, b, I, w[p + 12], j, 2368359562), 121 | I = d(I, y, C, b, w[p + 5], T, 4294588738), 122 | b = d(b, I, y, C, w[p + 8], Q, 2272392833), 123 | C = d(C, b, I, y, w[p + 11], D, 1839030562), 124 | y = d(y, C, b, I, w[p + 14], U, 4259657740), 125 | I = d(I, y, C, b, w[p + 1], T, 2763975236), 126 | b = d(b, I, y, C, w[p + 4], Q, 1272893353), 127 | C = d(C, b, I, y, w[p + 7], D, 4139469664), 128 | y = d(y, C, b, I, w[p + 10], U, 3200236656), 129 | I = d(I, y, C, b, w[p + 13], T, 681279174), 130 | b = d(b, I, y, C, w[p + 0], Q, 3936430074), 131 | C = d(C, b, I, y, w[p + 3], D, 3572445317), 132 | y = d(y, C, b, I, w[p + 6], U, 76029189), 133 | I = d(I, y, C, b, w[p + 9], T, 3654602809), 134 | b = d(b, I, y, C, w[p + 12], Q, 3873151461), 135 | C = d(C, b, I, y, w[p + 15], D, 530742520), 136 | y = d(y, C, b, I, w[p + 2], U, 3299628645), 137 | I = l(I, y, C, b, w[p + 0], N, 4096336452), 138 | b = l(b, I, y, C, w[p + 7], F, 1126891415), 139 | C = l(C, b, I, y, w[p + 14], R, 2878612391), 140 | y = l(y, C, b, I, w[p + 5], L, 4237533241), 141 | I = l(I, y, C, b, w[p + 12], N, 1700485571), 142 | b = l(b, I, y, C, w[p + 3], F, 2399980690), 143 | C = l(C, b, I, y, w[p + 10], R, 4293915773), 144 | y = l(y, C, b, I, w[p + 1], L, 2240044497), 145 | I = l(I, y, C, b, w[p + 8], N, 1873313359), 146 | b = l(b, I, y, C, w[p + 15], F, 4264355552), 147 | C = l(C, b, I, y, w[p + 6], R, 2734768916), 148 | y = l(y, C, b, I, w[p + 13], L, 1309151649), 149 | I = l(I, y, C, b, w[p + 4], N, 4149444226), 150 | b = l(b, I, y, C, w[p + 11], F, 3174756917), 151 | C = l(C, b, I, y, w[p + 2], R, 718787259), 152 | y = l(y, C, b, I, w[p + 9], L, 3951481745), 153 | I = s(I, g), 154 | y = s(y, f), 155 | C = s(C, A), 156 | b = s(b, v); 157 | var M = h(I) + h(y) + h(C) + h(b); 158 | return M.toUpperCase() 159 | } 160 | 161 | function l(t, e) { 162 | var s = Object.keys(t).sort() 163 | , i = s.reduce(function(e, s) { 164 | return e + s + t[s] 165 | }, "") 166 | , o = "".concat(t.method).concat(i).concat(e); 167 | return md5(o) 168 | } 169 | 170 | 171 | var password = 'qwer1234' 172 | var userName = '13751678541' 173 | var now = new Date() 174 | var time = now.getFullYear() + '-' + (now.getMonth()+1) + '-' + now.getDate() + ' ' + now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds() 175 | // console.log(time) 176 | 177 | var data = { 178 | method: "ddsy.user.reg.reguser", 179 | password: md5(password).toLowerCase(), 180 | plat: "H5", 181 | platform: "H5", 182 | smsCode: "3752", 183 | t: time, 184 | userName: userName, 185 | v: "1.0", 186 | versionName: "5.3.0" 187 | } 188 | var key = '6C57AB91A1308E26B797F4CD382AC79D' 189 | 190 | console.log(l(data, key)) -------------------------------------------------------------------------------- /网易易盾JS分析/fp_params.md: -------------------------------------------------------------------------------- 1 | i = "true###true###true###undefined###function######Win32###data:image/png;base64,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###ActiveBorder:rgb(255, 255, 255):ActiveCaption:rgb(204, 204, 204):AppWorkspace:rgb(255, 255, 255):Background:rgb(99, 99, 206):ButtonFace:rgb(221, 221, 221):ButtonHighlight:rgb(221, 221, 221):ButtonShadow:rgb(136, 136, 136):ButtonText:rgb(0, 0, 0):CaptionText:rgb(0, 0, 0):GrayText:rgb(128, 128, 128):Highlight:rgb(181, 213, 255):HighlightText:rgb(0, 0, 0):InactiveBorder:rgb(255, 255, 255):InactiveCaption:rgb(255, 255, 255):InactiveCaptionText:rgb(127, 127, 127):InfoBackground:rgb(251, 252, 197):InfoText:rgb(0, 0, 0):Menu:rgb(247, 247, 247):MenuText:rgb(0, 0, 0):Scrollbar:rgb(255, 255, 255):ThreeDDarkShadow:rgb(102, 102, 102):ThreeDFace:rgb(192, 192, 192):ThreeDHighlight:rgb(221, 221, 221):ThreeDLightShadow:rgb(192, 192, 192):ThreeDShadow:rgb(136, 136, 136):Window:rgb(255, 255, 255):WindowFrame:rgb(204, 204, 204):WindowText:rgb(0, 0, 0)" 2 | 3 | 4 | o = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36###zh-CN###24###864x1536###-480######Chrome PDF Plugin::Portable Document Format::application/x-google-chrome-pdf~pdf$Chrome PDF Viewer::::application/pdf~pdf$Native Client::::application/x-nacl~,application/x-pnacl~;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" 5 | 6 | w = "{'v':'v1.1','fp':'18746497805452,32690818154358','u':'Dlp1570420186524Ovw','h':'dl.reg.163.com'}" -------------------------------------------------------------------------------- /SHA1/e商.js: -------------------------------------------------------------------------------- 1 | // http://xayrtx.cn/ebtouch/ 2 | 3 | var hexcase = 1; 4 | /* hex output format. 0 - lowercase; 1 - uppercase */ 5 | var b64pad = ""; 6 | /* base-64 pad character. "=" for strict RFC compliance */ 7 | var chrsz = 8; 8 | /* bits per input character. 8 - ASCII; 16 - Unicode */ 9 | 10 | /* 11 | * These are the functions you'll usually want to call 12 | * They take string arguments and return either hex or base-64 encoded strings 13 | */ 14 | function hex_sha1(s) { 15 | return binb2hex(core_sha1(str2binb(s), s.length * chrsz)); 16 | } 17 | function b64_sha1(s) { 18 | return binb2b64(core_sha1(str2binb(s), s.length * chrsz)); 19 | } 20 | function str_sha1(s) { 21 | return binb2str(core_sha1(str2binb(s), s.length * chrsz)); 22 | } 23 | function hex_hmac_sha1(key, data) { 24 | return binb2hex(core_hmac_sha1(key, data)); 25 | } 26 | function b64_hmac_sha1(key, data) { 27 | return binb2b64(core_hmac_sha1(key, data)); 28 | } 29 | function str_hmac_sha1(key, data) { 30 | return binb2str(core_hmac_sha1(key, data)); 31 | } 32 | 33 | /* 34 | * Perform a simple self-test to see if the VM is working 35 | */ 36 | function sha1_vm_test() { 37 | return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d"; 38 | } 39 | 40 | /* 41 | * Calculate the SHA-1 of an array of big-endian words, and a bit length 42 | */ 43 | function core_sha1(x, len) { 44 | /* append padding */ 45 | x[len >> 5] |= 0x80 << (24 - len % 32); 46 | x[((len + 64 >> 9) << 4) + 15] = len; 47 | 48 | var w = Array(80); 49 | var a = 1732584193; 50 | var b = -271733879; 51 | var c = -1732584194; 52 | var d = 271733878; 53 | var e = -1009589776; 54 | 55 | for (var i = 0; i < x.length; i += 16) { 56 | var olda = a; 57 | var oldb = b; 58 | var oldc = c; 59 | var oldd = d; 60 | var olde = e; 61 | 62 | for (var j = 0; j < 80; j++) { 63 | if (j < 16) 64 | w[j] = x[i + j]; 65 | else 66 | w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1); 67 | var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j))); 68 | e = d; 69 | d = c; 70 | c = rol(b, 30); 71 | b = a; 72 | a = t; 73 | } 74 | 75 | a = safe_add(a, olda); 76 | b = safe_add(b, oldb); 77 | c = safe_add(c, oldc); 78 | d = safe_add(d, oldd); 79 | e = safe_add(e, olde); 80 | } 81 | return Array(a, b, c, d, e); 82 | 83 | } 84 | 85 | /* 86 | * Perform the appropriate triplet combination function for the current 87 | * iteration 88 | */ 89 | function sha1_ft(t, b, c, d) { 90 | if (t < 20) 91 | return (b & c) | ((~b) & d); 92 | if (t < 40) 93 | return b ^ c ^ d; 94 | if (t < 60) 95 | return (b & c) | (b & d) | (c & d); 96 | return b ^ c ^ d; 97 | } 98 | 99 | /* 100 | * Determine the appropriate additive constant for the current iteration 101 | */ 102 | function sha1_kt(t) { 103 | return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514; 104 | } 105 | 106 | /* 107 | * Calculate the HMAC-SHA1 of a key and some data 108 | */ 109 | function core_hmac_sha1(key, data) { 110 | var bkey = str2binb(key); 111 | if (bkey.length > 16) 112 | bkey = core_sha1(bkey, key.length * chrsz); 113 | 114 | var ipad = Array(16) 115 | , opad = Array(16); 116 | for (var i = 0; i < 16; i++) { 117 | ipad[i] = bkey[i] ^ 0x36363636; 118 | opad[i] = bkey[i] ^ 0x5C5C5C5C; 119 | } 120 | 121 | var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz); 122 | return core_sha1(opad.concat(hash), 512 + 160); 123 | } 124 | 125 | /* 126 | * Add integers, wrapping at 2^32. This uses 16-bit operations internally 127 | * to work around bugs in some JS interpreters. 128 | */ 129 | function safe_add(x, y) { 130 | var lsw = (x & 0xFFFF) + (y & 0xFFFF); 131 | var msw = (x >> 16) + (y >> 16) + (lsw >> 16); 132 | return (msw << 16) | (lsw & 0xFFFF); 133 | } 134 | 135 | /* 136 | * Bitwise rotate a 32-bit number to the left. 137 | */ 138 | function rol(num, cnt) { 139 | return (num << cnt) | (num >>> (32 - cnt)); 140 | } 141 | 142 | /* 143 | * Convert an 8-bit or 16-bit string to an array of big-endian words 144 | * In 8-bit function, characters >255 have their hi-byte silently ignored. 145 | */ 146 | function str2binb(str) { 147 | var bin = Array(); 148 | var mask = (1 << chrsz) - 1; 149 | for (var i = 0; i < str.length * chrsz; i += chrsz) 150 | bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i % 32); 151 | return bin; 152 | } 153 | 154 | /* 155 | * Convert an array of big-endian words to a string 156 | */ 157 | function binb2str(bin) { 158 | var str = ""; 159 | var mask = (1 << chrsz) - 1; 160 | for (var i = 0; i < bin.length * 32; i += chrsz) 161 | str += String.fromCharCode((bin[i >> 5] >>> (24 - i % 32)) & mask); 162 | return str; 163 | } 164 | 165 | /* 166 | * Convert an array of big-endian words to a hex string. 167 | */ 168 | function binb2hex(binarray) { 169 | var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; 170 | var str = ""; 171 | for (var i = 0; i < binarray.length * 4; i++) { 172 | str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF); 173 | } 174 | return str; 175 | } 176 | 177 | /* 178 | * Convert an array of big-endian words to a base-64 string 179 | */ 180 | function binb2b64(binarray) { 181 | var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 182 | var str = ""; 183 | for (var i = 0; i < binarray.length * 4; i += 3) { 184 | var triplet = (((binarray[i >> 2] >> 8 * (3 - i % 4)) & 0xFF) << 16) | (((binarray[i + 1 >> 2] >> 8 * (3 - (i + 1) % 4)) & 0xFF) << 8) | ((binarray[i + 2 >> 2] >> 8 * (3 - (i + 2) % 4)) & 0xFF); 185 | for (var j = 0; j < 4; j++) { 186 | if (i * 8 + j * 6 > binarray.length * 32) 187 | str += b64pad; 188 | else 189 | str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F); 190 | } 191 | } 192 | return str; 193 | } 194 | var bDebug; 195 | try { 196 | execScript('\nfunction StrConv(v)\ndim i, n, s, s2, c, nc\nn =LenB(v): i =1: s =""\ndo while i<= n\nc =MidB(v, i, 1)\nnc =AscB(c)\nif nc >128 then\ni =i +1\nc =MidB(v, i, 1)\nnc =nc*256 +AscB(c)\nend if\nc =Chr(nc)\ns = s & c\ni =i +1\nloop\nStrConv =s\nend function\n\nFunction IsVBDate(v)\nIsVBDate =IsDate(v)\nEnd Function\n\nFunction vbTrim(v)\nvbTrim =Trim(v)\nEnd Function\n', 'VBScript'); 197 | } catch (e) {} 198 | function http_Get(szUrl, strType) { 199 | var ohttp = new ActiveXObject('Microsoft.xmlhttp') 200 | , strText = '' 201 | , isTest = 0; 202 | try { 203 | isTest = new ActiveXObject("NetBox"); 204 | isTest = 1 205 | } catch (e) {} 206 | if (isTest) { 207 | ohttp.open("GET", "/XMLHttp.asp?url=" + szUrl, false); 208 | } else { 209 | ohttp.open("GET", szUrl, false); 210 | } 211 | ohttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 212 | ohttp.send(); 213 | strType = validInt(strType); 214 | if (strType) 215 | strText = StrConv(ohttp.responseBody); 216 | else 217 | strText = ohttp.responseText; 218 | if (ohttp.status == 200) 219 | return (strText); 220 | return (parseError2(strText)); 221 | } 222 | function http_POST(szUrl, strData, strType) { 223 | var ohttp = new ActiveXObject('Microsoft.xmlhttp') 224 | , strText = ''; 225 | ohttp.open("POST", "/XMLHttp.asp?url=" + szUrl, false); 226 | ohttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 227 | ohttp.send(strData); 228 | strType = validInt(strType); 229 | if (strType) 230 | strText = StrConv(ohttp.responseBody); 231 | else 232 | strText = ohttp.responseText; 233 | if (ohttp.status == 200) 234 | return (strText); 235 | return (parseError2(strText)); 236 | } 237 | function parseError2(strData) { 238 | if (strData.length == 0) 239 | return (strData); 240 | var n, a = strData.split("

"); 241 | n = a[1].length; 242 | s = a[2].substr(0, a[2].length - 2); 243 | if (bDebug == 0) 244 | alert(s); 245 | s = "Err.Number=" + parseInt(a[1].substr(n - 7, 4), 16) + "\nErr.Description=" + s + "\nErr.Source=" + a[1].substr(0, n - 13); 246 | n = a[3].indexOf(", line "); 247 | s += "\nErr.ASPFile=" + a[3].substr(0, n); 248 | s += "\nErr.ASPLine=" + parseInt(a[3].substr(n + 7)); 249 | if (bDebug == 1) 250 | alert(s); 251 | return (s); 252 | } 253 | 254 | function test(pwd){ 255 | var random = '4B93E772AE273FE03784AEFF3339C72CE41A48DE5BD79D8E49D6DABF8401435DA5B59A347EBD2407331D5BED3CD96FE506663766EA96AE822E905423F8B0B4769DE17DC4AC59D0CCDAFB1764CA7C85ABB15FB8C47DD0AF0BBFA901E83CE2FD98A9441A4C812B8E08BC6456134E647D0D15611777CA124EFAC186B787B843A1DF40B0E95FE24CEB1D9E154AF8B2AFAEAA34328BF20EA50CBEADEBF7A0B5F42B3C185E0744A0BEAE3115B405ED0FAE1B136AB21D9D0E485249456D0AB3AE6D4C86BDC0305C88104EFFDD3C41883305DC75B74B92F94702CD9C0AD3180E22D87784B55DA80EE15B2702DD45895DBEC0B701424040C3AD17583FE56634807108D1CF'; 256 | var SharedKey = hex_sha1(pwd); 257 | var password = hex_sha1(SharedKey + random); 258 | return password 259 | } 260 | 261 | console.log(test('88888888')) 262 | 263 | -------------------------------------------------------------------------------- /DES/融金所.js: -------------------------------------------------------------------------------- 1 | // https://weixin.tjinsuo.com/#login/mine 2 | 3 | var des_createKeys = function(e) { 4 | var t = new Array(0,4,536870912,536870916,65536,65540,536936448,536936452,512,516,536871424,536871428,66048,66052,536936960,536936964) 5 | , s = new Array(0,1,1048576,1048577,67108864,67108865,68157440,68157441,256,257,1048832,1048833,67109120,67109121,68157696,68157697) 6 | , a = new Array(0,8,2048,2056,16777216,16777224,16779264,16779272,0,8,2048,2056,16777216,16777224,16779264,16779272) 7 | , i = new Array(0,2097152,134217728,136314880,8192,2105344,134225920,136323072,131072,2228224,134348800,136445952,139264,2236416,134356992,136454144) 8 | , n = new Array(0,262144,16,262160,0,262144,16,262160,4096,266240,4112,266256,4096,266240,4112,266256) 9 | , r = new Array(0,1024,32,1056,0,1024,32,1056,33554432,33555456,33554464,33555488,33554432,33555456,33554464,33555488) 10 | , o = new Array(0,268435456,524288,268959744,2,268435458,524290,268959746,0,268435456,524288,268959744,2,268435458,524290,268959746) 11 | , l = new Array(0,65536,2048,67584,536870912,536936448,536872960,536938496,131072,196608,133120,198656,537001984,537067520,537004032,537069568) 12 | , p = new Array(0,262144,0,262144,2,262146,2,262146,33554432,33816576,33554432,33816576,33554434,33816578,33554434,33816578) 13 | , d = new Array(0,268435456,8,268435464,0,268435456,8,268435464,1024,268436480,1032,268436488,1024,268436480,1032,268436488) 14 | , u = new Array(0,32,0,32,1048576,1048608,1048576,1048608,8192,8224,8192,8224,1056768,1056800,1056768,1056800) 15 | , c = new Array(0,16777216,512,16777728,2097152,18874368,2097664,18874880,67108864,83886080,67109376,83886592,69206016,85983232,69206528,85983744) 16 | , h = new Array(0,4096,134217728,134221824,524288,528384,134742016,134746112,16,4112,134217744,134221840,524304,528400,134742032,134746128) 17 | , f = new Array(0,4,256,260,0,4,256,260,1,5,257,261,1,5,257,261); 18 | var m = e.length > 8 ? 3 : 1; 19 | var v = new Array(32 * m); 20 | var g = new Array(0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0); 21 | var y, b, w = 0, _ = 0, x; 22 | for (var T = 0; T < m; T++) { 23 | var L = e.charCodeAt(w++) << 24 | e.charCodeAt(w++) << 16 | e.charCodeAt(w++) << 8 | e.charCodeAt(w++); 24 | var C = e.charCodeAt(w++) << 24 | e.charCodeAt(w++) << 16 | e.charCodeAt(w++) << 8 | e.charCodeAt(w++); 25 | x = (L >>> 4 ^ C) & 252645135; 26 | C ^= x; 27 | L ^= x << 4; 28 | x = (C >>> -16 ^ L) & 65535; 29 | L ^= x; 30 | C ^= x << -16; 31 | x = (L >>> 2 ^ C) & 858993459; 32 | C ^= x; 33 | L ^= x << 2; 34 | x = (C >>> -16 ^ L) & 65535; 35 | L ^= x; 36 | C ^= x << -16; 37 | x = (L >>> 1 ^ C) & 1431655765; 38 | C ^= x; 39 | L ^= x << 1; 40 | x = (C >>> 8 ^ L) & 16711935; 41 | L ^= x; 42 | C ^= x << 8; 43 | x = (L >>> 1 ^ C) & 1431655765; 44 | C ^= x; 45 | L ^= x << 1; 46 | x = L << 8 | C >>> 20 & 240; 47 | L = C << 24 | C << 8 & 16711680 | C >>> 8 & 65280 | C >>> 24 & 240; 48 | C = x; 49 | for (var S = 0; S < g.length; S++) { 50 | if (g[S]) { 51 | L = L << 2 | L >>> 26; 52 | C = C << 2 | C >>> 26 53 | } else { 54 | L = L << 1 | L >>> 27; 55 | C = C << 1 | C >>> 27 56 | } 57 | L &= -15; 58 | C &= -15; 59 | y = t[L >>> 28] | s[L >>> 24 & 15] | a[L >>> 20 & 15] | i[L >>> 16 & 15] | n[L >>> 12 & 15] | r[L >>> 8 & 15] | o[L >>> 4 & 15]; 60 | b = l[C >>> 28] | p[C >>> 24 & 15] | d[C >>> 20 & 15] | u[C >>> 16 & 15] | c[C >>> 12 & 15] | h[C >>> 8 & 15] | f[C >>> 4 & 15]; 61 | x = (b >>> 16 ^ y) & 65535; 62 | v[_++] = y ^ x; 63 | v[_++] = b ^ x << 16 64 | } 65 | } 66 | return v 67 | }; 68 | 69 | 70 | var des = function(e, s, a, i, n, r) { 71 | var o = new Array(16843776,0,65536,16843780,16842756,66564,4,65536,1024,16843776,16843780,1024,16778244,16842756,16777216,4,1028,16778240,16778240,66560,66560,16842752,16842752,16778244,65540,16777220,16777220,65540,0,1028,66564,16777216,65536,16843780,4,16842752,16843776,16777216,16777216,1024,16842756,65536,66560,16777220,1024,4,16778244,66564,16843780,65540,16842752,16778244,16777220,1028,66564,16843776,1028,16778240,16778240,0,65540,66560,0,16842756); 72 | var l = new Array(-2146402272,-2147450880,32768,1081376,1048576,32,-2146435040,-2147450848,-2147483616,-2146402272,-2146402304,-2147483648,-2147450880,1048576,32,-2146435040,1081344,1048608,-2147450848,0,-2147483648,32768,1081376,-2146435072,1048608,-2147483616,0,1081344,32800,-2146402304,-2146435072,32800,0,1081376,-2146435040,1048576,-2147450848,-2146435072,-2146402304,32768,-2146435072,-2147450880,32,-2146402272,1081376,32,32768,-2147483648,32800,-2146402304,1048576,-2147483616,1048608,-2147450848,-2147483616,1048608,1081344,0,-2147450880,32800,-2147483648,-2146435040,-2146402272,1081344); 73 | var p = new Array(520,134349312,0,134348808,134218240,0,131592,134218240,131080,134217736,134217736,131072,134349320,131080,134348800,520,134217728,8,134349312,512,131584,134348800,134348808,131592,134218248,131584,131072,134218248,8,134349320,512,134217728,134349312,134217728,131080,520,131072,134349312,134218240,0,512,131080,134349320,134218240,134217736,512,0,134348808,134218248,131072,134217728,134349320,8,131592,131584,134217736,134348800,134218248,520,134348800,131592,8,134348808,131584); 74 | var d = new Array(8396801,8321,8321,128,8396928,8388737,8388609,8193,0,8396800,8396800,8396929,129,0,8388736,8388609,1,8192,8388608,8396801,128,8388608,8193,8320,8388737,1,8320,8388736,8192,8396928,8396929,129,8388736,8388609,8396800,8396929,129,0,0,8396800,8320,8388736,8388737,1,8396801,8321,8321,128,8396929,129,1,8192,8388609,8193,8396928,8388737,8193,8320,8388608,8396801,128,8388608,8192,8396928); 75 | var u = new Array(256,34078976,34078720,1107296512,524288,256,1073741824,34078720,1074266368,524288,33554688,1074266368,1107296512,1107820544,524544,1073741824,33554432,1074266112,1074266112,0,1073742080,1107820800,1107820800,33554688,1107820544,1073742080,0,1107296256,34078976,33554432,1107296256,524544,524288,1107296512,256,33554432,1073741824,34078720,1107296512,1074266368,33554688,1073741824,1107820544,34078976,1074266368,256,33554432,1107820544,1107820800,524544,1107296256,1107820800,34078720,0,1074266112,1107296256,524544,33554688,1073742080,524288,0,1074266112,34078976,1073742080); 76 | var c = new Array(536870928,541065216,16384,541081616,541065216,16,541081616,4194304,536887296,4210704,4194304,536870928,4194320,536887296,536870912,16400,0,4194320,536887312,16384,4210688,536887312,16,541065232,541065232,0,4210704,541081600,16400,4210688,541081600,536870912,536887296,16,541065232,4210688,541081616,4194304,16400,536870928,4194304,536887296,536870912,16400,536870928,541081616,4210688,541065216,4210704,541081600,0,541065232,16,16384,541065216,4210704,16384,4194320,536887312,0,541081600,536870912,4194320,536887312); 77 | var h = new Array(2097152,69206018,67110914,0,2048,67110914,2099202,69208064,69208066,2097152,0,67108866,2,67108864,69206018,2050,67110912,2099202,2097154,67110912,67108866,69206016,69208064,2097154,69206016,2048,2050,69208066,2099200,2,67108864,2099200,67108864,2099200,2097152,67110914,67110914,69206018,69206018,2,2097154,67108864,67110912,2097152,69208064,2050,2099202,69208064,2050,67108866,69208066,69206016,2099200,0,2,69208066,0,2099202,69206016,2048,67108866,67110912,2048,2097154); 78 | var f = new Array(268439616,4096,262144,268701760,268435456,268439616,64,268435456,262208,268697600,268701760,266240,268701696,266304,4096,64,268697600,268435520,268439552,4160,266240,262208,268697664,268701696,4160,0,0,268697664,268435520,268439552,266304,262144,266304,262144,268701696,4096,64,268697664,4096,266304,268439552,64,268435520,268697600,268697664,268435456,262144,268439616,0,268701760,262208,268435520,268697600,268439552,268439616,0,268701760,266240,266240,4160,4160,262208,268435456,268701696); 79 | var m = des_createKeys(e); 80 | var v = 0, g, y, b, w, _, x, T, L, C; 81 | var S, I, P, k; 82 | var A, M; 83 | var D = s.length; 84 | var R = 0; 85 | var N = m.length == 32 ? 3 : 9; 86 | if (N == 3) { 87 | C = a ? new Array(0,32,2) : new Array(30,-2,-2) 88 | } else { 89 | C = a ? new Array(0,32,2,62,30,-2,64,96,2) : new Array(94,62,-2,32,64,2,30,-2,-2) 90 | } 91 | if (r == 2) 92 | s += " "; 93 | else if (r == 1) { 94 | b = 8 - D % 8; 95 | s += String.fromCharCode(b, b, b, b, b, b, b, b); 96 | if (b == 8) 97 | D += 8 98 | } else if (!r) 99 | s += "\x00\x00\x00\x00\x00\x00\x00\x00"; 100 | var E = ""; 101 | var z = ""; 102 | if (i == 1) { 103 | S = n.charCodeAt(v++) << 24 | n.charCodeAt(v++) << 16 | n.charCodeAt(v++) << 8 | n.charCodeAt(v++); 104 | P = n.charCodeAt(v++) << 24 | n.charCodeAt(v++) << 16 | n.charCodeAt(v++) << 8 | n.charCodeAt(v++); 105 | v = 0 106 | } 107 | while (v < D) { 108 | T = s.charCodeAt(v++) << 24 | s.charCodeAt(v++) << 16 | s.charCodeAt(v++) << 8 | s.charCodeAt(v++); 109 | L = s.charCodeAt(v++) << 24 | s.charCodeAt(v++) << 16 | s.charCodeAt(v++) << 8 | s.charCodeAt(v++); 110 | if (i == 1) { 111 | if (a) { 112 | T ^= S; 113 | L ^= P 114 | } else { 115 | I = S; 116 | k = P; 117 | S = T; 118 | P = L 119 | } 120 | } 121 | b = (T >>> 4 ^ L) & 252645135; 122 | L ^= b; 123 | T ^= b << 4; 124 | b = (T >>> 16 ^ L) & 65535; 125 | L ^= b; 126 | T ^= b << 16; 127 | b = (L >>> 2 ^ T) & 858993459; 128 | T ^= b; 129 | L ^= b << 2; 130 | b = (L >>> 8 ^ T) & 16711935; 131 | T ^= b; 132 | L ^= b << 8; 133 | b = (T >>> 1 ^ L) & 1431655765; 134 | L ^= b; 135 | T ^= b << 1; 136 | T = T << 1 | T >>> 31; 137 | L = L << 1 | L >>> 31; 138 | for (y = 0; y < N; y += 3) { 139 | A = C[y + 1]; 140 | M = C[y + 2]; 141 | for (g = C[y]; g != A; g += M) { 142 | _ = L ^ m[g]; 143 | x = (L >>> 4 | L << 28) ^ m[g + 1]; 144 | b = T; 145 | T = L; 146 | L = b ^ (l[_ >>> 24 & 63] | d[_ >>> 16 & 63] | c[_ >>> 8 & 63] | f[_ & 63] | o[x >>> 24 & 63] | p[x >>> 16 & 63] | u[x >>> 8 & 63] | h[x & 63]) 147 | } 148 | b = T; 149 | T = L; 150 | L = b 151 | } 152 | T = T >>> 1 | T << 31; 153 | L = L >>> 1 | L << 31; 154 | b = (T >>> 1 ^ L) & 1431655765; 155 | L ^= b; 156 | T ^= b << 1; 157 | b = (L >>> 8 ^ T) & 16711935; 158 | T ^= b; 159 | L ^= b << 8; 160 | b = (L >>> 2 ^ T) & 858993459; 161 | 162 | T ^= b; 163 | L ^= b << 2; 164 | b = (T >>> 16 ^ L) & 65535; 165 | L ^= b; 166 | T ^= b << 16; 167 | b = (T >>> 4 ^ L) & 252645135; 168 | L ^= b; 169 | T ^= b << 4; 170 | if (i == 1) { 171 | if (a) { 172 | S = T; 173 | P = L 174 | } else { 175 | T ^= I; 176 | L ^= k 177 | } 178 | } 179 | z += String.fromCharCode(T >>> 24, T >>> 16 & 255, T >>> 8 & 255, T & 255, L >>> 24, L >>> 16 & 255, L >>> 8 & 255, L & 255); 180 | R += 8; 181 | if (R == 512) { 182 | E += z; 183 | z = ""; 184 | R = 0 185 | } 186 | } 187 | return E + z 188 | } 189 | 190 | var stringToHexForDES = function(e) { 191 | var t = "0x"; 192 | var s = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"); 193 | for (var a = 0; a < e.length; a++) { 194 | t += s[e.charCodeAt(a) >> 4] + s[e.charCodeAt(a) & 15] 195 | } 196 | return t 197 | } 198 | 199 | var getRandomString = function(e) { 200 | var t = ""; 201 | var s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/-_="; 202 | for (var a = 0; a < e; a++) { 203 | t += s.charAt(Math.floor(Math.random() * s.length)) 204 | } 205 | return t 206 | } 207 | 208 | var do_generate = function() { 209 | var e = getRandomString(24); 210 | var generateKey = encodeURI(encodeURI(e)); 211 | return generateKey 212 | } 213 | // console.log(do_generate()) 214 | 215 | // 加 8 个空格; suffix:后缀 216 | var suffix_8Blank = function(e) { 217 | for (var t = 0; t < 8; t++) { 218 | e += " " 219 | } 220 | return e 221 | } 222 | 223 | var do_encrypt = function(generateKey, pw) { 224 | return stringToHexForDES(des(generateKey, suffix_8Blank(pw), 1, 0)) 225 | } 226 | 227 | var generateKey = do_generate(); 228 | // generateKey = "2ODksGTW=h+/n17IGQ6G72b9"; 229 | var pw = 'a12345678'; 230 | console.log(do_encrypt(generateKey, pw)); 231 | 232 | 233 | 234 | -------------------------------------------------------------------------------- /网易易盾JS分析/my_cb.js: -------------------------------------------------------------------------------- 1 | // cb 2 | wy_encode = {} 3 | 4 | function test(e, t) { 5 | function n(e, t) { 6 | function n(e, t) { 7 | return e.charCodeAt(Math.floor(t % e.length)) 8 | } 9 | function i(e, t) { 10 | return t.split("").map(function(t, i) { 11 | return t.charCodeAt(0) ^ n(e, i) 12 | }) 13 | } 14 | return t = i(e, t), 15 | _(t) 16 | } 17 | wy_encode.trace = n; 18 | __toByte = function(e) { 19 | function t(t) { 20 | return e.apply(this, arguments) 21 | } 22 | return t.toString = function() { 23 | return e.toString() 24 | } 25 | , 26 | t 27 | }(function(e) { 28 | if (e < -128) 29 | return __toByte(128 - (-128 - e)); 30 | if (e >= -128 && e <= 127) 31 | return e; 32 | if (e > 127) 33 | return __toByte(-129 + e - 127); 34 | throw new Error("1001") 35 | }); 36 | var i = function(e, t) { 37 | return __toByte(e + t) 38 | } 39 | , r = function(e, t) { 40 | if (null == e) 41 | return null; 42 | if (null == t) 43 | return e; 44 | for (var n = [], r = t.length, o = 0, a = e.length; o < a; o++) 45 | n[o] = i(e[o], t[o % r]); 46 | return n 47 | } 48 | , o = function(e, t) { 49 | return e = __toByte(e), 50 | t = __toByte(t), 51 | __toByte(e ^ t) 52 | } 53 | , a = function(e, t) { 54 | if (null == e || null == t || e.length != t.length) 55 | return e; 56 | for (var n = [], i = e.length, r = 0, a = i; r < a; r++) 57 | n[r] = o(e[r], t[r]); 58 | return n 59 | } 60 | , l = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"] 61 | , u = function(e) { 62 | var t = []; 63 | return t.push(l[e >>> 4 & 15]), 64 | t.push(l[15 & e]), 65 | t.join("") 66 | } 67 | , s = function(e) { 68 | var t = e.length; 69 | if (null == e || t < 0) 70 | return new String(""); 71 | for (var n = [], i = 0; i < t; i++) 72 | n.push(u(e[i])); 73 | return n.join("") 74 | } 75 | , f = function(e) { 76 | if (null == e || 0 == e.length) 77 | return []; 78 | for (var t = new String(e), n = [], i = t.length / 2, r = 0, o = 0; o < i; o++) { 79 | var a = parseInt(t.charAt(r++), 16) << 4 80 | , l = parseInt(t.charAt(r++), 16); 81 | n[o] = __toByte(a + l) 82 | } 83 | return n 84 | } 85 | , j = function(e) { 86 | if (null == e || void 0 == e) 87 | return e; 88 | for (var t = encodeURIComponent(e), n = [], i = t.length, r = 0; r < i; r++) 89 | if ("%" == t.charAt(r)) { 90 | if (!(r + 2 < i)) 91 | throw new Error("1009"); 92 | n.push(f(t.charAt(++r) + "" + t.charAt(++r))[0]) 93 | } else 94 | n.push(t.charCodeAt(r)); 95 | return n 96 | } 97 | , c = function(e) { 98 | var t = []; 99 | return t[0] = e >>> 24 & 255, 100 | t[1] = e >>> 16 & 255, 101 | t[2] = e >>> 8 & 255, 102 | t[3] = 255 & e, 103 | t 104 | } 105 | , d = function(e) { 106 | var t = c(e); 107 | return s(t) 108 | } 109 | , p = function(e, t, n) { 110 | var i = []; 111 | if (null == e || 0 == e.length) 112 | return i; 113 | if (e.length < n) 114 | throw new Error("1003"); 115 | for (var r = 0; r < n; r++) 116 | i[r] = e[t + r]; 117 | return i 118 | } 119 | , h = function(e, t, n, i, r) { 120 | if (null == e || 0 == e.length) 121 | return n; 122 | if (null == n) 123 | throw new Error("1004"); 124 | if (e.length < r) 125 | throw new Error("1003"); 126 | for (var o = 0; o < r; o++) 127 | n[i + o] = e[t + o]; 128 | return n 129 | } 130 | , y = function(e) { 131 | for (var t = [], n = 0; n < e; n++) 132 | t[n] = 0; 133 | return t 134 | } 135 | , v = function(e) { 136 | return null == e || void 0 == e || "" == e 137 | } 138 | , b = function() { 139 | return ["i", "/", "x", "1", "X", "g", "U", "0", "z", "7", "k", "8", "N", "+", "l", "C", "p", "O", "n", "P", "r", "v", "6", "\\", "q", "u", "2", "G", "j", "9", "H", "R", "c", "w", "T", "Y", "Z", "4", "b", "f", "S", "J", "B", "h", "a", "W", "s", "t", "A", "e", "o", "M", "I", "E", "Q", "5", "m", "D", "d", "V", "F", "L", "K", "y"] 140 | } 141 | , g = function() { 142 | return "3" 143 | } 144 | , m = function(e, t, n) { 145 | var i, r, o, a = b(), l = g(), u = []; 146 | if (1 == n) 147 | i = e[t], 148 | r = 0, 149 | o = 0, 150 | u.push(a[i >>> 2 & 63]), 151 | u.push(a[(i << 4 & 48) + (r >>> 4 & 15)]), 152 | u.push(l), 153 | u.push(l); 154 | else if (2 == n) 155 | i = e[t], 156 | r = e[t + 1], 157 | o = 0, 158 | u.push(a[i >>> 2 & 63]), 159 | u.push(a[(i << 4 & 48) + (r >>> 4 & 15)]), 160 | u.push(a[(r << 2 & 60) + (o >>> 6 & 3)]), 161 | u.push(l); 162 | else { 163 | if (3 != n) 164 | throw new Error("1010"); 165 | i = e[t], 166 | r = e[t + 1], 167 | o = e[t + 2], 168 | u.push(a[i >>> 2 & 63]), 169 | u.push(a[(i << 4 & 48) + (r >>> 4 & 15)]), 170 | u.push(a[(r << 2 & 60) + (o >>> 6 & 3)]), 171 | u.push(a[63 & o]) 172 | } 173 | return u.join("") 174 | } 175 | , _ = function(e) { 176 | if (null == e || void 0 == e) 177 | return null; 178 | if (0 == e.length) 179 | return ""; 180 | var t = 3; 181 | try { 182 | for (var n = [], i = 0; i < e.length; ) { 183 | if (!(i + t <= e.length)) { 184 | n.push(m(e, i, e.length - i)); 185 | break 186 | } 187 | n.push(m(e, i, t)), 188 | i += t 189 | } 190 | return n.join("") 191 | } catch (r) { 192 | throw new Error("1010") 193 | } 194 | } 195 | , S = function(e) { 196 | return _(j(e)) 197 | } 198 | , T = [0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918e3, 2847714899, 3736837829, 1202900863, 817233897, 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117] 199 | , w = function(e) { 200 | var t = 4294967295; 201 | if (null != e) 202 | for (var n = 0; n < e.length; n++) { 203 | var i = e[n]; 204 | t = t >>> 8 ^ T[255 & (t ^ i)] 205 | } 206 | return d(4294967295 ^ t, 8) 207 | } 208 | , E = function(e) { 209 | return w(null == e ? [] : j(e)) 210 | } 211 | , R = [120, 85, -95, -84, 122, 38, -16, -53, -11, 16, 55, 3, 125, -29, 32, -128, -94, 77, 15, 106, -88, -100, -34, 88, 78, 105, -104, -90, -70, 90, -119, -28, -19, -47, -111, 117, -105, -62, -35, 2, -14, -32, 114, 23, -21, 25, -7, -92, 96, -103, 126, 112, -113, -65, -109, -44, 47, 48, 86, 75, 62, -26, 72, -56, -27, 66, -42, 63, 14, 92, 59, -101, 19, -33, 12, -18, -126, -50, -67, 42, 7, -60, -81, -93, -86, 40, -69, -37, 98, -63, -59, 108, 46, -45, 93, 102, 65, -79, 73, -23, -46, 37, -114, -15, 44, -54, 99, -10, 60, -96, 76, 26, 61, -107, 18, -116, -55, -40, 57, -76, -82, 45, 0, -112, -77, 29, 43, -30, 109, -91, -83, 107, 101, 81, -52, -71, 84, 36, -41, 68, 39, -75, -122, -6, 11, -80, -17, -74, -73, 35, 49, -49, -127, 80, 103, 79, -25, 52, -43, 56, 41, -61, -24, 17, -118, 115, -38, 8, -78, 33, -85, -106, 58, -98, -108, 94, 116, -125, -51, -9, 71, 82, 87, -115, 9, 69, -123, 123, -117, 113, -22, -124, -87, 64, 13, 21, -89, -2, -99, -97, 1, -4, 34, 20, 83, 119, 30, -12, -110, -66, 118, -48, 6, -36, 104, -58, -102, 97, 5, -20, 31, -72, 70, -39, 67, -68, -57, 110, 89, 51, 10, -120, 28, 111, 127, 22, -3, 54, 53, -1, 100, 74, 50, 91, 27, -31, -5, -64, 124, -121, 24, -13, 95, 121, -8, 4] 212 | , k = 4 213 | , C = 4 214 | , X = 4 215 | , O = 4 216 | , $ = function(e) { 217 | var t = []; 218 | if (null == e || void 0 == e || 0 == e.length) 219 | return y(C); 220 | if (e.length >= C) 221 | return p(e, 0, C); 222 | for (var n = 0; n < C; n++) 223 | t[n] = e[n % e.length]; 224 | return t 225 | } 226 | , I = function(e) { 227 | if (null == e || void 0 == e || 0 == e.length) 228 | return y(k); 229 | var t = e.length 230 | , n = 0; 231 | n = t % k <= k - X ? k - t % k - X : 2 * k - t % k - X; 232 | var i = []; 233 | h(e, 0, i, 0, t); 234 | for (var r = 0; r < n; r++) 235 | i[t + r] = 0; 236 | var o = c(t); 237 | return h(o, 0, i, t + n, X), 238 | i 239 | } 240 | , x = function(e) { 241 | if (null == e || e.length % k != 0) 242 | throw new Error("1005"); 243 | for (var t = [], n = 0, i = e.length / k, r = 0; r < i; r++) { 244 | t[r] = []; 245 | for (var o = 0; o < k; o++) 246 | t[r][o] = e[n++] 247 | } 248 | return t 249 | } 250 | , A = function(e) { 251 | var t = e >>> 4 & 15 252 | , n = 15 & e 253 | , i = 16 * t + n; 254 | return R[i] 255 | } 256 | , N = function(e) { 257 | if (null == e) 258 | return null; 259 | for (var t = [], n = 0, i = e.length; n < i; n++) 260 | t[n] = A(e[n]); 261 | return t 262 | } 263 | , P = function() { 264 | for (var e = [], t = 0; t < O; t++) { 265 | var n = 256 * Math.random(); 266 | n = Math.floor(n), 267 | e[t] = __toByte(n) 268 | } 269 | return e 270 | } 271 | , M = function(e, t) { 272 | if (null == e) 273 | return null; 274 | for (var n = __toByte(t), i = [], r = e.length, a = 0; a < r; a++) 275 | i.push(o(e[a], n)); 276 | return i 277 | } 278 | , L = function(e, t) { 279 | if (null == e) 280 | return null; 281 | for (var n = __toByte(t), r = [], o = e.length, a = 0; a < o; a++) 282 | r.push(i(e[a], n)); 283 | return r 284 | } 285 | , M = function(e, t) { 286 | if (null == e) 287 | return null; 288 | for (var n = __toByte(t), i = [], r = e.length, a = 0; a < r; a++) 289 | i.push(o(e[a], n)); 290 | return i 291 | } 292 | , D = function(e) { 293 | var t = M(e, 56) 294 | , n = L(t, -40) 295 | , i = M(n, 103); 296 | return i 297 | } 298 | , Y = function(e, t) { 299 | null == e && (e = []); 300 | var n = P(); 301 | t = $(t), 302 | t = a(t, $(n)), 303 | t = $(t); 304 | var i = t 305 | , o = I(e) 306 | , l = x(o) 307 | , u = []; 308 | h(n, 0, u, 0, O); 309 | for (var s = l.length, f = 0; f < s; f++) { 310 | var j = D(l[f]) 311 | , c = a(j, t) 312 | , d = r(c, i); 313 | c = a(d, i); 314 | var p = N(c); 315 | p = N(p), 316 | h(p, 0, u, f * k + O, k), 317 | i = p 318 | } 319 | return u 320 | } 321 | , B = function(e) { 322 | var t = "14731382d816714fC59E47De5dA0C871D3F"; 323 | if (null == t || void 0 == t) 324 | throw new Error("1008"); 325 | null != e && void 0 != e || (e = ""); 326 | var n = e + E(e) 327 | , i = j(n) 328 | , r = j(t) 329 | , o = Y(i, r); 330 | return _(o) 331 | }; 332 | wy_encode.cp = B, 333 | t.eypt = B, 334 | t.xor_encode = n, 335 | t.toByte = __toByte, 336 | t.str2Bytes = j, 337 | t.arrayCopy = p, 338 | t.arrayCopy2 = h, 339 | t.createEmptyArray = y, 340 | t.isEmptyString = v, 341 | t.base64Encode = S, 342 | t.getStringCRC32 = E, 343 | t.toByte = __toByte 344 | } 345 | 346 | 347 | function uuid(e, t) { 348 | var n = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("") 349 | , a = [] 350 | , i = void 0; 351 | if (t = t || n.length, 352 | e) 353 | for (i = 0; i < e; i++) 354 | a[i] = n[0 | Math.random() * t]; 355 | else { 356 | var r = void 0; 357 | for (a[8] = a[13] = a[18] = a[23] = "-", 358 | a[14] = "4", 359 | i = 0; i < 36; i++) 360 | a[i] || (r = 0 | 16 * Math.random(), 361 | a[i] = n[19 === i ? 3 & r | 8 : r]) 362 | } 363 | return a.join("") 364 | } 365 | 366 | 367 | function my_cb(){ 368 | test('', {}) 369 | return wy_encode.cp(uuid(32)) 370 | } 371 | 372 | console.log(my_cb()) 373 | -------------------------------------------------------------------------------- /RSA/手机京东登录.js: -------------------------------------------------------------------------------- 1 | var CryptoJS = require('crypto-js'); 2 | 3 | function CtoH(obj) { 4 | var pos = obj.selectionEnd; 5 | var str = obj.value; 6 | var result = ""; 7 | for (var i = 0; i < str.length; i++) { 8 | if (str.charCodeAt(i) == 12288) { 9 | result += String.fromCharCode(str.charCodeAt(i) - 12256); 10 | continue 11 | } 12 | if (str.charCodeAt(i) > 65280 && str.charCodeAt(i) < 65375) { 13 | result += String.fromCharCode(str.charCodeAt(i) - 65248) 14 | } else { 15 | result += String.fromCharCode(str.charCodeAt(i)) 16 | } 17 | } 18 | obj.value = result; 19 | obj.setSelectionRange(pos, pos); 20 | return result 21 | } 22 | function BarrettMu(i) { 23 | this.modulus = biCopy(i), 24 | this.k = biHighIndex(this.modulus) + 1; 25 | var t = new BigInt; 26 | t.digits[2 * this.k] = 1, 27 | this.mu = biDivide(t, this.modulus), 28 | this.bkplus1 = new BigInt, 29 | this.bkplus1.digits[this.k + 1] = 1, 30 | this.modulo = BarrettMu_modulo, 31 | this.multiplyMod = BarrettMu_multiplyMod, 32 | this.powMod = BarrettMu_powMod 33 | } 34 | function BarrettMu_modulo(i) { 35 | var t = biDivideByRadixPower(i, this.k - 1) 36 | , r = biMultiply(t, this.mu) 37 | , e = biDivideByRadixPower(r, this.k + 1) 38 | , n = biModuloByRadixPower(i, this.k + 1) 39 | , g = biMultiply(e, this.modulus) 40 | , s = biModuloByRadixPower(g, this.k + 1) 41 | , d = biSubtract(n, s); 42 | d.isNeg && (d = biAdd(d, this.bkplus1)); 43 | for (var o = biCompare(d, this.modulus) >= 0; o; ) 44 | d = biSubtract(d, this.modulus), 45 | o = biCompare(d, this.modulus) >= 0; 46 | return d 47 | } 48 | function BarrettMu_multiplyMod(i, t) { 49 | var r = biMultiply(i, t); 50 | return this.modulo(r) 51 | } 52 | function BarrettMu_powMod(i, t) { 53 | var r = new BigInt; 54 | r.digits[0] = 1; 55 | for (var e = i, n = t; ; ) { 56 | if (0 != (1 & n.digits[0]) && (r = this.multiplyMod(r, e)), 57 | n = biShiftRight(n, 1), 58 | 0 == n.digits[0] && 0 == biHighIndex(n)) 59 | break; 60 | e = this.multiplyMod(e, e) 61 | } 62 | return r 63 | } 64 | function setMaxDigits(i) { 65 | maxDigits = i, 66 | ZERO_ARRAY = new Array(maxDigits); 67 | for (var t = 0; t < ZERO_ARRAY.length; t++) 68 | ZERO_ARRAY[t] = 0; 69 | bigZero = new BigInt, 70 | bigOne = new BigInt, 71 | bigOne.digits[0] = 1 72 | } 73 | function BigInt(i) { 74 | "boolean" == typeof i && 1 == i ? this.digits = null : this.digits = ZERO_ARRAY.slice(0), 75 | this.isNeg = !1 76 | } 77 | function biFromDecimal(i) { 78 | for (var t, r = "-" == i.charAt(0), e = r ? 1 : 0; e < i.length && "0" == i.charAt(e); ) 79 | ++e; 80 | if (e == i.length) 81 | t = new BigInt; 82 | else { 83 | var n = i.length - e 84 | , g = n % dpl10; 85 | for (0 == g && (g = dpl10), 86 | t = biFromNumber(Number(i.substr(e, g))), 87 | e += g; e < i.length; ) 88 | t = biAdd(biMultiply(t, lr10), biFromNumber(Number(i.substr(e, dpl10)))), 89 | e += dpl10; 90 | t.isNeg = r 91 | } 92 | return t 93 | } 94 | function biCopy(i) { 95 | var t = new BigInt((!0)); 96 | return t.digits = i.digits.slice(0), 97 | t.isNeg = i.isNeg, 98 | t 99 | } 100 | function biFromNumber(i) { 101 | var t = new BigInt; 102 | t.isNeg = i < 0, 103 | i = Math.abs(i); 104 | for (var r = 0; i > 0; ) 105 | t.digits[r++] = i & maxDigitVal, 106 | i >>= biRadixBits; 107 | return t 108 | } 109 | function reverseStr(i) { 110 | for (var t = "", r = i.length - 1; r > -1; --r) 111 | t += i.charAt(r); 112 | return t 113 | } 114 | function biToString(i, t) { 115 | var r = new BigInt; 116 | r.digits[0] = t; 117 | for (var e = biDivideModulo(i, r), n = hexatrigesimalToChar[e[1].digits[0]]; 1 == biCompare(e[0], bigZero); ) 118 | e = biDivideModulo(e[0], r), 119 | digit = e[1].digits[0], 120 | n += hexatrigesimalToChar[e[1].digits[0]]; 121 | return (i.isNeg ? "-" : "") + reverseStr(n) 122 | } 123 | function biToDecimal(i) { 124 | var t = new BigInt; 125 | t.digits[0] = 10; 126 | for (var r = biDivideModulo(i, t), e = String(r[1].digits[0]); 1 == biCompare(r[0], bigZero); ) 127 | r = biDivideModulo(r[0], t), 128 | e += String(r[1].digits[0]); 129 | return (i.isNeg ? "-" : "") + reverseStr(e) 130 | } 131 | function digitToHex(t) { 132 | var r = 15 133 | , e = ""; 134 | for (i = 0; i < 4; ++i) 135 | e += hexToChar[t & r], 136 | t >>>= 4; 137 | return reverseStr(e) 138 | } 139 | function biToHex(i) { 140 | for (var t = "", r = (biHighIndex(i), 141 | biHighIndex(i)); r > -1; --r) 142 | t += digitToHex(i.digits[r]); 143 | return t 144 | } 145 | function charToHex(i) { 146 | var t, r = 48, e = r + 9, n = 97, g = n + 25, s = 65, d = 90; 147 | return t = i >= r && i <= e ? i - r : i >= s && i <= d ? 10 + i - s : i >= n && i <= g ? 10 + i - n : 0 148 | } 149 | function hexToDigit(i) { 150 | for (var t = 0, r = Math.min(i.length, 4), e = 0; e < r; ++e) 151 | t <<= 4, 152 | t |= charToHex(i.charCodeAt(e)); 153 | return t 154 | } 155 | function biFromHex(i) { 156 | for (var t = new BigInt, r = i.length, e = r, n = 0; e > 0; e -= 4, 157 | ++n) 158 | t.digits[n] = hexToDigit(i.substr(Math.max(e - 4, 0), Math.min(e, 4))); 159 | return t 160 | } 161 | function biFromString(i, t) { 162 | var r = "-" == i.charAt(0) 163 | , e = r ? 1 : 0 164 | , n = new BigInt 165 | , g = new BigInt; 166 | g.digits[0] = 1; 167 | for (var s = i.length - 1; s >= e; s--) { 168 | var d = i.charCodeAt(s) 169 | , o = charToHex(d) 170 | , a = biMultiplyDigit(g, o); 171 | n = biAdd(n, a), 172 | g = biMultiplyDigit(g, t) 173 | } 174 | return n.isNeg = r, 175 | n 176 | } 177 | function biToBytes(i) { 178 | for (var t = "", r = biHighIndex(i); r > -1; --r) 179 | t += digitToBytes(i.digits[r]); 180 | return t 181 | } 182 | function digitToBytes(i) { 183 | var t = String.fromCharCode(255 & i); 184 | i >>>= 8; 185 | var r = String.fromCharCode(255 & i); 186 | return r + t 187 | } 188 | function biDump(i) { 189 | return (i.isNeg ? "-" : "") + i.digits.join(" ") 190 | } 191 | function biAdd(i, t) { 192 | var r; 193 | if (i.isNeg != t.isNeg) 194 | t.isNeg = !t.isNeg, 195 | r = biSubtract(i, t), 196 | t.isNeg = !t.isNeg; 197 | else { 198 | r = new BigInt; 199 | for (var e, n = 0, g = 0; g < i.digits.length; ++g) 200 | e = i.digits[g] + t.digits[g] + n, 201 | r.digits[g] = 65535 & e, 202 | n = Number(e >= biRadix); 203 | r.isNeg = i.isNeg 204 | } 205 | return r 206 | } 207 | function biSubtract(i, t) { 208 | var r; 209 | if (i.isNeg != t.isNeg) 210 | t.isNeg = !t.isNeg, 211 | r = biAdd(i, t), 212 | t.isNeg = !t.isNeg; 213 | else { 214 | r = new BigInt; 215 | var e, n; 216 | n = 0; 217 | for (var g = 0; g < i.digits.length; ++g) 218 | e = i.digits[g] - t.digits[g] + n, 219 | r.digits[g] = 65535 & e, 220 | r.digits[g] < 0 && (r.digits[g] += biRadix), 221 | n = 0 - Number(e < 0); 222 | if (n == -1) { 223 | n = 0; 224 | for (var g = 0; g < i.digits.length; ++g) 225 | e = 0 - r.digits[g] + n, 226 | r.digits[g] = 65535 & e, 227 | r.digits[g] < 0 && (r.digits[g] += biRadix), 228 | n = 0 - Number(e < 0); 229 | r.isNeg = !i.isNeg 230 | } else 231 | r.isNeg = i.isNeg 232 | } 233 | return r 234 | } 235 | function biHighIndex(i) { 236 | for (var t = i.digits.length - 1; t > 0 && 0 == i.digits[t]; ) 237 | --t; 238 | return t 239 | } 240 | function biNumBits(i) { 241 | var t, r = biHighIndex(i), e = i.digits[r], n = (r + 1) * bitsPerDigit; 242 | for (t = n; t > n - bitsPerDigit && 0 == (32768 & e); --t) 243 | e <<= 1; 244 | return t 245 | } 246 | function biMultiply(i, t) { 247 | for (var r, e, n, g = new BigInt, s = biHighIndex(i), d = biHighIndex(t), o = 0; o <= d; ++o) { 248 | for (r = 0, 249 | n = o, 250 | j = 0; j <= s; ++j, 251 | ++n) 252 | e = g.digits[n] + i.digits[j] * t.digits[o] + r, 253 | g.digits[n] = e & maxDigitVal, 254 | r = e >>> biRadixBits; 255 | g.digits[o + s + 1] = r 256 | } 257 | return g.isNeg = i.isNeg != t.isNeg, 258 | g 259 | } 260 | function biMultiplyDigit(i, t) { 261 | var r, e, n; 262 | result = new BigInt, 263 | r = biHighIndex(i), 264 | e = 0; 265 | for (var g = 0; g <= r; ++g) 266 | n = result.digits[g] + i.digits[g] * t + e, 267 | result.digits[g] = n & maxDigitVal, 268 | e = n >>> biRadixBits; 269 | return result.digits[1 + r] = e, 270 | result 271 | } 272 | function arrayCopy(i, t, r, e, n) { 273 | for (var g = Math.min(t + n, i.length), s = t, d = e; s < g; ++s, 274 | ++d) 275 | r[d] = i[s] 276 | } 277 | function biShiftLeft(i, t) { 278 | var r = Math.floor(t / bitsPerDigit) 279 | , e = new BigInt; 280 | arrayCopy(i.digits, 0, e.digits, r, e.digits.length - r); 281 | for (var n = t % bitsPerDigit, g = bitsPerDigit - n, s = e.digits.length - 1, d = s - 1; s > 0; --s, 282 | --d) 283 | e.digits[s] = e.digits[s] << n & maxDigitVal | (e.digits[d] & highBitMasks[n]) >>> g; 284 | return e.digits[0] = e.digits[s] << n & maxDigitVal, 285 | e.isNeg = i.isNeg, 286 | e 287 | } 288 | function biShiftRight(i, t) { 289 | var r = Math.floor(t / bitsPerDigit) 290 | , e = new BigInt; 291 | arrayCopy(i.digits, r, e.digits, 0, i.digits.length - r); 292 | for (var n = t % bitsPerDigit, g = bitsPerDigit - n, s = 0, d = s + 1; s < e.digits.length - 1; ++s, 293 | ++d) 294 | e.digits[s] = e.digits[s] >>> n | (e.digits[d] & lowBitMasks[n]) << g; 295 | return e.digits[e.digits.length - 1] >>>= n, 296 | e.isNeg = i.isNeg, 297 | e 298 | } 299 | function biMultiplyByRadixPower(i, t) { 300 | var r = new BigInt; 301 | return arrayCopy(i.digits, 0, r.digits, t, r.digits.length - t), 302 | r 303 | } 304 | function biDivideByRadixPower(i, t) { 305 | var r = new BigInt; 306 | return arrayCopy(i.digits, t, r.digits, 0, r.digits.length - t), 307 | r 308 | } 309 | function biModuloByRadixPower(i, t) { 310 | var r = new BigInt; 311 | return arrayCopy(i.digits, 0, r.digits, 0, t), 312 | r 313 | } 314 | function biCompare(i, t) { 315 | if (i.isNeg != t.isNeg) 316 | return 1 - 2 * Number(i.isNeg); 317 | for (var r = i.digits.length - 1; r >= 0; --r) 318 | if (i.digits[r] != t.digits[r]) 319 | return i.isNeg ? 1 - 2 * Number(i.digits[r] > t.digits[r]) : 1 - 2 * Number(i.digits[r] < t.digits[r]); 320 | return 0 321 | } 322 | function biDivideModulo(i, t) { 323 | var r, e, n = biNumBits(i), g = biNumBits(t), s = t.isNeg; 324 | if (n < g) 325 | return i.isNeg ? (r = biCopy(bigOne), 326 | r.isNeg = !t.isNeg, 327 | i.isNeg = !1, 328 | t.isNeg = !1, 329 | e = biSubtract(t, i), 330 | i.isNeg = !0, 331 | t.isNeg = s) : (r = new BigInt, 332 | e = biCopy(i)), 333 | new Array(r,e); 334 | r = new BigInt, 335 | e = i; 336 | for (var d = Math.ceil(g / bitsPerDigit) - 1, o = 0; t.digits[d] < biHalfRadix; ) 337 | t = biShiftLeft(t, 1), 338 | ++o, 339 | ++g, 340 | d = Math.ceil(g / bitsPerDigit) - 1; 341 | e = biShiftLeft(e, o), 342 | n += o; 343 | for (var a = Math.ceil(n / bitsPerDigit) - 1, u = biMultiplyByRadixPower(t, a - d); biCompare(e, u) != -1; ) 344 | ++r.digits[a - d], 345 | e = biSubtract(e, u); 346 | for (var b = a; b > d; --b) { 347 | var l = b >= e.digits.length ? 0 : e.digits[b] 348 | , h = b - 1 >= e.digits.length ? 0 : e.digits[b - 1] 349 | , f = b - 2 >= e.digits.length ? 0 : e.digits[b - 2] 350 | , c = d >= t.digits.length ? 0 : t.digits[d] 351 | , m = d - 1 >= t.digits.length ? 0 : t.digits[d - 1]; 352 | l == c ? r.digits[b - d - 1] = maxDigitVal : r.digits[b - d - 1] = Math.floor((l * biRadix + h) / c); 353 | for (var x = r.digits[b - d - 1] * (c * biRadix + m), v = l * biRadixSquared + (h * biRadix + f); x > v; ) 354 | --r.digits[b - d - 1], 355 | x = r.digits[b - d - 1] * (c * biRadix | m), 356 | v = l * biRadix * biRadix + (h * biRadix + f); 357 | u = biMultiplyByRadixPower(t, b - d - 1), 358 | e = biSubtract(e, biMultiplyDigit(u, r.digits[b - d - 1])), 359 | e.isNeg && (e = biAdd(e, u), 360 | --r.digits[b - d - 1]) 361 | } 362 | return e = biShiftRight(e, o), 363 | r.isNeg = i.isNeg != s, 364 | i.isNeg && (r = s ? biAdd(r, bigOne) : biSubtract(r, bigOne), 365 | t = biShiftRight(t, o), 366 | e = biSubtract(t, e)), 367 | 0 == e.digits[0] && 0 == biHighIndex(e) && (e.isNeg = !1), 368 | new Array(r,e) 369 | } 370 | function biDivide(i, t) { 371 | return biDivideModulo(i, t)[0] 372 | } 373 | function biModulo(i, t) { 374 | return biDivideModulo(i, t)[1] 375 | } 376 | function biMultiplyMod(i, t, r) { 377 | return biModulo(biMultiply(i, t), r) 378 | } 379 | function biPow(i, t) { 380 | for (var r = bigOne, e = i; ; ) { 381 | if (0 != (1 & t) && (r = biMultiply(r, e)), 382 | t >>= 1, 383 | 0 == t) 384 | break; 385 | e = biMultiply(e, e) 386 | } 387 | return r 388 | } 389 | function biPowMod(i, t, r) { 390 | for (var e = bigOne, n = i, g = t; ; ) { 391 | if (0 != (1 & g.digits[0]) && (e = biMultiplyMod(e, n, r)), 392 | g = biShiftRight(g, 1), 393 | 0 == g.digits[0] && 0 == biHighIndex(g)) 394 | break; 395 | n = biMultiplyMod(n, n, r) 396 | } 397 | return e 398 | } 399 | function RSAKeyPair(i, t, r, e) { 400 | this.e = biFromHex(i), 401 | this.d = biFromHex(t), 402 | this.m = biFromHex(r), 403 | "number" != typeof e ? this.chunkSize = 2 * biHighIndex(this.m) : this.chunkSize = e / 8, 404 | this.radix = 16, 405 | this.barrett = new BarrettMu(this.m) 406 | } 407 | function encryptedString(i, t, r, e) { 408 | var n, g, s, d, o, a, u, b, l, h, f = new Array, c = t.length, m = ""; 409 | for (d = "string" == typeof r ? r == RSAAPP.NoPadding ? 1 : r == RSAAPP.PKCS1Padding ? 2 : 0 : 0, 410 | o = "string" == typeof e && e == RSAAPP.RawEncoding ? 1 : 0, 411 | 1 == d ? c > i.chunkSize && (c = i.chunkSize) : 2 == d && c > i.chunkSize - 11 && (c = i.chunkSize - 11), 412 | n = 0, 413 | g = 2 == d ? c - 1 : i.chunkSize - 1; n < c; ) 414 | d ? f[g] = t.charCodeAt(n) : f[n] = t.charCodeAt(n), 415 | n++, 416 | g--; 417 | for (1 == d && (n = 0), 418 | g = i.chunkSize - c % i.chunkSize; g > 0; ) { 419 | if (2 == d) { 420 | for (a = Math.floor(256 * Math.random()); !a; ) 421 | a = Math.floor(256 * Math.random()); 422 | f[n] = a 423 | } else 424 | f[n] = 0; 425 | n++, 426 | g-- 427 | } 428 | for (2 == d && (f[c] = 0, 429 | f[i.chunkSize - 2] = 2, 430 | f[i.chunkSize - 1] = 0), 431 | u = f.length, 432 | n = 0; n < u; n += i.chunkSize) { 433 | for (b = new BigInt, 434 | g = 0, 435 | s = n; s < n + i.chunkSize; ++g) 436 | b.digits[g] = f[s++], 437 | b.digits[g] += f[s++] << 8; 438 | l = i.barrett.powMod(b, i.e), 439 | h = 1 == o ? biToBytes(l) : 16 == i.radix ? biToHex(l) : biToString(l, i.radix), 440 | m += h 441 | } 442 | return m 443 | } 444 | function decryptedString(i, t) { 445 | var r, e, n, g, s = t.split(" "), d = ""; 446 | for (e = 0; e < s.length; ++e) 447 | for (g = 16 == i.radix ? biFromHex(s[e]) : biFromString(s[e], i.radix), 448 | r = i.barrett.powMod(g, i.d), 449 | n = 0; n <= biHighIndex(r); ++n) 450 | d += String.fromCharCode(255 & r.digits[n], r.digits[n] >> 8); 451 | return 0 == d.charCodeAt(d.length - 1) && (d = d.substring(0, d.length - 1)), 452 | d 453 | } 454 | var biRadixBase = 2, biRadixBits = 16, bitsPerDigit = biRadixBits, biRadix = 65536, biHalfRadix = biRadix >>> 1, biRadixSquared = biRadix * biRadix, maxDigitVal = biRadix - 1, maxInteger = 9999999999999998, maxDigits, ZERO_ARRAY, bigZero, bigOne; 455 | setMaxDigits(20); 456 | var dpl10 = 15 457 | , lr10 = biFromNumber(1e15) 458 | , 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") 459 | , hexToChar = new Array("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f") 460 | , highBitMasks = new Array(0,32768,49152,57344,61440,63488,64512,65024,65280,65408,65472,65504,65520,65528,65532,65534,65535) 461 | , lowBitMasks = new Array(0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535) 462 | , RSAAPP = {}; 463 | RSAAPP.NoPadding = "NoPadding"; 464 | RSAAPP.PKCS1Padding = "PKCS1Padding"; 465 | RSAAPP.RawEncoding = "RawEncoding"; 466 | RSAAPP.NumericEncoding = "NumericEncoding"; 467 | 468 | function test(pwd){ 469 | pK = 'DDE714AAD710B922A46F376FC9D883D0B073688C38F6D30A88FAD8073D9F630D3ED774C9B82746EAB06E8E6B4AD0B9FB94C2B2E42BD78C33E0BDAA0F4B679306C7B570743F8A2E378B6D1CCFC863365A2446AE18020742B7840905B3B56FADEABA8166AD6401C9B6AE8DB7B82729BE21A92C83C14A1881A20F85CDF61FF8BC75' 470 | setMaxDigits(131); 471 | var c = new RSAKeyPair("3","10001",pK,1024) 472 | , t = (encryptedString(c, pwd, RSAAPP.PKCS1Padding, RSAAPP.RawEncoding)); 473 | return Buffer.from(t).toString('base64') 474 | } 475 | 476 | var username = '137512654824'; 477 | var pwd = 'a12345678' 478 | 479 | console.log(test(username)) 480 | console.log(test(pwd)) 481 | 482 | var bat = CryptoJS.MD5('YGwTkAQs'.substr(0)+'kfKe8Gmz'.toUpperCase()+'HMSjVh+V'.toLowerCase()+'Z3csXx+J'); 483 | console.log(bat+'') 484 | // t = new Buffer(t, 'base64') 485 | 486 | 487 | -------------------------------------------------------------------------------- /RSA/BigInt.js: -------------------------------------------------------------------------------- 1 | // BigInt, a suite of routines for performing multiple-precision arithmetic in 2 | // JavaScript. 3 | // 4 | // Copyright 1998-2005 David Shapiro. 5 | // 6 | // You may use, re-use, abuse, 7 | // copy, and modify this code to your liking, but please keep this header. 8 | // Thanks! 9 | // 10 | // Dave Shapiro 11 | // dave@ohdave.com 12 | 13 | // IMPORTANT THING: Be sure to set maxDigits according to your precision 14 | // needs. Use the setMaxDigits() function to do this. See comments below. 15 | // 16 | // Tweaked by Ian Bunning 17 | // Alterations: 18 | // Fix bug in function biFromHex(s) to allow 19 | // parsing of strings of length != 0 (mod 4) 20 | 21 | // Changes made by Dave Shapiro as of 12/30/2004: 22 | // 23 | // The BigInt() constructor doesn't take a string anymore. If you want to 24 | // create a BigInt from a string, use biFromDecimal() for base-10 25 | // representations, biFromHex() for base-16 representations, or 26 | // biFromString() for base-2-to-36 representations. 27 | // 28 | // biFromArray() has been removed. Use biCopy() instead, passing a BigInt 29 | // instead of an array. 30 | // 31 | // The BigInt() constructor now only constructs a zeroed-out array. 32 | // Alternatively, if you pass , it won't construct any array. See the 33 | // biCopy() method for an example of this. 34 | // 35 | // Be sure to set maxDigits depending on your precision needs. The default 36 | // zeroed-out array ZERO_ARRAY is constructed inside the setMaxDigits() 37 | // function. So use this function to set the variable. DON'T JUST SET THE 38 | // VALUE. USE THE FUNCTION. 39 | // 40 | // ZERO_ARRAY exists to hopefully speed up construction of BigInts(). By 41 | // precalculating the zero array, we can just use slice(0) to make copies of 42 | // it. Presumably this calls faster native code, as opposed to setting the 43 | // elements one at a time. I have not done any timing tests to verify this 44 | // claim. 45 | 46 | // Max number = 10^16 - 2 = 9999999999999998; 47 | // 2^53 = 9007199254740992; 48 | 49 | var biRadixBase = 2; 50 | var biRadixBits = 16; 51 | var bitsPerDigit = biRadixBits; 52 | var biRadix = 1 << 16; // = 2^16 = 65536 53 | var biHalfRadix = biRadix >>> 1; 54 | var biRadixSquared = biRadix * biRadix; 55 | var maxDigitVal = biRadix - 1; 56 | var maxInteger = 9999999999999998; 57 | 58 | // maxDigits: 59 | // Change this to accommodate your largest number size. Use setMaxDigits() 60 | // to change it! 61 | // 62 | // In general, if you're working with numbers of size N bits, you'll need 2*N 63 | // bits of storage. Each digit holds 16 bits. So, a 1024-bit key will need 64 | // 65 | // 1024 * 2 / 16 = 128 digits of storage. 66 | // 67 | 68 | var maxDigits; 69 | var ZERO_ARRAY; 70 | var bigZero, bigOne; 71 | 72 | function setMaxDigits(value) 73 | { 74 | maxDigits = value; 75 | ZERO_ARRAY = new Array(maxDigits); 76 | for (var iza = 0; iza < ZERO_ARRAY.length; iza++) ZERO_ARRAY[iza] = 0; 77 | bigZero = new BigInt(); 78 | bigOne = new BigInt(); 79 | bigOne.digits[0] = 1; 80 | } 81 | 82 | setMaxDigits(20); 83 | 84 | // The maximum number of digits in base 10 you can convert to an 85 | // integer without JavaScript throwing up on you. 86 | var dpl10 = 15; 87 | // lr10 = 10 ^ dpl10 88 | var lr10 = biFromNumber(1000000000000000); 89 | 90 | function BigInt(flag) 91 | { 92 | if (typeof flag == "boolean" && flag == true) { 93 | this.digits = null; 94 | } 95 | else { 96 | this.digits = ZERO_ARRAY.slice(0); 97 | } 98 | this.isNeg = false; 99 | } 100 | 101 | function biFromDecimal(s) 102 | { 103 | var isNeg = s.charAt(0) == '-'; 104 | var i = isNeg ? 1 : 0; 105 | var result; 106 | // Skip leading zeros. 107 | while (i < s.length && s.charAt(i) == '0') ++i; 108 | if (i == s.length) { 109 | result = new BigInt(); 110 | } 111 | else { 112 | var digitCount = s.length - i; 113 | var fgl = digitCount % dpl10; 114 | if (fgl == 0) fgl = dpl10; 115 | result = biFromNumber(Number(s.substr(i, fgl))); 116 | i += fgl; 117 | while (i < s.length) { 118 | result = biAdd(biMultiply(result, lr10), 119 | biFromNumber(Number(s.substr(i, dpl10)))); 120 | i += dpl10; 121 | } 122 | result.isNeg = isNeg; 123 | } 124 | return result; 125 | } 126 | 127 | function biCopy(bi) 128 | { 129 | var result = new BigInt(true); 130 | result.digits = bi.digits.slice(0); 131 | result.isNeg = bi.isNeg; 132 | return result; 133 | } 134 | 135 | function biFromNumber(i) 136 | { 137 | var result = new BigInt(); 138 | result.isNeg = i < 0; 139 | i = Math.abs(i); 140 | var j = 0; 141 | while (i > 0) { 142 | result.digits[j++] = i & maxDigitVal; 143 | i >>= biRadixBits; 144 | } 145 | return result; 146 | } 147 | 148 | function reverseStr(s) 149 | { 150 | var result = ""; 151 | for (var i = s.length - 1; i > -1; --i) { 152 | result += s.charAt(i); 153 | } 154 | return result; 155 | } 156 | 157 | var hexatrigesimalToChar = new Array( 158 | '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 159 | 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 160 | 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 161 | 'u', 'v', 'w', 'x', 'y', 'z' 162 | ); 163 | 164 | function biToString(x, radix) 165 | // 2 <= radix <= 36 166 | { 167 | var b = new BigInt(); 168 | b.digits[0] = radix; 169 | var qr = biDivideModulo(x, b); 170 | var result = hexatrigesimalToChar[qr[1].digits[0]]; 171 | while (biCompare(qr[0], bigZero) == 1) { 172 | qr = biDivideModulo(qr[0], b); 173 | digit = qr[1].digits[0]; 174 | result += hexatrigesimalToChar[qr[1].digits[0]]; 175 | } 176 | return (x.isNeg ? "-" : "") + reverseStr(result); 177 | } 178 | 179 | function biToDecimal(x) 180 | { 181 | var b = new BigInt(); 182 | b.digits[0] = 10; 183 | var qr = biDivideModulo(x, b); 184 | var result = String(qr[1].digits[0]); 185 | while (biCompare(qr[0], bigZero) == 1) { 186 | qr = biDivideModulo(qr[0], b); 187 | result += String(qr[1].digits[0]); 188 | } 189 | return (x.isNeg ? "-" : "") + reverseStr(result); 190 | } 191 | 192 | var hexToChar = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 193 | 'a', 'b', 'c', 'd', 'e', 'f'); 194 | 195 | function digitToHex(n) 196 | { 197 | var mask = 0xf; 198 | var result = ""; 199 | for (i = 0; i < 4; ++i) { 200 | result += hexToChar[n & mask]; 201 | n >>>= 4; 202 | } 203 | return reverseStr(result); 204 | } 205 | 206 | function biToHex(x) 207 | { 208 | var result = ""; 209 | var n = biHighIndex(x); 210 | for (var i = biHighIndex(x); i > -1; --i) { 211 | result += digitToHex(x.digits[i]); 212 | } 213 | return result; 214 | } 215 | 216 | function charToHex(c) 217 | { 218 | var ZERO = 48; 219 | var NINE = ZERO + 9; 220 | var littleA = 97; 221 | var littleZ = littleA + 25; 222 | var bigA = 65; 223 | var bigZ = 65 + 25; 224 | var result; 225 | 226 | if (c >= ZERO && c <= NINE) { 227 | result = c - ZERO; 228 | } else if (c >= bigA && c <= bigZ) { 229 | result = 10 + c - bigA; 230 | } else if (c >= littleA && c <= littleZ) { 231 | result = 10 + c - littleA; 232 | } else { 233 | result = 0; 234 | } 235 | return result; 236 | } 237 | 238 | function hexToDigit(s) 239 | { 240 | var result = 0; 241 | var sl = Math.min(s.length, 4); 242 | for (var i = 0; i < sl; ++i) { 243 | result <<= 4; 244 | result |= charToHex(s.charCodeAt(i)) 245 | } 246 | return result; 247 | } 248 | 249 | function biFromHex(s) 250 | { 251 | var result = new BigInt(); 252 | var sl = s.length; 253 | for (var i = sl, j = 0; i > 0; i -= 4, ++j) { 254 | result.digits[j] = hexToDigit(s.substr(Math.max(i - 4, 0), Math.min(i, 4))); 255 | } 256 | return result; 257 | } 258 | 259 | function biFromString(s, radix) 260 | { 261 | var isNeg = s.charAt(0) == '-'; 262 | var istop = isNeg ? 1 : 0; 263 | var result = new BigInt(); 264 | var place = new BigInt(); 265 | place.digits[0] = 1; // radix^0 266 | for (var i = s.length - 1; i >= istop; i--) { 267 | var c = s.charCodeAt(i); 268 | var digit = charToHex(c); 269 | var biDigit = biMultiplyDigit(place, digit); 270 | result = biAdd(result, biDigit); 271 | place = biMultiplyDigit(place, radix); 272 | } 273 | result.isNeg = isNeg; 274 | return result; 275 | } 276 | 277 | function biToBytes(x) 278 | // Returns a string containing raw bytes. 279 | { 280 | var result = ""; 281 | for (var i = biHighIndex(x); i > -1; --i) { 282 | result += digitToBytes(x.digits[i]); 283 | } 284 | return result; 285 | } 286 | 287 | function digitToBytes(n) 288 | // Convert two-byte digit to string containing both bytes. 289 | { 290 | var c1 = String.fromCharCode(n & 0xff); 291 | n >>>= 8; 292 | var c2 = String.fromCharCode(n & 0xff); 293 | return c2 + c1; 294 | } 295 | 296 | function biDump(b) 297 | { 298 | return (b.isNeg ? "-" : "") + b.digits.join(" "); 299 | } 300 | 301 | function biAdd(x, y) 302 | { 303 | var result; 304 | 305 | if (x.isNeg != y.isNeg) { 306 | y.isNeg = !y.isNeg; 307 | result = biSubtract(x, y); 308 | y.isNeg = !y.isNeg; 309 | } 310 | else { 311 | result = new BigInt(); 312 | var c = 0; 313 | var n; 314 | for (var i = 0; i < x.digits.length; ++i) { 315 | n = x.digits[i] + y.digits[i] + c; 316 | result.digits[i] = n & 0xffff; 317 | c = Number(n >= biRadix); 318 | } 319 | result.isNeg = x.isNeg; 320 | } 321 | return result; 322 | } 323 | 324 | function biSubtract(x, y) 325 | { 326 | var result; 327 | if (x.isNeg != y.isNeg) { 328 | y.isNeg = !y.isNeg; 329 | result = biAdd(x, y); 330 | y.isNeg = !y.isNeg; 331 | } else { 332 | result = new BigInt(); 333 | var n, c; 334 | c = 0; 335 | for (var i = 0; i < x.digits.length; ++i) { 336 | n = x.digits[i] - y.digits[i] + c; 337 | result.digits[i] = n & 0xffff; 338 | // Stupid non-conforming modulus operation. 339 | if (result.digits[i] < 0) result.digits[i] += biRadix; 340 | c = 0 - Number(n < 0); 341 | } 342 | // Fix up the negative sign, if any. 343 | if (c == -1) { 344 | c = 0; 345 | for (var i = 0; i < x.digits.length; ++i) { 346 | n = 0 - result.digits[i] + c; 347 | result.digits[i] = n & 0xffff; 348 | // Stupid non-conforming modulus operation. 349 | if (result.digits[i] < 0) result.digits[i] += biRadix; 350 | c = 0 - Number(n < 0); 351 | } 352 | // Result is opposite sign of arguments. 353 | result.isNeg = !x.isNeg; 354 | } else { 355 | // Result is same sign. 356 | result.isNeg = x.isNeg; 357 | } 358 | } 359 | return result; 360 | } 361 | 362 | function biHighIndex(x) 363 | { 364 | var result = x.digits.length - 1; 365 | while (result > 0 && x.digits[result] == 0) --result; 366 | return result; 367 | } 368 | 369 | function biNumBits(x) 370 | { 371 | var n = biHighIndex(x); 372 | var d = x.digits[n]; 373 | var m = (n + 1) * bitsPerDigit; 374 | var result; 375 | for (result = m; result > m - bitsPerDigit; --result) { 376 | if ((d & 0x8000) != 0) break; 377 | d <<= 1; 378 | } 379 | return result; 380 | } 381 | 382 | function biMultiply(x, y) 383 | { 384 | var result = new BigInt(); 385 | var c; 386 | var n = biHighIndex(x); 387 | var t = biHighIndex(y); 388 | var u, uv, k; 389 | 390 | for (var i = 0; i <= t; ++i) { 391 | c = 0; 392 | k = i; 393 | for (j = 0; j <= n; ++j, ++k) { 394 | uv = result.digits[k] + x.digits[j] * y.digits[i] + c; 395 | result.digits[k] = uv & maxDigitVal; 396 | c = uv >>> biRadixBits; 397 | } 398 | result.digits[i + n + 1] = c; 399 | } 400 | // Someone give me a logical xor, please. 401 | result.isNeg = x.isNeg != y.isNeg; 402 | return result; 403 | } 404 | 405 | function biMultiplyDigit(x, y) 406 | { 407 | var n, c, uv; 408 | 409 | result = new BigInt(); 410 | n = biHighIndex(x); 411 | c = 0; 412 | for (var j = 0; j <= n; ++j) { 413 | uv = result.digits[j] + x.digits[j] * y + c; 414 | result.digits[j] = uv & maxDigitVal; 415 | c = uv >>> biRadixBits; 416 | } 417 | result.digits[1 + n] = c; 418 | return result; 419 | } 420 | 421 | function arrayCopy(src, srcStart, dest, destStart, n) 422 | { 423 | var m = Math.min(srcStart + n, src.length); 424 | for (var i = srcStart, j = destStart; i < m; ++i, ++j) { 425 | dest[j] = src[i]; 426 | } 427 | } 428 | 429 | var highBitMasks = new Array(0x0000, 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 430 | 0xFC00, 0xFE00, 0xFF00, 0xFF80, 0xFFC0, 0xFFE0, 431 | 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF); 432 | 433 | function biShiftLeft(x, n) 434 | { 435 | var digitCount = Math.floor(n / bitsPerDigit); 436 | var result = new BigInt(); 437 | arrayCopy(x.digits, 0, result.digits, digitCount, 438 | result.digits.length - digitCount); 439 | var bits = n % bitsPerDigit; 440 | var rightBits = bitsPerDigit - bits; 441 | for (var i = result.digits.length - 1, i1 = i - 1; i > 0; --i, --i1) { 442 | result.digits[i] = ((result.digits[i] << bits) & maxDigitVal) | 443 | ((result.digits[i1] & highBitMasks[bits]) >>> 444 | (rightBits)); 445 | } 446 | result.digits[0] = ((result.digits[i] << bits) & maxDigitVal); 447 | result.isNeg = x.isNeg; 448 | return result; 449 | } 450 | 451 | var lowBitMasks = new Array(0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 452 | 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 453 | 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF); 454 | 455 | function biShiftRight(x, n) 456 | { 457 | var digitCount = Math.floor(n / bitsPerDigit); 458 | var result = new BigInt(); 459 | arrayCopy(x.digits, digitCount, result.digits, 0, 460 | x.digits.length - digitCount); 461 | var bits = n % bitsPerDigit; 462 | var leftBits = bitsPerDigit - bits; 463 | for (var i = 0, i1 = i + 1; i < result.digits.length - 1; ++i, ++i1) { 464 | result.digits[i] = (result.digits[i] >>> bits) | 465 | ((result.digits[i1] & lowBitMasks[bits]) << leftBits); 466 | } 467 | result.digits[result.digits.length - 1] >>>= bits; 468 | result.isNeg = x.isNeg; 469 | return result; 470 | } 471 | 472 | function biMultiplyByRadixPower(x, n) 473 | { 474 | var result = new BigInt(); 475 | arrayCopy(x.digits, 0, result.digits, n, result.digits.length - n); 476 | return result; 477 | } 478 | 479 | function biDivideByRadixPower(x, n) 480 | { 481 | var result = new BigInt(); 482 | arrayCopy(x.digits, n, result.digits, 0, result.digits.length - n); 483 | return result; 484 | } 485 | 486 | function biModuloByRadixPower(x, n) 487 | { 488 | var result = new BigInt(); 489 | arrayCopy(x.digits, 0, result.digits, 0, n); 490 | return result; 491 | } 492 | 493 | function biCompare(x, y) 494 | { 495 | if (x.isNeg != y.isNeg) { 496 | return 1 - 2 * Number(x.isNeg); 497 | } 498 | for (var i = x.digits.length - 1; i >= 0; --i) { 499 | if (x.digits[i] != y.digits[i]) { 500 | if (x.isNeg) { 501 | return 1 - 2 * Number(x.digits[i] > y.digits[i]); 502 | } else { 503 | return 1 - 2 * Number(x.digits[i] < y.digits[i]); 504 | } 505 | } 506 | } 507 | return 0; 508 | } 509 | 510 | function biDivideModulo(x, y) 511 | { 512 | var nb = biNumBits(x); 513 | var tb = biNumBits(y); 514 | var origYIsNeg = y.isNeg; 515 | var q, r; 516 | if (nb < tb) { 517 | // |x| < |y| 518 | if (x.isNeg) { 519 | q = biCopy(bigOne); 520 | q.isNeg = !y.isNeg; 521 | x.isNeg = false; 522 | y.isNeg = false; 523 | r = biSubtract(y, x); 524 | // Restore signs, 'cause they're references. 525 | x.isNeg = true; 526 | y.isNeg = origYIsNeg; 527 | } else { 528 | q = new BigInt(); 529 | r = biCopy(x); 530 | } 531 | return new Array(q, r); 532 | } 533 | 534 | q = new BigInt(); 535 | r = x; 536 | 537 | // Normalize Y. 538 | var t = Math.ceil(tb / bitsPerDigit) - 1; 539 | var lambda = 0; 540 | while (y.digits[t] < biHalfRadix) { 541 | y = biShiftLeft(y, 1); 542 | ++lambda; 543 | ++tb; 544 | t = Math.ceil(tb / bitsPerDigit) - 1; 545 | } 546 | // Shift r over to keep the quotient constant. We'll shift the 547 | // remainder back at the end. 548 | r = biShiftLeft(r, lambda); 549 | nb += lambda; // Update the bit count for x. 550 | var n = Math.ceil(nb / bitsPerDigit) - 1; 551 | 552 | var b = biMultiplyByRadixPower(y, n - t); 553 | while (biCompare(r, b) != -1) { 554 | ++q.digits[n - t]; 555 | r = biSubtract(r, b); 556 | } 557 | for (var i = n; i > t; --i) { 558 | var ri = (i >= r.digits.length) ? 0 : r.digits[i]; 559 | var ri1 = (i - 1 >= r.digits.length) ? 0 : r.digits[i - 1]; 560 | var ri2 = (i - 2 >= r.digits.length) ? 0 : r.digits[i - 2]; 561 | var yt = (t >= y.digits.length) ? 0 : y.digits[t]; 562 | var yt1 = (t - 1 >= y.digits.length) ? 0 : y.digits[t - 1]; 563 | if (ri == yt) { 564 | q.digits[i - t - 1] = maxDigitVal; 565 | } else { 566 | q.digits[i - t - 1] = Math.floor((ri * biRadix + ri1) / yt); 567 | } 568 | 569 | var c1 = q.digits[i - t - 1] * ((yt * biRadix) + yt1); 570 | var c2 = (ri * biRadixSquared) + ((ri1 * biRadix) + ri2); 571 | while (c1 > c2) { 572 | --q.digits[i - t - 1]; 573 | c1 = q.digits[i - t - 1] * ((yt * biRadix) | yt1); 574 | c2 = (ri * biRadix * biRadix) + ((ri1 * biRadix) + ri2); 575 | } 576 | 577 | b = biMultiplyByRadixPower(y, i - t - 1); 578 | r = biSubtract(r, biMultiplyDigit(b, q.digits[i - t - 1])); 579 | if (r.isNeg) { 580 | r = biAdd(r, b); 581 | --q.digits[i - t - 1]; 582 | } 583 | } 584 | r = biShiftRight(r, lambda); 585 | // Fiddle with the signs and stuff to make sure that 0 <= r < y. 586 | q.isNeg = x.isNeg != origYIsNeg; 587 | if (x.isNeg) { 588 | if (origYIsNeg) { 589 | q = biAdd(q, bigOne); 590 | } else { 591 | q = biSubtract(q, bigOne); 592 | } 593 | y = biShiftRight(y, lambda); 594 | r = biSubtract(y, r); 595 | } 596 | // Check for the unbelievably stupid degenerate case of r == -0. 597 | if (r.digits[0] == 0 && biHighIndex(r) == 0) r.isNeg = false; 598 | 599 | return new Array(q, r); 600 | } 601 | 602 | function biDivide(x, y) 603 | { 604 | return biDivideModulo(x, y)[0]; 605 | } 606 | 607 | function biModulo(x, y) 608 | { 609 | return biDivideModulo(x, y)[1]; 610 | } 611 | 612 | function biMultiplyMod(x, y, m) 613 | { 614 | return biModulo(biMultiply(x, y), m); 615 | } 616 | 617 | function biPow(x, y) 618 | { 619 | var result = bigOne; 620 | var a = x; 621 | while (true) { 622 | if ((y & 1) != 0) result = biMultiply(result, a); 623 | y >>= 1; 624 | if (y == 0) break; 625 | a = biMultiply(a, a); 626 | } 627 | return result; 628 | } 629 | 630 | function biPowMod(x, y, m) 631 | { 632 | var result = bigOne; 633 | var a = x; 634 | var k = y; 635 | while (true) { 636 | if ((k.digits[0] & 1) != 0) result = biMultiplyMod(result, a, m); 637 | k = biShiftRight(k, 1); 638 | if (k.digits[0] == 0 && biHighIndex(k) == 0) break; 639 | a = biMultiplyMod(a, a, m); 640 | } 641 | return result; 642 | } 643 | 644 | -------------------------------------------------------------------------------- /网易易盾JS分析/my_trace.js: -------------------------------------------------------------------------------- 1 | wy_encode = {} 2 | 3 | function test(e, t) { 4 | function n(e, t) { 5 | function n(e, t) { 6 | return e.charCodeAt(Math.floor(t % e.length)) 7 | } 8 | function i(e, t) { 9 | return t.split("").map(function(t, i) { 10 | return t.charCodeAt(0) ^ n(e, i) 11 | }) 12 | } 13 | return t = i(e, t), 14 | _(t) 15 | } 16 | wy_encode.trace = n; 17 | __toByte = function(e) { 18 | function t(t) { 19 | return e.apply(this, arguments) 20 | } 21 | return t.toString = function() { 22 | return e.toString() 23 | } 24 | , 25 | t 26 | }(function(e) { 27 | if (e < -128) 28 | return __toByte(128 - (-128 - e)); 29 | if (e >= -128 && e <= 127) 30 | return e; 31 | if (e > 127) 32 | return __toByte(-129 + e - 127); 33 | throw new Error("1001") 34 | }); 35 | var i = function(e, t) { 36 | return __toByte(e + t) 37 | } 38 | , r = function(e, t) { 39 | if (null == e) 40 | return null; 41 | if (null == t) 42 | return e; 43 | for (var n = [], r = t.length, o = 0, a = e.length; o < a; o++) 44 | n[o] = i(e[o], t[o % r]); 45 | return n 46 | } 47 | , o = function(e, t) { 48 | return e = __toByte(e), 49 | t = __toByte(t), 50 | __toByte(e ^ t) 51 | } 52 | , a = function(e, t) { 53 | if (null == e || null == t || e.length != t.length) 54 | return e; 55 | for (var n = [], i = e.length, r = 0, a = i; r < a; r++) 56 | n[r] = o(e[r], t[r]); 57 | return n 58 | } 59 | , l = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"] 60 | , u = function(e) { 61 | var t = []; 62 | return t.push(l[e >>> 4 & 15]), 63 | t.push(l[15 & e]), 64 | t.join("") 65 | } 66 | , s = function(e) { 67 | var t = e.length; 68 | if (null == e || t < 0) 69 | return new String(""); 70 | for (var n = [], i = 0; i < t; i++) 71 | n.push(u(e[i])); 72 | return n.join("") 73 | } 74 | , f = function(e) { 75 | if (null == e || 0 == e.length) 76 | return []; 77 | for (var t = new String(e), n = [], i = t.length / 2, r = 0, o = 0; o < i; o++) { 78 | var a = parseInt(t.charAt(r++), 16) << 4 79 | , l = parseInt(t.charAt(r++), 16); 80 | n[o] = __toByte(a + l) 81 | } 82 | return n 83 | } 84 | , j = function(e) { 85 | if (null == e || void 0 == e) 86 | return e; 87 | for (var t = encodeURIComponent(e), n = [], i = t.length, r = 0; r < i; r++) 88 | if ("%" == t.charAt(r)) { 89 | if (!(r + 2 < i)) 90 | throw new Error("1009"); 91 | n.push(f(t.charAt(++r) + "" + t.charAt(++r))[0]) 92 | } else 93 | n.push(t.charCodeAt(r)); 94 | return n 95 | } 96 | , c = function(e) { 97 | var t = []; 98 | return t[0] = e >>> 24 & 255, 99 | t[1] = e >>> 16 & 255, 100 | t[2] = e >>> 8 & 255, 101 | t[3] = 255 & e, 102 | t 103 | } 104 | , d = function(e) { 105 | var t = c(e); 106 | return s(t) 107 | } 108 | , p = function(e, t, n) { 109 | var i = []; 110 | if (null == e || 0 == e.length) 111 | return i; 112 | if (e.length < n) 113 | throw new Error("1003"); 114 | for (var r = 0; r < n; r++) 115 | i[r] = e[t + r]; 116 | return i 117 | } 118 | , h = function(e, t, n, i, r) { 119 | if (null == e || 0 == e.length) 120 | return n; 121 | if (null == n) 122 | throw new Error("1004"); 123 | if (e.length < r) 124 | throw new Error("1003"); 125 | for (var o = 0; o < r; o++) 126 | n[i + o] = e[t + o]; 127 | return n 128 | } 129 | , y = function(e) { 130 | for (var t = [], n = 0; n < e; n++) 131 | t[n] = 0; 132 | return t 133 | } 134 | , v = function(e) { 135 | return null == e || void 0 == e || "" == e 136 | } 137 | , b = function() { 138 | return ["i", "/", "x", "1", "X", "g", "U", "0", "z", "7", "k", "8", "N", "+", "l", "C", "p", "O", "n", "P", "r", "v", "6", "\\", "q", "u", "2", "G", "j", "9", "H", "R", "c", "w", "T", "Y", "Z", "4", "b", "f", "S", "J", "B", "h", "a", "W", "s", "t", "A", "e", "o", "M", "I", "E", "Q", "5", "m", "D", "d", "V", "F", "L", "K", "y"] 139 | } 140 | , g = function() { 141 | return "3" 142 | } 143 | , m = function(e, t, n) { 144 | var i, r, o, a = b(), l = g(), u = []; 145 | if (1 == n) 146 | i = e[t], 147 | r = 0, 148 | o = 0, 149 | u.push(a[i >>> 2 & 63]), 150 | u.push(a[(i << 4 & 48) + (r >>> 4 & 15)]), 151 | u.push(l), 152 | u.push(l); 153 | else if (2 == n) 154 | i = e[t], 155 | r = e[t + 1], 156 | o = 0, 157 | u.push(a[i >>> 2 & 63]), 158 | u.push(a[(i << 4 & 48) + (r >>> 4 & 15)]), 159 | u.push(a[(r << 2 & 60) + (o >>> 6 & 3)]), 160 | u.push(l); 161 | else { 162 | if (3 != n) 163 | throw new Error("1010"); 164 | i = e[t], 165 | r = e[t + 1], 166 | o = e[t + 2], 167 | u.push(a[i >>> 2 & 63]), 168 | u.push(a[(i << 4 & 48) + (r >>> 4 & 15)]), 169 | u.push(a[(r << 2 & 60) + (o >>> 6 & 3)]), 170 | u.push(a[63 & o]) 171 | } 172 | return u.join("") 173 | } 174 | , _ = function(e) { 175 | if (null == e || void 0 == e) 176 | return null; 177 | if (0 == e.length) 178 | return ""; 179 | var t = 3; 180 | try { 181 | for (var n = [], i = 0; i < e.length; ) { 182 | if (!(i + t <= e.length)) { 183 | n.push(m(e, i, e.length - i)); 184 | break 185 | } 186 | n.push(m(e, i, t)), 187 | i += t 188 | } 189 | return n.join("") 190 | } catch (r) { 191 | throw new Error("1010") 192 | } 193 | } 194 | , S = function(e) { 195 | return _(j(e)) 196 | } 197 | , T = [0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925, 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918e3, 2847714899, 3736837829, 1202900863, 817233897, 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117] 198 | , w = function(e) { 199 | var t = 4294967295; 200 | if (null != e) 201 | for (var n = 0; n < e.length; n++) { 202 | var i = e[n]; 203 | t = t >>> 8 ^ T[255 & (t ^ i)] 204 | } 205 | return d(4294967295 ^ t, 8) 206 | } 207 | , E = function(e) { 208 | return w(null == e ? [] : j(e)) 209 | } 210 | , R = [120, 85, -95, -84, 122, 38, -16, -53, -11, 16, 55, 3, 125, -29, 32, -128, -94, 77, 15, 106, -88, -100, -34, 88, 78, 105, -104, -90, -70, 90, -119, -28, -19, -47, -111, 117, -105, -62, -35, 2, -14, -32, 114, 23, -21, 25, -7, -92, 96, -103, 126, 112, -113, -65, -109, -44, 47, 48, 86, 75, 62, -26, 72, -56, -27, 66, -42, 63, 14, 92, 59, -101, 19, -33, 12, -18, -126, -50, -67, 42, 7, -60, -81, -93, -86, 40, -69, -37, 98, -63, -59, 108, 46, -45, 93, 102, 65, -79, 73, -23, -46, 37, -114, -15, 44, -54, 99, -10, 60, -96, 76, 26, 61, -107, 18, -116, -55, -40, 57, -76, -82, 45, 0, -112, -77, 29, 43, -30, 109, -91, -83, 107, 101, 81, -52, -71, 84, 36, -41, 68, 39, -75, -122, -6, 11, -80, -17, -74, -73, 35, 49, -49, -127, 80, 103, 79, -25, 52, -43, 56, 41, -61, -24, 17, -118, 115, -38, 8, -78, 33, -85, -106, 58, -98, -108, 94, 116, -125, -51, -9, 71, 82, 87, -115, 9, 69, -123, 123, -117, 113, -22, -124, -87, 64, 13, 21, -89, -2, -99, -97, 1, -4, 34, 20, 83, 119, 30, -12, -110, -66, 118, -48, 6, -36, 104, -58, -102, 97, 5, -20, 31, -72, 70, -39, 67, -68, -57, 110, 89, 51, 10, -120, 28, 111, 127, 22, -3, 54, 53, -1, 100, 74, 50, 91, 27, -31, -5, -64, 124, -121, 24, -13, 95, 121, -8, 4] 211 | , k = 4 212 | , C = 4 213 | , X = 4 214 | , O = 4 215 | , $ = function(e) { 216 | var t = []; 217 | if (null == e || void 0 == e || 0 == e.length) 218 | return y(C); 219 | if (e.length >= C) 220 | return p(e, 0, C); 221 | for (var n = 0; n < C; n++) 222 | t[n] = e[n % e.length]; 223 | return t 224 | } 225 | , I = function(e) { 226 | if (null == e || void 0 == e || 0 == e.length) 227 | return y(k); 228 | var t = e.length 229 | , n = 0; 230 | n = t % k <= k - X ? k - t % k - X : 2 * k - t % k - X; 231 | var i = []; 232 | h(e, 0, i, 0, t); 233 | for (var r = 0; r < n; r++) 234 | i[t + r] = 0; 235 | var o = c(t); 236 | return h(o, 0, i, t + n, X), 237 | i 238 | } 239 | , x = function(e) { 240 | if (null == e || e.length % k != 0) 241 | throw new Error("1005"); 242 | for (var t = [], n = 0, i = e.length / k, r = 0; r < i; r++) { 243 | t[r] = []; 244 | for (var o = 0; o < k; o++) 245 | t[r][o] = e[n++] 246 | } 247 | return t 248 | } 249 | , A = function(e) { 250 | var t = e >>> 4 & 15 251 | , n = 15 & e 252 | , i = 16 * t + n; 253 | return R[i] 254 | } 255 | , N = function(e) { 256 | if (null == e) 257 | return null; 258 | for (var t = [], n = 0, i = e.length; n < i; n++) 259 | t[n] = A(e[n]); 260 | return t 261 | } 262 | , P = function() { 263 | for (var e = [], t = 0; t < O; t++) { 264 | var n = 256 * Math.random(); 265 | n = Math.floor(n), 266 | e[t] = __toByte(n) 267 | } 268 | return e 269 | } 270 | , M = function(e, t) { 271 | if (null == e) 272 | return null; 273 | for (var n = __toByte(t), i = [], r = e.length, a = 0; a < r; a++) 274 | i.push(o(e[a], n)); 275 | return i 276 | } 277 | , L = function(e, t) { 278 | if (null == e) 279 | return null; 280 | for (var n = __toByte(t), r = [], o = e.length, a = 0; a < o; a++) 281 | r.push(i(e[a], n)); 282 | return r 283 | } 284 | , M = function(e, t) { 285 | if (null == e) 286 | return null; 287 | for (var n = __toByte(t), i = [], r = e.length, a = 0; a < r; a++) 288 | i.push(o(e[a], n)); 289 | return i 290 | } 291 | , D = function(e) { 292 | var t = M(e, 56) 293 | , n = L(t, -40) 294 | , i = M(n, 103); 295 | return i 296 | } 297 | , Y = function(e, t) { 298 | null == e && (e = []); 299 | var n = P(); 300 | t = $(t), 301 | t = a(t, $(n)), 302 | t = $(t); 303 | var i = t 304 | , o = I(e) 305 | , l = x(o) 306 | , u = []; 307 | h(n, 0, u, 0, O); 308 | for (var s = l.length, f = 0; f < s; f++) { 309 | var j = D(l[f]) 310 | , c = a(j, t) 311 | , d = r(c, i); 312 | c = a(d, i); 313 | var p = N(c); 314 | p = N(p), 315 | h(p, 0, u, f * k + O, k), 316 | i = p 317 | } 318 | return u 319 | } 320 | , B = function(e) { 321 | var t = "14731382d816714fC59E47De5dA0C871D3F"; 322 | if (null == t || void 0 == t) 323 | throw new Error("1008"); 324 | null != e && void 0 != e || (e = ""); 325 | var n = e + E(e) 326 | , i = j(n) 327 | , r = j(t) 328 | , o = Y(i, r); 329 | return _(o) 330 | }; 331 | wy_encode.cp = B, 332 | t.eypt = B, 333 | t.xor_encode = n, 334 | t.toByte = __toByte, 335 | t.str2Bytes = j, 336 | t.arrayCopy = p, 337 | t.arrayCopy2 = h, 338 | t.createEmptyArray = y, 339 | t.isEmptyString = v, 340 | t.base64Encode = S, 341 | t.getStringCRC32 = E, 342 | t.toByte = __toByte 343 | } 344 | 345 | 346 | function uuid(e, t) { 347 | var n = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("") 348 | , a = [] 349 | , i = void 0; 350 | if (t = t || n.length, 351 | e) 352 | for (i = 0; i < e; i++) 353 | a[i] = n[0 | Math.random() * t]; 354 | else { 355 | var r = void 0; 356 | for (a[8] = a[13] = a[18] = a[23] = "-", 357 | a[14] = "4", 358 | i = 0; i < 36; i++) 359 | a[i] || (r = 0 | 16 * Math.random(), 360 | a[i] = n[19 === i ? 3 & r | 8 : r]) 361 | } 362 | return a.join("") 363 | } 364 | 365 | 366 | // 生成范围内随机数 367 | function my_random(min, max) { 368 | return Math.random() * (max - min) + min; 369 | } 370 | 371 | function get_traces(distance){ 372 | var value = my_random(0.55, 0.75).toFixed(2) 373 | // 增加回滑 374 | distance += 20 375 | var v = 0, t =0.2 , sum = 0; 376 | var plus = [] 377 | var mid = distance * value 378 | while (sum < distance){ 379 | if (sum < mid){ 380 | // 指定范围随机产生一个加速度 381 | a = my_random(2.5, 3.5).toFixed(1) 382 | }else{ 383 | //指定范围随机产生一个减速的加速度 384 | a = -my_random(2.0, 3.0).toFixed(1) 385 | } 386 | var s = v * t + 0.5 * a * (t ** 2) 387 | v = v + a * t 388 | sum += s 389 | plus.push(Math.round(sum)) 390 | } 391 | // 回滑数组 392 | var reduce = [-3, -3, -2, -2, -2, -2, -2, -1, -1, -1] 393 | for (i of reduce){ 394 | sum = Math.round(sum) + i 395 | plus.push(sum) 396 | }; 397 | 398 | // 构造时间数组 399 | var motion_time = Math.round(my_random(4000, 6800)); 400 | var time_array = [] 401 | for(var i=0; i < plus.length; i++){ 402 | time_array.push(Math.round(i * motion_time / plus.length)) 403 | } 404 | 405 | var trace_array = [] 406 | for(var i=0; i < plus.length; i++){ 407 | // 将 x 偏移, y 偏移, 时间组成一个字符串放回 408 | trace_array.push(`${plus[i]},${Math.round(my_random(-2, 3))},${time_array[i]}`) 409 | } 410 | return trace_array 411 | } 412 | 413 | 414 | function sample(array, times){ 415 | var arr_len = array.length; 416 | if (arr_len <= times) 417 | return array; 418 | for (var i = [], r = 0, o = 0; o < arr_len; o++){ 419 | o >= r * (arr_len - 1) / (times - 1) && (i.push(array[o]), r += 1); 420 | } 421 | return i 422 | } 423 | 424 | 425 | function my_trace(token, distance){ 426 | traces = get_traces(distance) 427 | // console.log(traces.join('___'), traces.length) 428 | 429 | sample_traces = sample(traces, 50); 430 | // console.log(sample_traces.join('___'), sample_traces.length) 431 | test('', {}) 432 | 433 | var encode_trace = [] 434 | for (var i of sample_traces){ 435 | encode_trace.push(wy_encode.trace(token, i)) 436 | } 437 | 438 | var trace_d = wy_encode.cp(encode_trace.join(":")) 439 | var trace_r = wy_encode.cp(wy_encode.trace(token, parseInt(distance, 10) / 220 * 100 + "")) 440 | 441 | var data = JSON.stringify({ 442 | d: trace_d, 443 | m: "", 444 | p: trace_r, 445 | ext: wy_encode.cp(wy_encode.trace(token, 1 + "," + 159)) 446 | }) 447 | return [data, wy_encode.cp(uuid(32))] 448 | } 449 | 450 | var token = 'fd4cef518e9b4580a4a655e0833e5289' 451 | var distance = 65 452 | console.log(my_trace(token, distance)) 453 | 454 | // 记得将计算出来的 distance / (bg.width / 220) -------------------------------------------------------------------------------- /RSA/RSA_Stripped.js: -------------------------------------------------------------------------------- 1 | function BarrettMu(m) 2 | { 3 | this.modulus = biCopy(m); 4 | this.k = biHighIndex(this.modulus) + 1; 5 | var b2k = new BigInt(); 6 | b2k.digits[2 * this.k] = 1; // b2k = b^(2k) 7 | this.mu = biDivide(b2k, this.modulus); 8 | this.bkplus1 = new BigInt(); 9 | this.bkplus1.digits[this.k + 1] = 1; // bkplus1 = b^(k+1) 10 | this.modulo = BarrettMu_modulo; 11 | this.multiplyMod = BarrettMu_multiplyMod; 12 | this.powMod = BarrettMu_powMod; 13 | } 14 | 15 | function BarrettMu_modulo(x) 16 | { 17 | var q1 = biDivideByRadixPower(x, this.k - 1); 18 | var q2 = biMultiply(q1, this.mu); 19 | var q3 = biDivideByRadixPower(q2, this.k + 1); 20 | var r1 = biModuloByRadixPower(x, this.k + 1); 21 | var r2term = biMultiply(q3, this.modulus); 22 | var r2 = biModuloByRadixPower(r2term, this.k + 1); 23 | var r = biSubtract(r1, r2); 24 | if (r.isNeg) { 25 | r = biAdd(r, this.bkplus1); 26 | } 27 | var rgtem = biCompare(r, this.modulus) >= 0; 28 | while (rgtem) { 29 | r = biSubtract(r, this.modulus); 30 | rgtem = biCompare(r, this.modulus) >= 0; 31 | } 32 | return r; 33 | } 34 | 35 | function BarrettMu_multiplyMod(x, y) 36 | { 37 | /* 38 | x = this.modulo(x); 39 | y = this.modulo(y); 40 | */ 41 | var xy = biMultiply(x, y); 42 | return this.modulo(xy); 43 | } 44 | 45 | function BarrettMu_powMod(x, y) 46 | { 47 | var result = new BigInt(); 48 | result.digits[0] = 1; 49 | var a = x; 50 | var k = y; 51 | while (true) { 52 | if ((k.digits[0] & 1) != 0) result = this.multiplyMod(result, a); 53 | k = biShiftRight(k, 1); 54 | if (k.digits[0] == 0 && biHighIndex(k) == 0) break; 55 | a = this.multiplyMod(a, a); 56 | } 57 | return result; 58 | } 59 | 60 | 61 | 62 | var biRadixBase = 2; 63 | var biRadixBits = 16; 64 | var bitsPerDigit = biRadixBits; 65 | var biRadix = 1 << 16; // = 2^16 = 65536 66 | var biHalfRadix = biRadix >>> 1; 67 | var biRadixSquared = biRadix * biRadix; 68 | var maxDigitVal = biRadix - 1; 69 | var maxInteger = 9999999999999998; 70 | 71 | // maxDigits: 72 | // Change this to accommodate your largest number size. Use setMaxDigits() 73 | // to change it! 74 | // 75 | // In general, if you're working with numbers of size N bits, you'll need 2*N 76 | // bits of storage. Each digit holds 16 bits. So, a 1024-bit key will need 77 | // 78 | // 1024 * 2 / 16 = 128 digits of storage. 79 | // 80 | 81 | var maxDigits; 82 | var ZERO_ARRAY; 83 | var bigZero, bigOne; 84 | 85 | function setMaxDigits(value) 86 | { 87 | maxDigits = value; 88 | ZERO_ARRAY = new Array(maxDigits); 89 | for (var iza = 0; iza < ZERO_ARRAY.length; iza++) ZERO_ARRAY[iza] = 0; 90 | bigZero = new BigInt(); 91 | bigOne = new BigInt(); 92 | bigOne.digits[0] = 1; 93 | } 94 | 95 | setMaxDigits(20); 96 | 97 | // The maximum number of digits in base 10 you can convert to an 98 | // integer without JavaScript throwing up on you. 99 | var dpl10 = 15; 100 | // lr10 = 10 ^ dpl10 101 | var lr10 = biFromNumber(1000000000000000); 102 | 103 | function BigInt(flag) 104 | { 105 | if (typeof flag == "boolean" && flag == true) { 106 | this.digits = null; 107 | } 108 | else { 109 | this.digits = ZERO_ARRAY.slice(0); 110 | } 111 | this.isNeg = false; 112 | } 113 | 114 | function biFromDecimal(s) 115 | { 116 | var isNeg = s.charAt(0) == '-'; 117 | var i = isNeg ? 1 : 0; 118 | var result; 119 | // Skip leading zeros. 120 | while (i < s.length && s.charAt(i) == '0') ++i; 121 | if (i == s.length) { 122 | result = new BigInt(); 123 | } 124 | else { 125 | var digitCount = s.length - i; 126 | var fgl = digitCount % dpl10; 127 | if (fgl == 0) fgl = dpl10; 128 | result = biFromNumber(Number(s.substr(i, fgl))); 129 | i += fgl; 130 | while (i < s.length) { 131 | result = biAdd(biMultiply(result, lr10), 132 | biFromNumber(Number(s.substr(i, dpl10)))); 133 | i += dpl10; 134 | } 135 | result.isNeg = isNeg; 136 | } 137 | return result; 138 | } 139 | 140 | function biCopy(bi) 141 | { 142 | var result = new BigInt(true); 143 | result.digits = bi.digits.slice(0); 144 | result.isNeg = bi.isNeg; 145 | return result; 146 | } 147 | 148 | function biFromNumber(i) 149 | { 150 | var result = new BigInt(); 151 | result.isNeg = i < 0; 152 | i = Math.abs(i); 153 | var j = 0; 154 | while (i > 0) { 155 | result.digits[j++] = i & maxDigitVal; 156 | i >>= biRadixBits; 157 | } 158 | return result; 159 | } 160 | 161 | function reverseStr(s) 162 | { 163 | var result = ""; 164 | for (var i = s.length - 1; i > -1; --i) { 165 | result += s.charAt(i); 166 | } 167 | return result; 168 | } 169 | 170 | var hexatrigesimalToChar = new Array( 171 | '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 172 | 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 173 | 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 174 | 'u', 'v', 'w', 'x', 'y', 'z' 175 | ); 176 | 177 | function biToString(x, radix) 178 | // 2 <= radix <= 36 179 | { 180 | var b = new BigInt(); 181 | b.digits[0] = radix; 182 | var qr = biDivideModulo(x, b); 183 | var result = hexatrigesimalToChar[qr[1].digits[0]]; 184 | while (biCompare(qr[0], bigZero) == 1) { 185 | qr = biDivideModulo(qr[0], b); 186 | digit = qr[1].digits[0]; 187 | result += hexatrigesimalToChar[qr[1].digits[0]]; 188 | } 189 | return (x.isNeg ? "-" : "") + reverseStr(result); 190 | } 191 | 192 | function biToDecimal(x) 193 | { 194 | var b = new BigInt(); 195 | b.digits[0] = 10; 196 | var qr = biDivideModulo(x, b); 197 | var result = String(qr[1].digits[0]); 198 | while (biCompare(qr[0], bigZero) == 1) { 199 | qr = biDivideModulo(qr[0], b); 200 | result += String(qr[1].digits[0]); 201 | } 202 | return (x.isNeg ? "-" : "") + reverseStr(result); 203 | } 204 | 205 | var hexToChar = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 206 | 'a', 'b', 'c', 'd', 'e', 'f'); 207 | 208 | function digitToHex(n) 209 | { 210 | var mask = 0xf; 211 | var result = ""; 212 | for (i = 0; i < 4; ++i) { 213 | result += hexToChar[n & mask]; 214 | n >>>= 4; 215 | } 216 | return reverseStr(result); 217 | } 218 | 219 | function biToHex(x) 220 | { 221 | var result = ""; 222 | var n = biHighIndex(x); 223 | for (var i = biHighIndex(x); i > -1; --i) { 224 | result += digitToHex(x.digits[i]); 225 | } 226 | return result; 227 | } 228 | 229 | function charToHex(c) 230 | { 231 | var ZERO = 48; 232 | var NINE = ZERO + 9; 233 | var littleA = 97; 234 | var littleZ = littleA + 25; 235 | var bigA = 65; 236 | var bigZ = 65 + 25; 237 | var result; 238 | 239 | if (c >= ZERO && c <= NINE) { 240 | result = c - ZERO; 241 | } else if (c >= bigA && c <= bigZ) { 242 | result = 10 + c - bigA; 243 | } else if (c >= littleA && c <= littleZ) { 244 | result = 10 + c - littleA; 245 | } else { 246 | result = 0; 247 | } 248 | return result; 249 | } 250 | 251 | function hexToDigit(s) 252 | { 253 | var result = 0; 254 | var sl = Math.min(s.length, 4); 255 | for (var i = 0; i < sl; ++i) { 256 | result <<= 4; 257 | result |= charToHex(s.charCodeAt(i)) 258 | } 259 | return result; 260 | } 261 | 262 | function biFromHex(s) 263 | { 264 | var result = new BigInt(); 265 | var sl = s.length; 266 | for (var i = sl, j = 0; i > 0; i -= 4, ++j) { 267 | result.digits[j] = hexToDigit(s.substr(Math.max(i - 4, 0), Math.min(i, 4))); 268 | } 269 | return result; 270 | } 271 | 272 | function biFromString(s, radix) 273 | { 274 | var isNeg = s.charAt(0) == '-'; 275 | var istop = isNeg ? 1 : 0; 276 | var result = new BigInt(); 277 | var place = new BigInt(); 278 | place.digits[0] = 1; // radix^0 279 | for (var i = s.length - 1; i >= istop; i--) { 280 | var c = s.charCodeAt(i); 281 | var digit = charToHex(c); 282 | var biDigit = biMultiplyDigit(place, digit); 283 | result = biAdd(result, biDigit); 284 | place = biMultiplyDigit(place, radix); 285 | } 286 | result.isNeg = isNeg; 287 | return result; 288 | } 289 | 290 | function biToBytes(x) 291 | // Returns a string containing raw bytes. 292 | { 293 | var result = ""; 294 | for (var i = biHighIndex(x); i > -1; --i) { 295 | result += digitToBytes(x.digits[i]); 296 | } 297 | return result; 298 | } 299 | 300 | function digitToBytes(n) 301 | // Convert two-byte digit to string containing both bytes. 302 | { 303 | var c1 = String.fromCharCode(n & 0xff); 304 | n >>>= 8; 305 | var c2 = String.fromCharCode(n & 0xff); 306 | return c2 + c1; 307 | } 308 | 309 | function biDump(b) 310 | { 311 | return (b.isNeg ? "-" : "") + b.digits.join(" "); 312 | } 313 | 314 | function biAdd(x, y) 315 | { 316 | var result; 317 | 318 | if (x.isNeg != y.isNeg) { 319 | y.isNeg = !y.isNeg; 320 | result = biSubtract(x, y); 321 | y.isNeg = !y.isNeg; 322 | } 323 | else { 324 | result = new BigInt(); 325 | var c = 0; 326 | var n; 327 | for (var i = 0; i < x.digits.length; ++i) { 328 | n = x.digits[i] + y.digits[i] + c; 329 | result.digits[i] = n & 0xffff; 330 | c = Number(n >= biRadix); 331 | } 332 | result.isNeg = x.isNeg; 333 | } 334 | return result; 335 | } 336 | 337 | function biSubtract(x, y) 338 | { 339 | var result; 340 | if (x.isNeg != y.isNeg) { 341 | y.isNeg = !y.isNeg; 342 | result = biAdd(x, y); 343 | y.isNeg = !y.isNeg; 344 | } else { 345 | result = new BigInt(); 346 | var n, c; 347 | c = 0; 348 | for (var i = 0; i < x.digits.length; ++i) { 349 | n = x.digits[i] - y.digits[i] + c; 350 | result.digits[i] = n & 0xffff; 351 | // Stupid non-conforming modulus operation. 352 | if (result.digits[i] < 0) result.digits[i] += biRadix; 353 | c = 0 - Number(n < 0); 354 | } 355 | // Fix up the negative sign, if any. 356 | if (c == -1) { 357 | c = 0; 358 | for (var i = 0; i < x.digits.length; ++i) { 359 | n = 0 - result.digits[i] + c; 360 | result.digits[i] = n & 0xffff; 361 | // Stupid non-conforming modulus operation. 362 | if (result.digits[i] < 0) result.digits[i] += biRadix; 363 | c = 0 - Number(n < 0); 364 | } 365 | // Result is opposite sign of arguments. 366 | result.isNeg = !x.isNeg; 367 | } else { 368 | // Result is same sign. 369 | result.isNeg = x.isNeg; 370 | } 371 | } 372 | return result; 373 | } 374 | 375 | function biHighIndex(x) 376 | { 377 | var result = x.digits.length - 1; 378 | while (result > 0 && x.digits[result] == 0) --result; 379 | return result; 380 | } 381 | 382 | function biNumBits(x) 383 | { 384 | var n = biHighIndex(x); 385 | var d = x.digits[n]; 386 | var m = (n + 1) * bitsPerDigit; 387 | var result; 388 | for (result = m; result > m - bitsPerDigit; --result) { 389 | if ((d & 0x8000) != 0) break; 390 | d <<= 1; 391 | } 392 | return result; 393 | } 394 | 395 | function biMultiply(x, y) 396 | { 397 | var result = new BigInt(); 398 | var c; 399 | var n = biHighIndex(x); 400 | var t = biHighIndex(y); 401 | var u, uv, k; 402 | 403 | for (var i = 0; i <= t; ++i) { 404 | c = 0; 405 | k = i; 406 | for (j = 0; j <= n; ++j, ++k) { 407 | uv = result.digits[k] + x.digits[j] * y.digits[i] + c; 408 | result.digits[k] = uv & maxDigitVal; 409 | c = uv >>> biRadixBits; 410 | } 411 | result.digits[i + n + 1] = c; 412 | } 413 | // Someone give me a logical xor, please. 414 | result.isNeg = x.isNeg != y.isNeg; 415 | return result; 416 | } 417 | 418 | function biMultiplyDigit(x, y) 419 | { 420 | var n, c, uv; 421 | 422 | result = new BigInt(); 423 | n = biHighIndex(x); 424 | c = 0; 425 | for (var j = 0; j <= n; ++j) { 426 | uv = result.digits[j] + x.digits[j] * y + c; 427 | result.digits[j] = uv & maxDigitVal; 428 | c = uv >>> biRadixBits; 429 | } 430 | result.digits[1 + n] = c; 431 | return result; 432 | } 433 | 434 | function arrayCopy(src, srcStart, dest, destStart, n) 435 | { 436 | var m = Math.min(srcStart + n, src.length); 437 | for (var i = srcStart, j = destStart; i < m; ++i, ++j) { 438 | dest[j] = src[i]; 439 | } 440 | } 441 | 442 | var highBitMasks = new Array(0x0000, 0x8000, 0xC000, 0xE000, 0xF000, 0xF800, 443 | 0xFC00, 0xFE00, 0xFF00, 0xFF80, 0xFFC0, 0xFFE0, 444 | 0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF); 445 | 446 | function biShiftLeft(x, n) 447 | { 448 | var digitCount = Math.floor(n / bitsPerDigit); 449 | var result = new BigInt(); 450 | arrayCopy(x.digits, 0, result.digits, digitCount, 451 | result.digits.length - digitCount); 452 | var bits = n % bitsPerDigit; 453 | var rightBits = bitsPerDigit - bits; 454 | for (var i = result.digits.length - 1, i1 = i - 1; i > 0; --i, --i1) { 455 | result.digits[i] = ((result.digits[i] << bits) & maxDigitVal) | 456 | ((result.digits[i1] & highBitMasks[bits]) >>> 457 | (rightBits)); 458 | } 459 | result.digits[0] = ((result.digits[i] << bits) & maxDigitVal); 460 | result.isNeg = x.isNeg; 461 | return result; 462 | } 463 | 464 | var lowBitMasks = new Array(0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 465 | 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 466 | 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF); 467 | 468 | function biShiftRight(x, n) 469 | { 470 | var digitCount = Math.floor(n / bitsPerDigit); 471 | var result = new BigInt(); 472 | arrayCopy(x.digits, digitCount, result.digits, 0, 473 | x.digits.length - digitCount); 474 | var bits = n % bitsPerDigit; 475 | var leftBits = bitsPerDigit - bits; 476 | for (var i = 0, i1 = i + 1; i < result.digits.length - 1; ++i, ++i1) { 477 | result.digits[i] = (result.digits[i] >>> bits) | 478 | ((result.digits[i1] & lowBitMasks[bits]) << leftBits); 479 | } 480 | result.digits[result.digits.length - 1] >>>= bits; 481 | result.isNeg = x.isNeg; 482 | return result; 483 | } 484 | 485 | function biMultiplyByRadixPower(x, n) 486 | { 487 | var result = new BigInt(); 488 | arrayCopy(x.digits, 0, result.digits, n, result.digits.length - n); 489 | return result; 490 | } 491 | 492 | function biDivideByRadixPower(x, n) 493 | { 494 | var result = new BigInt(); 495 | arrayCopy(x.digits, n, result.digits, 0, result.digits.length - n); 496 | return result; 497 | } 498 | 499 | function biModuloByRadixPower(x, n) 500 | { 501 | var result = new BigInt(); 502 | arrayCopy(x.digits, 0, result.digits, 0, n); 503 | return result; 504 | } 505 | 506 | function biCompare(x, y) 507 | { 508 | if (x.isNeg != y.isNeg) { 509 | return 1 - 2 * Number(x.isNeg); 510 | } 511 | for (var i = x.digits.length - 1; i >= 0; --i) { 512 | if (x.digits[i] != y.digits[i]) { 513 | if (x.isNeg) { 514 | return 1 - 2 * Number(x.digits[i] > y.digits[i]); 515 | } else { 516 | return 1 - 2 * Number(x.digits[i] < y.digits[i]); 517 | } 518 | } 519 | } 520 | return 0; 521 | } 522 | 523 | function biDivideModulo(x, y) 524 | { 525 | var nb = biNumBits(x); 526 | var tb = biNumBits(y); 527 | var origYIsNeg = y.isNeg; 528 | var q, r; 529 | if (nb < tb) { 530 | // |x| < |y| 531 | if (x.isNeg) { 532 | q = biCopy(bigOne); 533 | q.isNeg = !y.isNeg; 534 | x.isNeg = false; 535 | y.isNeg = false; 536 | r = biSubtract(y, x); 537 | // Restore signs, 'cause they're references. 538 | x.isNeg = true; 539 | y.isNeg = origYIsNeg; 540 | } else { 541 | q = new BigInt(); 542 | r = biCopy(x); 543 | } 544 | return new Array(q, r); 545 | } 546 | 547 | q = new BigInt(); 548 | r = x; 549 | 550 | // Normalize Y. 551 | var t = Math.ceil(tb / bitsPerDigit) - 1; 552 | var lambda = 0; 553 | while (y.digits[t] < biHalfRadix) { 554 | y = biShiftLeft(y, 1); 555 | ++lambda; 556 | ++tb; 557 | t = Math.ceil(tb / bitsPerDigit) - 1; 558 | } 559 | // Shift r over to keep the quotient constant. We'll shift the 560 | // remainder back at the end. 561 | r = biShiftLeft(r, lambda); 562 | nb += lambda; // Update the bit count for x. 563 | var n = Math.ceil(nb / bitsPerDigit) - 1; 564 | 565 | var b = biMultiplyByRadixPower(y, n - t); 566 | while (biCompare(r, b) != -1) { 567 | ++q.digits[n - t]; 568 | r = biSubtract(r, b); 569 | } 570 | for (var i = n; i > t; --i) { 571 | var ri = (i >= r.digits.length) ? 0 : r.digits[i]; 572 | var ri1 = (i - 1 >= r.digits.length) ? 0 : r.digits[i - 1]; 573 | var ri2 = (i - 2 >= r.digits.length) ? 0 : r.digits[i - 2]; 574 | var yt = (t >= y.digits.length) ? 0 : y.digits[t]; 575 | var yt1 = (t - 1 >= y.digits.length) ? 0 : y.digits[t - 1]; 576 | if (ri == yt) { 577 | q.digits[i - t - 1] = maxDigitVal; 578 | } else { 579 | q.digits[i - t - 1] = Math.floor((ri * biRadix + ri1) / yt); 580 | } 581 | 582 | var c1 = q.digits[i - t - 1] * ((yt * biRadix) + yt1); 583 | var c2 = (ri * biRadixSquared) + ((ri1 * biRadix) + ri2); 584 | while (c1 > c2) { 585 | --q.digits[i - t - 1]; 586 | c1 = q.digits[i - t - 1] * ((yt * biRadix) | yt1); 587 | c2 = (ri * biRadix * biRadix) + ((ri1 * biRadix) + ri2); 588 | } 589 | 590 | b = biMultiplyByRadixPower(y, i - t - 1); 591 | r = biSubtract(r, biMultiplyDigit(b, q.digits[i - t - 1])); 592 | if (r.isNeg) { 593 | r = biAdd(r, b); 594 | --q.digits[i - t - 1]; 595 | } 596 | } 597 | r = biShiftRight(r, lambda); 598 | // Fiddle with the signs and stuff to make sure that 0 <= r < y. 599 | q.isNeg = x.isNeg != origYIsNeg; 600 | if (x.isNeg) { 601 | if (origYIsNeg) { 602 | q = biAdd(q, bigOne); 603 | } else { 604 | q = biSubtract(q, bigOne); 605 | } 606 | y = biShiftRight(y, lambda); 607 | r = biSubtract(y, r); 608 | } 609 | // Check for the unbelievably stupid degenerate case of r == -0. 610 | if (r.digits[0] == 0 && biHighIndex(r) == 0) r.isNeg = false; 611 | 612 | return new Array(q, r); 613 | } 614 | 615 | function biDivide(x, y) 616 | { 617 | return biDivideModulo(x, y)[0]; 618 | } 619 | 620 | function biModulo(x, y) 621 | { 622 | return biDivideModulo(x, y)[1]; 623 | } 624 | 625 | function biMultiplyMod(x, y, m) 626 | { 627 | return biModulo(biMultiply(x, y), m); 628 | } 629 | 630 | function biPow(x, y) 631 | { 632 | var result = bigOne; 633 | var a = x; 634 | while (true) { 635 | if ((y & 1) != 0) result = biMultiply(result, a); 636 | y >>= 1; 637 | if (y == 0) break; 638 | a = biMultiply(a, a); 639 | } 640 | return result; 641 | } 642 | 643 | function biPowMod(x, y, m) 644 | { 645 | var result = bigOne; 646 | var a = x; 647 | var k = y; 648 | while (true) { 649 | if ((k.digits[0] & 1) != 0) result = biMultiplyMod(result, a, m); 650 | k = biShiftRight(k, 1); 651 | if (k.digits[0] == 0 && biHighIndex(k) == 0) break; 652 | a = biMultiplyMod(a, a, m); 653 | } 654 | return result; 655 | } 656 | 657 | 658 | var RSAAPP={};RSAAPP.NoPadding="NoPadding";RSAAPP.PKCS1Padding="PKCS1Padding";RSAAPP.RawEncoding="RawEncoding";RSAAPP.NumericEncoding="NumericEncoding" 659 | function RSAKeyPair(encryptionExponent,decryptionExponent,modulus,keylen) 660 | {this.e=biFromHex(encryptionExponent);this.d=biFromHex(decryptionExponent);this.m=biFromHex(modulus);if(typeof(keylen)!='number'){this.chunkSize=2*biHighIndex(this.m);} 661 | else{this.chunkSize=keylen/8;} 662 | this.radix=16;this.barrett=new BarrettMu(this.m);} 663 | function encryptedString(key,s,pad,encoding) 664 | {var a=new Array();var sl=s.length;var i,j,k;var padtype;var encodingtype;var rpad;var al;var result="";var block;var crypt;var text;if(typeof(pad)=='string'){if(pad==RSAAPP.NoPadding){padtype=1;} 665 | else if(pad==RSAAPP.PKCS1Padding){padtype=2;} 666 | else{padtype=0;}} 667 | else{padtype=0;} 668 | if(typeof(encoding)=='string'&&encoding==RSAAPP.RawEncoding){encodingtype=1;} 669 | else{encodingtype=0;} 670 | if(padtype==1){if(sl>key.chunkSize){sl=key.chunkSize;}} 671 | else if(padtype==2){if(sl>(key.chunkSize-11)){sl=key.chunkSize-11;}} 672 | i=0;if(padtype==2){j=sl-1;} 673 | else{j=key.chunkSize-1;} 674 | while(i0){if(padtype==2){rpad=Math.floor(Math.random()*256);while(!rpad){rpad=Math.floor(Math.random()*256);} 679 | a[i]=rpad;} 680 | else{a[i]=0;} 681 | i++;j--;} 682 | if(padtype==2) 683 | {a[sl]=0;a[key.chunkSize-2]=2;a[key.chunkSize-1]=0;} 684 | al=a.length;for(i=0;i>8);}} 693 | if(result.charCodeAt(result.length-1)==0){result=result.substring(0,result.length-1);} 694 | return(result);} 695 | 696 | 697 | -------------------------------------------------------------------------------- /RSA/RSA.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2015 Eric Wilde. 3 | * Copyright 1998-2015 David Shapiro. 4 | * 5 | * RSA.js is a suite of routines for performing RSA public-key computations 6 | * in JavaScript. The cryptographic functions herein are used for encoding 7 | * and decoding strings to be sent over unsecure channels. 8 | * 9 | * To use these routines, a pair of public/private keys is created through a 10 | * number of means (OpenSSL tools on Linux/Unix, Dave Shapiro's 11 | * RSAKeyGenerator program on Windows). These keys are passed to RSAKeyPair 12 | * as hexadecimal strings to create an encryption key object. This key object 13 | * is then used with encryptedString to encrypt blocks of plaintext using the 14 | * public key. The resulting cyphertext blocks can be decrypted with 15 | * decryptedString. 16 | * 17 | * Note that the cryptographic functions herein are complementary to those 18 | * found in CryptoFuncs.php and CryptoFuncs.pm. Hence, encrypted messages may 19 | * be sent between programs written in any of those languages. The most 20 | * useful, of course is to send messages encrypted by a Web page using RSA.js 21 | * to a PHP or Perl script running on a Web servitron. 22 | * 23 | * Also, the optional padding flag may be specified on the call to 24 | * encryptedString, in which case blocks of cyphertext that are compatible 25 | * with real crypto libraries such as OpenSSL or Microsoft will be created. 26 | * These blocks of cyphertext can then be sent to Web servitron that uses one 27 | * of these crypto libraries for decryption. This allows messages encrypted 28 | * with longer keys to be decrypted quickly on the Web server as well as 29 | * making for more secure communications when a padding algorithm such as 30 | * PKCS1v1.5 is used. 31 | * 32 | * These routines require BigInt.js and Barrett.js. 33 | */ 34 | 35 | /*****************************************************************************/ 36 | 37 | /* 38 | * Modifications 39 | * ------------- 40 | * 41 | * 2014 Jan 11 E. Wilde Add optional padding flag to encryptedString 42 | * for compatibility with real crypto libraries 43 | * such as OpenSSL or Microsoft. Add PKCS1v1.5 44 | * padding. 45 | * 46 | * 2015 Jan 5 D. Shapiro Add optional encoding flag for encryptedString 47 | * and encapsulate padding and encoding constants 48 | * in RSAAPP object. 49 | * 50 | * Original Code 51 | * ------------- 52 | * 53 | * Copyright 1998-2005 David Shapiro. 54 | * 55 | * You may use, re-use, abuse, copy, and modify this code to your liking, but 56 | * please keep this header. 57 | * 58 | * Thanks! 59 | * 60 | * Dave Shapiro 61 | * dave@ohdave.com 62 | */ 63 | 64 | /*****************************************************************************/ 65 | 66 | var RSAAPP = {}; 67 | 68 | RSAAPP.NoPadding = "NoPadding"; 69 | RSAAPP.PKCS1Padding = "PKCS1Padding"; 70 | RSAAPP.RawEncoding = "RawEncoding"; 71 | RSAAPP.NumericEncoding = "NumericEncoding" 72 | 73 | /*****************************************************************************/ 74 | 75 | function RSAKeyPair(encryptionExponent, decryptionExponent, modulus, keylen) 76 | /* 77 | * encryptionExponent The encryption exponent (i.e. public 78 | * encryption key) to be used for 79 | * encrypting messages. If you aren't 80 | * doing any encrypting, a dummy 81 | * exponent such as "10001" can be 82 | * passed. 83 | * 84 | * decryptionExponent The decryption exponent (i.e. private 85 | * decryption key) to be used for 86 | * decrypting messages. If you aren't 87 | * doing any decrypting, a dummy 88 | * exponent such as "10001" can be 89 | * passed. 90 | * 91 | * modulus The modulus to be used both for 92 | * encrypting and decrypting messages. 93 | * 94 | * keylen The optional length of the key, in 95 | * bits. If omitted, RSAKeyPair will 96 | * attempt to derive a key length (but, 97 | * see the notes below). 98 | * 99 | * returns The "new" object creator returns an 100 | * instance of a key object that can be 101 | * used to encrypt/decrypt messages. 102 | * 103 | * This routine is invoked as the first step in the encryption or decryption 104 | * process to take the three numbers (expressed as hexadecimal strings) that 105 | * are used for RSA asymmetric encryption/decryption and turn them into a key 106 | * object that can be used for encrypting and decrypting. 107 | * 108 | * The key object is created thusly: 109 | * 110 | * RSAKey = new RSAKeyPair("ABC12345", 10001, "987654FE"); 111 | * 112 | * or: 113 | * 114 | * RSAKey = new RSAKeyPair("ABC12345", 10001, "987654FE", 64); 115 | * 116 | * Note that RSAKeyPair will try to derive the length of the key that is being 117 | * used, from the key itself. The key length is especially useful when one of 118 | * the padding options is used and/or when the encrypted messages created by 119 | * the routine encryptedString are exchanged with a real crypto library such 120 | * as OpenSSL or Microsoft, as it determines how many padding characters are 121 | * appended. 122 | * 123 | * Usually, RSAKeyPair can determine the key length from the modulus of the 124 | * key but this doesn't always work properly, depending on the actual value of 125 | * the modulus. If you are exchanging messages with a real crypto library, 126 | * such as OpenSSL or Microsoft, that depends on the fact that the blocks 127 | * being passed to it are properly padded, you'll want the key length to be 128 | * set properly. If that's the case, of if you just want to be sure, you 129 | * should specify the key length that you used to generated the key, in bits 130 | * when this routine is invoked. 131 | */ 132 | { 133 | /* 134 | * Convert from hexadecimal and save the encryption/decryption exponents and 135 | * modulus as big integers in the key object. 136 | */ 137 | this.e = biFromHex(encryptionExponent); 138 | this.d = biFromHex(decryptionExponent); 139 | this.m = biFromHex(modulus); 140 | /* 141 | * Using big integers, we can represent two bytes per element in the big 142 | * integer array, so we calculate the chunk size as: 143 | * 144 | * chunkSize = 2 * (number of digits in modulus - 1) 145 | * 146 | * Since biHighIndex returns the high index, not the number of digits, the 147 | * number 1 has already been subtracted from its answer. 148 | * 149 | * However, having said all this, "User Knows Best". If our caller passes us 150 | * a key length (in bits), we'll treat it as gospel truth. 151 | */ 152 | if (typeof(keylen) != 'number') { this.chunkSize = 2 * biHighIndex(this.m); } 153 | else { this.chunkSize = keylen / 8; } 154 | 155 | this.radix = 16; 156 | /* 157 | * Precalculate the stuff used for Barrett modular reductions. 158 | */ 159 | this.barrett = new BarrettMu(this.m); 160 | } 161 | 162 | /*****************************************************************************/ 163 | 164 | function encryptedString(key, s, pad, encoding) 165 | /* 166 | * key The previously-built RSA key whose 167 | * public key component is to be used to 168 | * encrypt the plaintext string. 169 | * 170 | * s The plaintext string that is to be 171 | * encrypted, using the RSA assymmetric 172 | * encryption method. 173 | * 174 | * pad The optional padding method to use 175 | * when extending the plaintext to the 176 | * full chunk size required by the RSA 177 | * algorithm. To maintain compatibility 178 | * with other crypto libraries, the 179 | * padding method is described by a 180 | * string. The default, if not 181 | * specified is "OHDave". Here are the 182 | * choices: 183 | * 184 | * OHDave - this is the original 185 | * padding method employed by Dave 186 | * Shapiro and Rob Saunders. If 187 | * this method is chosen, the 188 | * plaintext can be of any length. 189 | * It will be padded to the correct 190 | * length with zeros and then broken 191 | * up into chunks of the correct 192 | * length before being encrypted. 193 | * The resultant cyphertext blocks 194 | * will be separated by blanks. 195 | * 196 | * Note that the original code by 197 | * Dave Shapiro reverses the byte 198 | * order to little-endian, as the 199 | * plaintext is encrypted. If 200 | * either these JavaScript routines 201 | * or one of the complementary 202 | * PHP/Perl routines derived from 203 | * this code is used for decryption, 204 | * the byte order will be reversed 205 | * again upon decryption so as to 206 | * come out correctly. 207 | * 208 | * Also note that this padding 209 | * method is claimed to be less 210 | * secure than PKCS1Padding. 211 | * 212 | * NoPadding - this method truncates 213 | * the plaintext to the length of 214 | * the RSA key, if it is longer. If 215 | * its length is shorter, it is 216 | * padded with zeros. In either 217 | * case, the plaintext string is 218 | * reversed to preserve big-endian 219 | * order before it is encrypted to 220 | * maintain compatibility with real 221 | * crypto libraries such as OpenSSL 222 | * or Microsoft. When the 223 | * cyphertext is to be decrypted 224 | * by a crypto library, the 225 | * library routine's RSAAPP.NoPadding 226 | * flag, or its equivalent, should 227 | * be used. 228 | * 229 | * Note that this padding method is 230 | * claimed to be less secure than 231 | * PKCS1Padding. 232 | * 233 | * PKCS1Padding - the PKCS1v1.5 234 | * padding method (as described in 235 | * RFC 2313) is employed to pad the 236 | * plaintext string. The plaintext 237 | * string must be no longer than the 238 | * length of the RSA key minus 11, 239 | * since PKCS1v1.5 requires 3 bytes 240 | * of overhead and specifies a 241 | * minimum pad of 8 bytes. The 242 | * plaintext string is padded with 243 | * randomly-generated bytes and then 244 | * its order is reversed to preserve 245 | * big-endian order before it is 246 | * encrypted to maintain 247 | * compatibility with real crypto 248 | * libraries such as OpenSSL or 249 | * Microsoft. When the cyphertext 250 | * is to be decrypted by a crypto 251 | * library, the library routine's 252 | * RSAAPP.PKCS1Padding flag, or its 253 | * equivalent, should be used. 254 | * 255 | * encoding The optional encoding scheme to use 256 | * for the return value. If ommitted, 257 | * numeric encoding will be used. 258 | * 259 | * RawEncoding - The return value 260 | * is given as its raw value. 261 | * This is the easiest method when 262 | * interoperating with server-side 263 | * OpenSSL, as no additional conversion 264 | * is required. Use the constant 265 | * RSAAPP.RawEncoding for this option. 266 | * 267 | * NumericEncoding - The return value 268 | * is given as a number in hexadecimal. 269 | * Perhaps useful for debugging, but 270 | * will need to be translated back to 271 | * its raw equivalent (e.g. using 272 | * PHP's hex2bin) before using with 273 | * OpenSSL. Use the constant 274 | * RSAAPP.NumericEncoding for this option. 275 | * 276 | * returns The cyphertext block that results 277 | * from encrypting the plaintext string 278 | * s with the RSA key. 279 | * 280 | * This routine accepts a plaintext string that is to be encrypted with the 281 | * public key component of the previously-built RSA key using the RSA 282 | * assymmetric encryption method. Before it is encrypted, the plaintext 283 | * string is padded to the same length as the encryption key for proper 284 | * encryption. 285 | * 286 | * Depending on the padding method chosen, an optional header with block type 287 | * is prepended, the plaintext is padded using zeros or randomly-generated 288 | * bytes, and then the plaintext is possibly broken up into chunks. 289 | * 290 | * Note that, for padding with zeros, this routine was altered by Rob Saunders 291 | * (rob@robsaunders.net). The new routine pads the string after it has been 292 | * converted to an array. This fixes an incompatibility with Flash MX's 293 | * ActionScript. 294 | * 295 | * The various padding schemes employed by this routine, and as presented to 296 | * RSA for encryption, are shown below. Note that the RSA encryption done 297 | * herein reverses the byte order as encryption is done: 298 | * 299 | * Plaintext In 300 | * ------------ 301 | * 302 | * d5 d4 d3 d2 d1 d0 303 | * 304 | * OHDave 305 | * ------ 306 | * 307 | * d5 d4 d3 d2 d1 d0 00 00 00 /.../ 00 00 00 00 00 00 00 00 308 | * 309 | * NoPadding 310 | * --------- 311 | * 312 | * 00 00 00 00 00 00 00 00 00 /.../ 00 00 d0 d1 d2 d3 d4 d5 313 | * 314 | * PKCS1Padding 315 | * ------------ 316 | * 317 | * d0 d1 d2 d3 d4 d5 00 p0 p1 /.../ p2 p3 p4 p5 p6 p7 02 00 318 | * \------------ ------------/ 319 | * \/ 320 | * Minimum 8 bytes pad length 321 | */ 322 | { 323 | var a = new Array(); // The usual Alice and Bob stuff 324 | var sl = s.length; // Plaintext string length 325 | var i, j, k; // The usual Fortran index stuff 326 | var padtype; // Type of padding to do 327 | var encodingtype; // Type of output encoding 328 | var rpad; // Random pad 329 | var al; // Array length 330 | var result = ""; // Cypthertext result 331 | var block; // Big integer block to encrypt 332 | var crypt; // Big integer result 333 | var text; // Text result 334 | /* 335 | * Figure out the padding type. 336 | */ 337 | if (typeof(pad) == 'string') { 338 | if (pad == RSAAPP.NoPadding) { padtype = 1; } 339 | else if (pad == RSAAPP.PKCS1Padding) { padtype = 2; } 340 | else { padtype = 0; } 341 | } 342 | else { padtype = 0; } 343 | /* 344 | * Determine encoding type. 345 | */ 346 | if (typeof(encoding) == 'string' && encoding == RSAAPP.RawEncoding) { 347 | encodingtype = 1; 348 | } 349 | else { encodingtype = 0; } 350 | 351 | /* 352 | * If we're not using Dave's padding method, we need to truncate long 353 | * plaintext blocks to the correct length for the padding method used: 354 | * 355 | * NoPadding - key length 356 | * PKCS1Padding - key length - 11 357 | */ 358 | if (padtype == 1) { 359 | if (sl > key.chunkSize) { sl = key.chunkSize; } 360 | } 361 | else if (padtype == 2) { 362 | if (sl > (key.chunkSize-11)) { sl = key.chunkSize - 11; } 363 | } 364 | /* 365 | * Convert the plaintext string to an array of characters so that we can work 366 | * with individual characters. 367 | * 368 | * Note that, if we're talking to a real crypto library at the other end, we 369 | * reverse the plaintext order to preserve big-endian order. 370 | */ 371 | i = 0; 372 | 373 | if (padtype == 2) { j = sl - 1; } 374 | else { j = key.chunkSize - 1; } 375 | 376 | while (i < sl) { 377 | if (padtype) { a[j] = s.charCodeAt(i); } 378 | else { a[i] = s.charCodeAt(i); } 379 | 380 | i++; j--; 381 | } 382 | /* 383 | * Now is the time to add the padding. 384 | * 385 | * If we're doing PKCS1v1.5 padding, we pick up padding where we left off and 386 | * pad the remainder of the block. Otherwise, we pad at the front of the 387 | * block. This gives us the correct padding for big-endian blocks. 388 | * 389 | * The padding is either a zero byte or a randomly-generated non-zero byte. 390 | */ 391 | if (padtype == 1) { i = 0; } 392 | 393 | j = key.chunkSize - (sl % key.chunkSize); 394 | 395 | while (j > 0) { 396 | if (padtype == 2) { 397 | rpad = Math.floor(Math.random() * 256); 398 | 399 | while (!rpad) { rpad = Math.floor(Math.random() * 256); } 400 | 401 | a[i] = rpad; 402 | } 403 | else { a[i] = 0; } 404 | 405 | i++; j--; 406 | } 407 | /* 408 | * For PKCS1v1.5 padding, we need to fill in the block header. 409 | * 410 | * According to RFC 2313, a block type, a padding string, and the data shall 411 | * be formatted into the encryption block: 412 | * 413 | * EncrBlock = 00 || BlockType || PadString || 00 || Data 414 | * 415 | * The block type shall be a single octet indicating the structure of the 416 | * encryption block. For this version of the document it shall have value 00, 417 | * 01, or 02. For a private-key operation, the block type shall be 00 or 01. 418 | * For a public-key operation, it shall be 02. 419 | * 420 | * The padding string shall consist of enough octets to pad the encryption 421 | * block to the length of the encryption key. For block type 00, the octets 422 | * shall have value 00; for block type 01, they shall have value FF; and for 423 | * block type 02, they shall be pseudorandomly generated and nonzero. 424 | * 425 | * Note that in a previous step, we wrote padding bytes into the first three 426 | * bytes of the encryption block because it was simpler to do so. We now 427 | * overwrite them. 428 | */ 429 | if (padtype == 2) 430 | { 431 | a[sl] = 0; 432 | a[key.chunkSize-2] = 2; 433 | a[key.chunkSize-1] = 0; 434 | } 435 | /* 436 | * Carve up the plaintext and encrypt each of the resultant blocks. 437 | */ 438 | al = a.length; 439 | 440 | for (i = 0; i < al; i += key.chunkSize) { 441 | /* 442 | * Get a block. 443 | */ 444 | block = new BigInt(); 445 | 446 | j = 0; 447 | 448 | for (k = i; k < (i+key.chunkSize); ++j) { 449 | block.digits[j] = a[k++]; 450 | block.digits[j] += a[k++] << 8; 451 | } 452 | /* 453 | * Encrypt it, convert it to text, and append it to the result. 454 | */ 455 | crypt = key.barrett.powMod(block, key.e); 456 | if (encodingtype == 1) { 457 | text = biToBytes(crypt); 458 | } 459 | else { 460 | text = (key.radix == 16) ? biToHex(crypt) : biToString(crypt, key.radix); 461 | } 462 | result += text; 463 | } 464 | /* 465 | * Return the result, removing the last space. 466 | */ 467 | //result = (result.substring(0, result.length - 1)); 468 | return result; 469 | } 470 | 471 | /*****************************************************************************/ 472 | 473 | function decryptedString(key, c) 474 | /* 475 | * key The previously-built RSA key whose 476 | * private key component is to be used 477 | * to decrypt the cyphertext string. 478 | * 479 | * c The cyphertext string that is to be 480 | * decrypted, using the RSA assymmetric 481 | * encryption method. 482 | * 483 | * returns The plaintext block that results from 484 | * decrypting the cyphertext string c 485 | * with the RSA key. 486 | * 487 | * This routine is the complementary decryption routine that is meant to be 488 | * used for JavaScript decryption of cyphertext blocks that were encrypted 489 | * using the OHDave padding method of the encryptedString routine (in this 490 | * module). It can also decrypt cyphertext blocks that were encrypted by 491 | * RSAEncode (in CryptoFuncs.pm or CryptoFuncs.php) so that encrypted 492 | * messages can be sent of insecure links (e.g. HTTP) to a Web page. 493 | * 494 | * It accepts a cyphertext string that is to be decrypted with the public key 495 | * component of the previously-built RSA key using the RSA assymmetric 496 | * encryption method. Multiple cyphertext blocks are broken apart, if they 497 | * are found in c, and each block is decrypted. All of the decrypted blocks 498 | * are concatenated back together to obtain the original plaintext string. 499 | * 500 | * This routine assumes that the plaintext was padded to the same length as 501 | * the encryption key with zeros. Therefore, it removes any zero bytes that 502 | * are found at the end of the last decrypted block, before it is appended to 503 | * the decrypted plaintext string. 504 | * 505 | * Note that the encryptedString routine (in this module) works fairly quickly 506 | * simply by virtue of the fact that the public key most often chosen is quite 507 | * short (e.g. 0x10001). This routine does not have that luxury. The 508 | * decryption key that it must employ is the full key length. For long keys, 509 | * this can result in serious timing delays (e.g. 7-8 seconds to decrypt using 510 | * 2048 bit keys on a reasonably fast machine, under the Firefox Web browser). 511 | * 512 | * If you intend to send encrypted messagess to a JavaScript program running 513 | * under a Web browser, you might consider using shorter keys to keep the 514 | * decryption times low. Alternately, a better scheme is to generate a random 515 | * key for use by a symmetric encryption algorithm and transmit it to the 516 | * other end, after encrypting it with encryptedString. The other end can use 517 | * a real crypto library (e.g. OpenSSL or Microsoft) to decrypt the key and 518 | * then use it to encrypt all of the messages (with a symmetric encryption 519 | * algorithm such as Twofish or AES) bound for the JavaScript program. 520 | * Symmetric decryption is orders of magnitude faster than asymmetric and 521 | * should yield low decryption times, even when executed in JavaScript. 522 | * 523 | * Also note that only the OHDave padding method (e.g. zeros) is supported by 524 | * this routine *AND* that this routine expects little-endian cyphertext, as 525 | * created by the encryptedString routine (in this module) or the RSAEncode 526 | * routine (in either CryptoFuncs.pm or CryptoFuncs.php). You can use one of 527 | * the real crypto libraries to create cyphertext that can be decrypted by 528 | * this routine, if you reverse the plaintext byte order first and then 529 | * manually pad it with zero bytes. The plaintext should then be encrypted 530 | * with the NoPadding flag or its equivalent in the crypto library of your 531 | * choice. 532 | */ 533 | { 534 | var blocks = c.split(" "); // Multiple blocks of cyphertext 535 | var b; // The usual Alice and Bob stuff 536 | var i, j; // The usual Fortran index stuff 537 | var bi; // Cyphertext as a big integer 538 | var result = ""; // Plaintext result 539 | /* 540 | * Carve up the cyphertext into blocks. 541 | */ 542 | for (i = 0; i < blocks.length; ++i) { 543 | /* 544 | * Depending on the radix being used for the key, convert this cyphertext 545 | * block into a big integer. 546 | */ 547 | if (key.radix == 16) { bi = biFromHex(blocks[i]); } 548 | else { bi = biFromString(blocks[i], key.radix); } 549 | /* 550 | * Decrypt the cyphertext. 551 | */ 552 | b = key.barrett.powMod(bi, key.d); 553 | /* 554 | * Convert the decrypted big integer back to the plaintext string. Since 555 | * we are using big integers, each element thereof represents two bytes of 556 | * plaintext. 557 | */ 558 | for (j = 0; j <= biHighIndex(b); ++j) { 559 | result += String.fromCharCode(b.digits[j] & 255, b.digits[j] >> 8); 560 | } 561 | } 562 | /* 563 | * Remove trailing null, if any. 564 | */ 565 | if (result.charCodeAt(result.length - 1) == 0) { 566 | result = result.substring(0, result.length - 1); 567 | } 568 | /* 569 | * Return the plaintext. 570 | */ 571 | return (result); 572 | } 573 | --------------------------------------------------------------------------------