|
@@ -1,75 +1,66 @@
|
|
-var crypto = require('crypto');
|
|
|
|
-var bigInt = require('big-integer');
|
|
|
|
|
|
+// 参考 https://github.com/darknessomi/musicbox/wiki/
|
|
|
|
+'use strict'
|
|
|
|
+const crypto = require('crypto')
|
|
|
|
+const bigInt = require('big-integer')
|
|
|
|
+const modulus = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
|
|
|
|
+const nonce = '0CoJUm6Qyw8W8jud'
|
|
|
|
+const pubKey = '010001'
|
|
|
|
|
|
-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';
|
|
|
|
|
|
+String.prototype.hexEncode = function() {
|
|
|
|
+ let hex, i
|
|
|
|
+
|
|
|
|
+ let result = ""
|
|
|
|
+ for (i = 0; i < this.length; i++) {
|
|
|
|
+ hex = this.charCodeAt(i).toString(16)
|
|
|
|
+ result += ("" + hex).slice(-4)
|
|
}
|
|
}
|
|
- return prefix + encText;
|
|
|
|
|
|
+ return result
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+function createSecretKey(size) {
|
|
|
|
+ const keys = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
|
|
|
+ let key = ""
|
|
|
|
+ for (let i = 0; i < size; i++) {
|
|
|
|
+ let pos = Math.random() * keys.length
|
|
|
|
+ pos = Math.floor(pos)
|
|
|
|
+ key = key + keys.charAt(pos)
|
|
|
|
+ }
|
|
|
|
+ return key
|
|
|
|
+}
|
|
|
|
|
|
function aesEncrypt(text, secKey) {
|
|
function aesEncrypt(text, secKey) {
|
|
- var cipher = crypto.createCipheriv('AES-128-CBC', secKey, '0102030405060708');
|
|
|
|
- return cipher.update(text, 'utf-8', 'base64') + cipher.final('base64');
|
|
|
|
|
|
+ const _text = text
|
|
|
|
+ const lv = new Buffer('0102030405060708', "binary")
|
|
|
|
+ const _secKey = new Buffer(secKey, "binary")
|
|
|
|
+ const cipher = crypto.createCipheriv('AES-128-CBC', _secKey, lv)
|
|
|
|
+ let encrypted = cipher.update(_text, 'utf8', 'base64')
|
|
|
|
+ encrypted += cipher.final('base64')
|
|
|
|
+ return encrypted
|
|
}
|
|
}
|
|
|
|
|
|
-/**
|
|
|
|
- * 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 zfill(str, size) {
|
|
|
|
+ while (str.length < size) str = "0" + str
|
|
|
|
+ return str
|
|
}
|
|
}
|
|
|
|
|
|
-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;
|
|
|
|
|
|
+function rsaEncrypt(text, pubKey, modulus) {
|
|
|
|
+ const _text = text.split('').reverse().join('')
|
|
|
|
+ const biText = bigInt(new Buffer(_text).toString('hex'), 16),
|
|
|
|
+ biEx = bigInt(pubKey, 16),
|
|
|
|
+ biMod = bigInt(modulus, 16),
|
|
|
|
+ biRet = biText.modPow(biEx, biMod)
|
|
|
|
+ return zfill(biRet.toString(16), 256)
|
|
}
|
|
}
|
|
-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, '-');
|
|
|
|
|
|
+
|
|
|
|
+function Encrypt(obj) {
|
|
|
|
+ const text = JSON.stringify(obj)
|
|
|
|
+ const secKey = createSecretKey(16)
|
|
|
|
+ const encText = aesEncrypt(aesEncrypt(text, nonce), secKey)
|
|
|
|
+ const encSecKey = rsaEncrypt(secKey, pubKey, modulus)
|
|
|
|
+ return {
|
|
|
|
+ params: encText,
|
|
|
|
+ encSecKey: encSecKey
|
|
}
|
|
}
|
|
|
|
+}
|
|
|
|
|
|
-};
|
|
|
|
-module.exports = Crypto;
|
|
|
|
|
|
+module.exports = Encrypt
|