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

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()