2016-07-08 25 views
1

Request zu api von mega.nz, Parse-URL für den privaten Schlüssel des Ordners, und versuchen, Namen von Dateien von Responde der Anfrage zu entschlüsseln, durch Krypto von Nodejs.erhalten Namen Dateien eines Mega.nz-Ordners in Nodejs

Mein Code:

const crypto = require('crypto') 
const parse = require('url').parse 
const request = require('request') 

const link = 'https://mega.nz/#F!gE5WkDpS!Yh6AQtYHPgi-rEkir_gAEw' 
const api = 'https://eu.api.mega.co.nz/cs?id=-1771463320&n=MBwjmCqR' 

function d64 (s) { 
    s += '=='.substr((2 - s.length * 3) & 3) 
    s = s.replace(/-/g, '+').replace(/_/g, '/').replace(/,/g, '') 
    return new Buffer(s, 'base64') 
} 

function from256to128 (s) { 
    var o = new Buffer(16) 
    for (var i = 0; i < 16; i++) { 
    o[i] = s[i]^s[i + 16] 
    } 
    return o 
} 

function decodeName (at) { 
    var end = at.length 
    while (!at.readUInt8(end - 1)) end-- 
    return at.slice(0, end).toString() 
} 

const url = parse(link) 
const split = url.hash.split('!') 
const k0 = d64(split[2]) 

request({ 
    method: 'POST', uri: api, body: '[{"a":"f","c":1,"r":1,"ca":1}]' 
}, (e, r, b) => { 
    if (!e && r.statusCode === 200) { 
    for (let file of JSON.parse(b)[0].f) { 
     if (file.t === 1) { 
     let k = d64(file.k.split(':')[1]) 
     let a = d64(file.a) 
     let aes = crypto.createDecipheriv('aes-128-ecb', k0, Buffer(0)) 
     aes.setAutoPadding(false) 
     let kdec = aes.update(k) 
     aes = crypto.createDecipheriv('aes-128-cbc', kdec, Buffer(16)) 
     aes.setAutoPadding(false) 
     let name = decodeName(aes.update(a)) 
     console.log(name) 
     } else { 
     let k = d64(file.k.split(':')[1]) 
     let a = d64(file.a) 
     let aes = crypto.createDecipheriv('aes-128-ecb', k0, Buffer(0)) 
     aes.setAutoPadding(false) 
     let k2dec = from256to128(aes.update(k)) 
     aes = crypto.createDecipheriv('aes-128-cbc', k2dec, Buffer(16)) 
     aes.setAutoPadding(false) 
     let name = decodeName(aes.update(a)) 
     console.log(name) 
     } 
    } 
    } 
}) 

Meine Ausgabe gebrochener Text, ich ändern url versuchen und mehr gebrochen Text erhalten:

�MzM�ݾ��+,�BW���p�K���� 
+0

Sie fordern Informationen für den Ordner 'MBwjmCqR' an und versuchen, ihn mit dem Schlüssel' gE5WkDpS' zu entschlüsseln. Aber es scheint nicht das einzige Problem zu sein. –

+0

Das Problem gefunden: Verwenden Sie den richtigen Schlüssel (wie oben erwähnt) und verwenden Sie 'Buffer.alloc (0)' und 'Buffer.alloc (16)' anstelle von 'Buffer (0)' und 'Buffer (16)'. –

Antwort

0

Es gibt zwei Fehler im Code:

const link = 'https://mega.nz/#F!gE5WkDpS!Yh6AQtYHPgi-rEkir_gAEw' 
const api = 'https://eu.api.mega.co.nz/cs?id=-1771463320&n=MBwjmCqR' 

Sie bestellen MBwjmCqR Ordnerinformationen, aber mit gE5WkDpS Schlüssel.

let aes = crypto.createDecipheriv('aes-128-ecb', k0, Buffer(0)) 
aes = crypto.createDecipheriv('aes-128-cbc', kdec, Buffer(16)) 

Buffer(size) Verwendung wird es nicht initialisiert werden, so wird die Pufferdaten enthalten, die zuvor im Speicher war. Verwenden Sie Buffer.alloc(size, 0), um es mit Nullen zu initialisieren, die der Implementierung von MEGA entsprechen.