For*_*vin 7 python encryption aes whatsapp crypt12
WhatsApp将所有消息存储在sqlite文件中,该文件首先经过zlib压缩,然后经过AES加密。
解密/解压缩可以很容易地完成,例如:
def decrypt(db_file, key_file):
""" Function decrypt Crypt12 Database """
try:
with open(key_file, "rb") as fh:
key_data = fh.read()
key = key_data[126:]
with open(db_file, "rb") as fh:
db_data = fh.read()
iv = db_data[51:67]
aes = AES.new(key, mode=AES.MODE_GCM, nonce=iv)
with open("msgstore.db", "wb") as fh:
fh.write(zlib.decompress(aes.decrypt(db_data[67:-20])))
print db_file + " decrypted, msgstore.db created."
except Exception as e:
print "An error has ocurred decrypting the Database:", e
Run Code Online (Sandbox Code Playgroud)
但是,如果要撤消该过程,则必须生成页眉,页脚和IV。起初我以为您可以从另一个已经存在的crypt12文件中复制它们,如下所示:
def encrypt(db_file, key_file, db_cript):
""" Function encrypt msgstore Database """
try:
with open(key_file, "rb") as fh:
key_data = fh.read()
key = key_data[126:]
with open(db_cript, "rb") as fh:
db_cript_data = fh.read()
header = db_cript_data[:51]
iv = db_cript_data[51:67]
footer = db_cript_data[-20:]
with open(db_file, "rb") as fh:
data = fh.read()
aes = AES.new(key, mode=AES.MODE_GCM, nonce=iv)
with open("msgstore.db.crypt12", "wb") as fh:
fh.write(header + iv + aes.encrypt(zlib.compress(data)) + footer)
print "Encrypted msgstore.db created."
except Exception as e:
print "An error has ocurred encrypting the Database:", e
Run Code Online (Sandbox Code Playgroud)
但这似乎并非如此。每个文件的.crypt12文件页眉和页脚都不同。
示例1标头hexdump:
0000000 0100 5802 ee46 bcaf 8968 d43b bfaf ca5d
0000010 a774 6b66 53ec dbae af60 a09c 3ad2 ba5e
0000020 7341 d224 22e7 55c3 c944 cf77 2c71 9c29
0000030 3a58 3798 d10f 897c 6ffa f27a e788 4d7b
0000040 24a7 43a0 f1d3 5f7c 5c74 d64d 58c9 21a4
0000050 771c 7fdc 2e14 ca93 0848 758a c184 9058
0000060 b7d9 d847 604f cadf 05a2 a678 4994 b711
0000070 2641 9170 8965 f6a7 9ff3 95a0 860d aca1
0000080 214c d644 faa7 .... .... .... .... ....
Run Code Online (Sandbox Code Playgroud)
示例2标头hexdump:
0000000 0100 5802 ee46 bcaf 8968 d43b bfaf ca5d
0000010 a774 6b66 53ec dbae af60 a09c 3ad2 ba5e
0000020 7341 d224 22e7 55c3 c944 cf77 2c71 9c29
0000030 3a58 1898 1435 4cc9 bdbf e506 f138 41a6
0000040 32a0 71c5 faa9 2499 36f7 d2be d7a8 bf28
0000050 f3ea 1571 ed80 da14 addb 63b6 1d8e 2de5
0000060 0a9c bc31 8d86 cb42 b4ce b603 af7c c295
0000070 d67f b787 1ad8 eb69 3180 1c9d 8106 1f98
0000080 e880 edd5 c285 .... .... .... .... ....
Run Code Online (Sandbox Code Playgroud)
您可以看到前25个字节始终相等,但其余部分完全不同。最后16个字节是IV(即刻)btw。
对于页脚,您可以看到最后两个字节相等,其余字节完全不同。
示例1页脚hexdump:
1464cd0 .... 2feb 12d8 a2bc 92bd ca30 a99f 621c
1464ce0 9e87 88df dc82 f7ea 2cfd 3e0b ecd4 03b1
1464cf0 7720 8d3d 2dcb 382d 0031
Run Code Online (Sandbox Code Playgroud)
示例2页脚hexdump:
1474330 .... d4e9 80de d0e8 9786 4fd3 8bf2 957c
1474340 fdf5 2e24 c4f2 1b55 121a 4410 014d c516
1474350 7531 7f0a 2d71 382d 0031
Run Code Online (Sandbox Code Playgroud)
那么我该如何生成这些呢?
论文Chat-App Decryption Key Extraction Through Information Flow Analysis分析了crypt12格式:
\n\n\n67 字节标头:
\n\n
\n- 密码头前导码(2 字节):0x0、0x1;
\n- 密钥版本(1字节):0x2;
\n- 服务器盐(32字节):来自WhatsApp服务器存储的伪随机盐;
\n- Google 帐户名称盐(16 字节):用于生成 Google 帐户名称哈希值的盐,该哈希值将发送到 WhatsApp 服务器(更多信息请参见下文);
\n- IV(16字节):初始化向量值。
\n20 字节预告片:
\n\n
\n- MD5哈希值(16字节):加密数据库文件的MD5哈希值;
\n- 电话号码\xe2\x80\x99s后缀(4字节):源自设备电话号码的最后几位。
\n
我无法重建 16 字节 MD5 哈希值,所以我想知道该信息是否正确。也许有一些填充。
\n| 归档时间: |
|
| 查看次数: |
426 次 |
| 最近记录: |