Implement exporting 64-digit crypt15 encryption key

https://github.com/KnugiHK/Whatsapp-Chat-Exporter/issues/20
This commit is contained in:
KnugiHK
2022-09-05 12:16:07 +08:00
parent 422ab2f784
commit 48f667d02b
2 changed files with 15 additions and 5 deletions

View File

@@ -85,6 +85,13 @@ def main():
default=False, default=False,
action='store_true', action='store_true',
help="Embed media into HTML file") help="Embed media into HTML file")
parser.add_option(
"-s",
"--showkey",
dest="showkey",
default=False,
action='store_true',
help="Show the HEX key used to decrypt the database")
(options, args) = parser.parse_args() (options, args) = parser.parse_args()
if options.android and options.iphone: if options.android and options.iphone:
@@ -121,7 +128,7 @@ def main():
elif all(char in string.hexdigits for char in options.key): elif all(char in string.hexdigits for char in options.key):
key = bytes.fromhex(options.key) key = bytes.fromhex(options.key)
db = open(options.backup, "rb").read() db = open(options.backup, "rb").read()
error = extract.decrypt_backup(db, key, msg_db, crypt) error = extract.decrypt_backup(db, key, msg_db, crypt, options.showkey)
if error != 0: if error != 0:
if error == 1: if error == 1:
print("Dependencies of decrypt_backup and/or extract_encrypted_key" print("Dependencies of decrypt_backup and/or extract_encrypted_key"

View File

@@ -71,7 +71,7 @@ def _generate_hmac_of_hmac(key_stream):
b"backup encryption\x01", b"backup encryption\x01",
sha256 sha256
) )
return key.digest() return key.digest(), key_stream
def _extract_encrypted_key(keyfile): def _extract_encrypted_key(keyfile):
@@ -82,7 +82,7 @@ def _extract_encrypted_key(keyfile):
return _generate_hmac_of_hmac(key_stream) return _generate_hmac_of_hmac(key_stream)
def decrypt_backup(database, key, output, crypt=Crypt.CRYPT14): def decrypt_backup(database, key, output, crypt=Crypt.CRYPT14, show_crypt15=False):
if not support_backup: if not support_backup:
return 1 return 1
if isinstance(key, io.IOBase): if isinstance(key, io.IOBase):
@@ -119,9 +119,12 @@ def decrypt_backup(database, key, output, crypt=Crypt.CRYPT14):
if crypt == Crypt.CRYPT15: if crypt == Crypt.CRYPT15:
if len(key) == 32: if len(key) == 32:
main_key = _generate_hmac_of_hmac(key) main_key, hex_key = _generate_hmac_of_hmac(key)
else: else:
main_key = _extract_encrypted_key(key) main_key, hex_key = _extract_encrypted_key(key)
if show_crypt15:
hex_key = [hex_key.hex()[c:c+4] for c in range(0, len(hex_key.hex()), 4)]
print("The HEX key of the crypt15 backup is: " + ' '.join(hex_key))
else: else:
main_key = key[126:] main_key = key[126:]
decompressed = False decompressed = False