1
mega.nz의 api에 요청하고, 폴더의 개인 키를 가져 오는 url을 구문 분석 한 다음 nodejs의 암호로 요청의 응답으로부터 파일의 이름을 디코딩 해 봅니다.nodejs의 mega.nz 폴더의 이름 파일을 가져옵니다.
내 코드 :
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����
'MBwjmCqR' 폴더에 대한 정보를 요청하고 'gE5WkDpS' 키를 사용하여 암호를 해독하려고합니다. 그러나 그것이 유일한 문제는 아닌 것 같습니다. –
문제를 발견 : 올바른 키를 사용하여 (위에서 언급 한 바와 같이)'Buffer (0)'및'Buffer (16)'대신'Buffer.alloc (0)'과'Buffer.alloc (16)'을 사용하십시오. –