You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.8 KiB
78 lines
2.8 KiB
import base64
|
|
from Crypto.Cipher import AES
|
|
from Crypto.Util import Counter
|
|
import struct
|
|
|
|
def decrypt_aes128_ctr(enc_b64: str, key_b64: str, id_val: int, from_val:int) -> bytes:
|
|
# Декодируем ключ и шифротекст из base64
|
|
key = base64.b64decode(key_b64) # 16 байт для AES-128
|
|
encrypted_data = base64.b64decode(enc_b64)
|
|
|
|
# Формируем вектор инициализации (IV) аналогично pack('P', $id) . pack('P', $from) в PHP
|
|
# 'P' в PHP — это беззнаковое 64-битное целое в little-endian
|
|
iv = struct.pack('<Q', id_val) + struct.pack('<Q', from_val) # 16 байт
|
|
|
|
# В OpenSSL (и PHP) IV для CTR режима интерпретируется как начальное значение 128-битного счётчика,
|
|
# которое увеличивается как big-endian целое.
|
|
# Поэтому преобразуем IV в big-endian целое и создаём счётчик.
|
|
initial_counter = int.from_bytes(iv, byteorder='big')
|
|
ctr = Counter.new(128, initial_value=initial_counter, little_endian=False)
|
|
|
|
# Создаём шифр AES в режиме CTR и дешифруем
|
|
cipher = AES.new(key, AES.MODE_CTR, counter=ctr)
|
|
return cipher.decrypt(encrypted_data)
|
|
|
|
from protobufs_extra.node_info_lite_proto import NODE_INFO_LITE_SCHEME
|
|
CUSTOM_SCHEMA = [
|
|
("varint", "portnum", 1),
|
|
("bytes", "payload", 2),
|
|
("bool", "want_response", 3),
|
|
("uint32", "bitfield", 9),
|
|
]
|
|
|
|
def _print_result(data: bytes):
|
|
from mesht_device import DATA_SCHEMA, USER_SCHEMA
|
|
import pb
|
|
"""Выводит байты в hex и как текст (если читаемо)."""
|
|
print(f" hex: {data.hex()}")
|
|
try:
|
|
from protobuf_decoder.protobuf_decoder import Parser
|
|
res = Parser().parse(data.hex())
|
|
for k,v in res.to_dict().items():
|
|
print(k)
|
|
for field in v:
|
|
print(field)
|
|
except:
|
|
print("can't parse to protobuf")
|
|
pass
|
|
finally:
|
|
print()
|
|
|
|
try:
|
|
dec = pb.decode(data, CUSTOM_SCHEMA)
|
|
print(dec)
|
|
print(pb.decode(dec["payload"], USER_SCHEMA))
|
|
except:
|
|
print("can't decode protobuf")
|
|
import traceback
|
|
traceback.print_exc()
|
|
finally:
|
|
print()
|
|
|
|
try:
|
|
text = data.decode('utf-8')
|
|
print(f" text: {text}")
|
|
except UnicodeDecodeError:
|
|
print(" text: <не UTF-8>")
|
|
|
|
AO = "1PG7OiApB1nwvP+rz05pAQ=="
|
|
|
|
if __name__ == "__main__":
|
|
ciphertext_b64 = "LDsNJgdxZzQntg3KmvaRWRXwt39JAMkRq35RRZoK6lQ/0PnbQ4HJnXBYIjx+B5Y+k3ukq6cLevjra8ky1ANcLANGJTjH92lMbyu3rvwwfyO+4eJNOezJWoE="
|
|
id = 2876191354
|
|
fr0m = 313608604
|
|
key_b64 = AO
|
|
|
|
d = decrypt_aes128_ctr(ciphertext_b64, key_b64, id, fr0m)
|
|
_print_result(d)
|
|
print()
|