Dotos 8 år sedan
förälder
incheckning
85c3cb7cdd
3 ändrade filer med 78 tillägg och 19 borttagningar
  1. 1 0
      package.json
  2. 2 19
      routes/test.js
  3. 75 0
      utils/Crypto.js

+ 1 - 0
package.json

@@ -28,6 +28,7 @@
   "readme": "./readme.md",
   "homepage": "https://github.com/xCss/JsonBird#readme",
   "dependencies": {
+    "big-integer": "^1.6.17",
     "blueimp-md5": "^2.7.0",
     "body-parser": "~1.15.1",
     "cookie-parser": "~1.4.3",

+ 2 - 19
routes/test.js

@@ -1,12 +1,12 @@
 var express = require('express');
 var request = require('superagent');
 var router = express.Router();
-var crypto = require('crypto');
+var crypto = require('../utils/Crypto');
 /* GET test page. */
 router.get('/', function(req, res, next) {
     var id = req.query.id || '';
     if (id) {
-        var sid = encrypted_id(id);
+        var sid = crypto.encrypted_id(id);
         var k = 'http://m2.music.126.net/' + sid + '/' + id + '.mp3'
         res.send({
             link: k
@@ -16,22 +16,5 @@ router.get('/', function(req, res, next) {
     }
 });
 
-function encrypted_id(id) {
-    var res = {
-        id: id
-    };
-    var magic = Buffer.from('3go8&$8*3*3h0k(2)2', 'ascii');
-    var len = magic.length;
-    var sid = Buffer.from(id, 'ascii');
-    for (var i in sid) {
-        sid[i] = sid[i] ^ magic[i % len];
-    }
-    var m = crypto.createHash('md5');
-    sid = m.update(sid).digest();
-    res['md5'] = sid;
-    var result = sid.toString('base64');
-    result = result.replace(/\//g, '_').replace(/\+/g, '-')
-    return result;
-}
 
 module.exports = router;

+ 75 - 0
utils/Crypto.js

@@ -0,0 +1,75 @@
+var crypto = require('crypto');
+var bigInt = require('big-integer');
+
+function addPadding(encText, modulus) {
+    var ml = modulus.length;
+    for (i = 0; ml > 0 && modulus[i] == '0'; i++) ml--;
+    var num = ml - encText.length,
+        prefix = '';
+    for (var i = 0; i < num; i++) {
+        prefix += '0';
+    }
+    return prefix + encText;
+}
+
+
+function aesEncrypt(text, secKey) {
+    var cipher = crypto.createCipheriv('AES-128-CBC', secKey, '0102030405060708');
+    return cipher.update(text, 'utf-8', 'base64') + cipher.final('base64');
+}
+
+/**
+ * RSA Encryption algorithm.
+ * @param text {string} - raw data to encrypt
+ * @param exponent {string} - public exponent
+ * @param modulus {string} - modulus
+ * @returns {string} - encrypted data: reverseText^pubKey%modulus
+ */
+function rsaEncrypt(text, exponent, modulus) {
+    var rText = '',
+        radix = 16;
+    for (var i = text.length - 1; i >= 0; i--) rText += text[i]; //reverse text
+    var biText = bigInt(new Buffer(rText).toString('hex'), radix),
+        biEx = bigInt(exponent, radix),
+        biMod = bigInt(modulus, radix),
+        biRet = biText.modPow(biEx, biMod);
+    return addPadding(biRet.toString(radix), modulus);
+}
+
+function createSecretKey(size) {
+    var keys = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+    var key = "";
+    for (var i = 0; i < size; i++) {
+        var pos = Math.random() * keys.length;
+        pos = Math.floor(pos);
+        key = key + keys.charAt(pos)
+    }
+    return key;
+}
+var modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7';
+var nonce = '0CoJUm6Qyw8W8jud';
+var pubKey = '010001';
+var Crypto = {
+    MD5: function(text) {
+        return crypto.createHash('md5').update(text).digest('hex');
+    },
+    aesRsaEncrypt: function(text) {
+        var secKey = createSecretKey(16);
+        return {
+            params: aesEncrypt(aesEncrypt(text, nonce), secKey),
+            encSecKey: rsaEncrypt(secKey, pubKey, modulus)
+        }
+    },
+    encrypted_id: function(id) {
+        var magic = Buffer.from('3go8&$8*3*3h0k(2)2', 'ascii');
+        var len = magic.length;
+        var sid = Buffer.from(id, 'ascii');
+        for (var i in sid) {
+            sid[i] = sid[i] ^ magic[i % len];
+        }
+        sid = crypto.createHash('md5').update(sid).digest();
+        return sid.toString('base64').replace(/\//g, '_').replace(/\+/g, '-');
+    }
+
+};
+module.exports = Crypto;