5 changed files with 110 additions and 1 deletions
@ -0,0 +1,78 @@ |
|||
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() |
|||
Loading…
Reference in new issue