Проверка HMAC вернула несоответствие

Я пишу скрипт для отправки сообщений в WhatsApp, и после долгих поисков подходящего для этого инструмента остановился на этом:https://github.com/sigalor/whatsapp-web-reveng

Он очень подробно описывает, как клиент взаимодействует с сервером через веб-сокеты, и я начал с авторизации.

Все прошло хорошо, я сгенерировал QR-код для авторизации клиента и начал анализировать необходимые данные для продолжения работы. После успешной авторизации веб-сокет получает сообщение с секретом, из которого нужно извлечь ключи для расшифровки сообщений. Посмотрите снимок экрана, чтобы понять, о чем я говорю - Снимок экрана

Согласно коду из источника, после получения расширенного и общего секрета я должен выполнить проверку HMAC, я почти не внес изменений в исходный код, просто представил его в другой форме.

import websocket
from base64 import b64encode, b64decode
from os import urandom
from time import time
from json import loads, dumps
from qrcode import make
from curve25519 import Private, Public
from hmac import new
from hashlib import sha256

def connect():
    ws = websocket.WebSocket()
    ws.connect("wss://web.whatsapp.com/ws", header = {"Origin: https://web.whatsapp.com"})
    clientId   = b64encode(urandom(16)).decode()
    privKey = Private()
    pubKey = Private().get_public()
    ws.send(str(int(time()))+ ',["admin", "init", [2, 2047, 11],["Windows", "Chrome", "10"],"'+clientId +'", true]')
    make(loads(ws.recv().split(",", maxsplit=1)[1])["ref"]+ "," + b64encode(pubKey.serialize()).decode()+ "," + clientId).save("qr.png")
    s1 = loads(ws.recv().split(",", maxsplit=1)[1])[1]
    secret = b64decode(s1["secret"])
    sharedSecret = privKey.get_shared_key(Public(secret[:32]), lambda x: x)
    sse = HKDF(sharedSecret, 80)
    if HmacSha256(sharedSecret[32:64], secret[:32]+secret[64:]) != secret[32:64]:
        print("HMAC Mismatch.")

def HmacSha256(key, sign):
    return new(key, sign, sha256).digest()

def HKDF(key, length):
    key= HmacSha256(b"\0"*32, key)
    keyStream = b""
    keyBlock = b""
    blockIndex = 1
    while len(keyStream) < length:
        keyBlock = new(key, msg=keyBlock+chr(blockIndex).encode(), digestmod=sha256).digest()
        blockIndex += 1
        keyStream += keyBlock
    return keyStream[:length]

connect()

Вопреки моим ожиданиям, я получаю несоответствие HMAC, и я понятия не имею, почему это происходит.

0 ответов

Другие вопросы по тегам