mirror of
https://github.com/KnugiHK/WhatsApp-Chat-Exporter.git
synced 2026-06-06 16:08:29 +00:00
Implement exporting 64-digit crypt15 encryption key
https://github.com/KnugiHK/Whatsapp-Chat-Exporter/issues/20
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user