如何为 WhatsApp 的 .crypt12 格式生成页眉和页脚?

Posted

技术标签:

【中文标题】如何为 WhatsApp 的 .crypt12 格式生成页眉和页脚?【英文标题】:How to generate the header and footer for WhatsApp's .crypt12 format? 【发布时间】:2019-09-20 17:22:52 【问题描述】:

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

但如果您想反转该过程,则必须生成页眉、页脚和 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

但情况似乎并非如此。每个文件的 .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    ....    ....    ....    ....    ....

示例 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    ....    ....    ....    ....    ....

您可以看到前 25 个字节总是相等的,但其余的则完全不同。最后 16 个字节是 IV(nonce)顺便说一句。

对于页脚,您可以看到最后两个字节是相等的,而其余的则完全不同。

示例 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

示例 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

那么我如何生成这些?

【问题讨论】:

页脚包含加密备份文件的 md5 哈希(减去页眉/页脚)和 --nn(单元格编号的最后两位数/whatsapp jid)。 @987654321 @如果它有帮助的话。 【参考方案1】:

论文Chat-App Decryption Key Extraction Through Information Flow Analysis分析crypt12格式:

67 字节标头

cipher-header preamble (2 bytes): 0x0, 0x1; 密钥版本(1字节):0x2; 服务器盐(32 字节):从 WhatsApp 服务器存储的伪随机盐; Google 帐户名 salt(16 字节):用于生成 Google 帐户名哈希的 salt,将发送到 WhatsApp 服务器(更多信息) 下面这个); IV(16字节):初始化向量值。

20 字节预告片

MD5哈希值(16字节):加密后的数据库文件的MD5哈希值; 电话号码后缀(4 个字节):源自设备电话号码的最后几位数字。

我无法重建 16 字节的 MD5 哈希,所以我想知道此信息是否正确。也许有一些填充。

【讨论】:

以上是关于如何为 WhatsApp 的 .crypt12 格式生成页眉和页脚?的主要内容,如果未能解决你的问题,请参考以下文章

如何为列中的单元格着色?熊猫,pygsheets

如何为具有动态高度的表格单元格正确设置自动布局?

如何为我的 CollectionView 单元格提供 onclick 功能?

如何为自定义单元格中的动态附加输入字段添加约束

如何为 uicollectionview 制作“选择环”?

如何为用户输入文本时将动态创建的每个单元格设置按钮操作(Swift 4)?