Browse Source

turn to pycrypto built-in unpad

pull/19/head
Nzix 5 years ago
parent
commit
ed81290a22
  1. 6
      ncmdump.py

6
ncmdump.py

@ -10,6 +10,7 @@ import base64, json
import os, traceback import os, traceback
from Crypto.Cipher import AES from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from Crypto.Util.strxor import strxor as XOR from Crypto.Util.strxor import strxor as XOR
from mutagen import mp3, flac, id3 from mutagen import mp3, flac, id3
@ -20,7 +21,6 @@ def dump(input_path, output_path = None, skip = True):
core_key = binascii.a2b_hex('687A4852416D736F356B496E62617857') core_key = binascii.a2b_hex('687A4852416D736F356B496E62617857')
meta_key = binascii.a2b_hex('2331346C6A6B5F215C5D2630553C2728') meta_key = binascii.a2b_hex('2331346C6A6B5F215C5D2630553C2728')
unpad = lambda s : s[0:-(s[-1] if type(s[-1]) == int else ord(s[-1]))]
f = open(input_path, 'rb') f = open(input_path, 'rb')
@ -38,7 +38,7 @@ def dump(input_path, output_path = None, skip = True):
key_data = bytes(bytearray([byte ^ 0x64 for byte in key_data])) key_data = bytes(bytearray([byte ^ 0x64 for byte in key_data]))
cryptor = AES.new(core_key, AES.MODE_ECB) cryptor = AES.new(core_key, AES.MODE_ECB)
key_data = unpad(cryptor.decrypt(key_data))[17:] key_data = unpad(cryptor.decrypt(key_data), 16)[17:]
key_length = len(key_data) key_length = len(key_data)
# S-box (standard RC4 Key-scheduling algorithm) # S-box (standard RC4 Key-scheduling algorithm)
@ -61,7 +61,7 @@ def dump(input_path, output_path = None, skip = True):
meta_data = base64.b64decode(meta_data[22:]) meta_data = base64.b64decode(meta_data[22:])
cryptor = AES.new(meta_key, AES.MODE_ECB) cryptor = AES.new(meta_key, AES.MODE_ECB)
meta_data = unpad(cryptor.decrypt(meta_data)).decode('utf-8') meta_data = unpad(cryptor.decrypt(meta_data), 16).decode('utf-8')
meta_data = json.loads(meta_data[6:]) meta_data = json.loads(meta_data[6:])
else: else:
meta_data = {'format': 'flac' if os.fstat(f.fileno()).st_size > 1024 ** 2 * 16 else 'mp3'} meta_data = {'format': 'flac' if os.fstat(f.fileno()).st_size > 1024 ** 2 * 16 else 'mp3'}

Loading…
Cancel
Save