You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

40 lines
1.2 KiB

# from https://gist.github.com/flatz/3f242ab3c550d361f8c6d031b07fb6b1
import os
import json
import logging
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Hash import SHA1
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
logging.basicConfig()
logger = logging.getLogger('utils')
logger.setLevel(logging.INFO)
def aes_decrypt_cbc(key, iv, data):
cipher = AES.new(key, AES.MODE_CBC, iv)
return cipher.decrypt(data)
salt = 'saltysalt'
derived_key_len = 128 // 8
num_iterations = 1003
iv = b' ' * 16
def decrypt_encrypted_key(password, encrypted_key):
encrypted_key = bytes.fromhex(encrypted_key)
if encrypted_key.startswith(b'v10'):
password = 'peanuts'
logger.warning(f'encryptedKey in config.json is encrypted using the default `peanuts` key')
elif encrypted_key.startswith(b'v11'):
encrypted_key = encrypted_key[3:]
else:
logger.warning(f'expected v10 or v11 in password prefix but saw {encrypted_key[:3]}')
encrypted_key = encrypted_key[3:]
kek = PBKDF2(password, salt, dkLen = derived_key_len, count = num_iterations, hmac_hash_module = SHA1)
decrypted_key = unpad(aes_decrypt_cbc(kek, iv, encrypted_key), block_size = 16).decode('ascii')
print('0x' + decrypted_key)