2016-07-08 6 views
1

Запрос api из mega.nz, parse url для получения секретного ключа папки и попробовать декодировать имя файлов из ответа на запрос с помощью криптографии nodejs.получить файлы имен папки mega.nz в nodejs

Мой код:

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) 
     } 
    } 
    } 
}) 

Мой выход более разбитый текст, я стараюсь изменить URL и получить более разбитое текст:

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

Вы запрашиваете информацию для папки 'MBwjmCqR' и пытаетесь ее расшифровать с помощью ключа' gE5WkDpS'. Но, похоже, это не единственная проблема. –

+0

Обнаружена проблема: используйте правильный ключ (как указано выше), затем используйте 'Buffer.alloc (0)' и 'Buffer.alloc (16)' вместо 'Buffer (0)' и 'Buffer (16)'. –

ответ

0

Есть две ошибки в коде:

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

Вы запрашиваете MBwjmCqR информацию о папке, но используя ключ gE5WkDpS.

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

Использование Buffer(size) не будет инициализировать его, так что буфер будет содержать данные, которые ранее в памяти. Используйте Buffer.alloc(size, 0), чтобы инициализировать его нулями, что будет соответствовать реализации MEGA.