Мы интегрировали API, через который я получаю зашифрованные данные. Теперь в документах они дали мне ссылку на программное обеспечение для расшифровки данных.
Вот сайт, который мне порекомендовали использовать для расшифровки полученных данных: https://aesencryption.net/
Он отлично работает, и я получаю расшифрованные данные на этом сайте.
На этом веб-сайте они предоставили свой код, который они используют для расшифровки, и он написан на PHP. Я использовал чат GPT для преобразования этого PHP-кода в python с небольшой модификацией. Но с этим кодом не работает.
Я упоминаю все, что у меня есть и что я пробовал.
import hashlib
from Crypto.Cipher import AES
import base64
class AESFunction:
secret_key = None
key = None
decrypted_string = None
encrypted_string = None
@staticmethod
def set_key(my_key):
key = bytes.fromhex(my_key)
sha = hashlib.sha256()
sha.update(key)
key = sha.digest()[:32]
AESFunction.secret_key = AESFunction.key = key
@staticmethod
def get_decrypted_string():
return AESFunction.decrypted_string
@staticmethod
def set_decrypted_string(decrypted_string):
AESFunction.decrypted_string = decrypted_string
@staticmethod
def get_encrypted_string():
return AESFunction.encrypted_string
@staticmethod
def set_encrypted_string(encrypted_string):
AESFunction.encrypted_string = encrypted_string
@staticmethod
def encrypt(str_to_encrypt):
cipher = AES.new(AESFunction.secret_key, AES.MODE_CBC)
encrypted_bytes = cipher.encrypt(AESFunction.pad(str_to_encrypt).encode('utf-8'))
AESFunction.set_encrypted_string(base64.b64encode(encrypted_bytes).decode('utf-8'))
@staticmethod
def decrypt(str_to_decrypt):
cipher = AES.new(AESFunction.secret_key, AES.MODE_CBC)
decrypted_bytes = cipher.decrypt(base64.b64decode(str_to_decrypt))
AESFunction.set_decrypted_string(AESFunction.unpad(decrypted_bytes).decode('utf-8', errors='replace'))
@staticmethod
def pad(text):
block_size = 32
pad_len = block_size - (len(text) % block_size)
padding = chr(pad_len) * pad_len
return text + padding
@staticmethod
def unpad(text):
pad_len = ord(text[-1])
return text[:-pad_len]
str_password = "f4622a74c54b81f0404c1b6589e8f96c"
str_to_decrypt = "yH0lcZaFBnG3usii6UXZovCYKZYXFUuZF5vcmT+Tz59FQw2pgkke97F/O9BrlEEB3WcqxxdgoVVq+uKxg3y14HzWmByy+f7ck68eyjxULgdCjwka666rDPjm0Tf/+jjnteSb TVPc9WRLuhaPiFBblI9aK3B38ApeECDCNvvRjwE+GtfeGqcu1tCo9aTJAwXroN58Tvu6Otn2quNHyLjUrDEfSzsifkGS8rdid6J+c4VZsK87pALA/CIQxtA7z8W91f+x2bb5EfH8nglfBpsE1FP9 IBnI5ECjVTJy9pM45TJhnHSYOIRHX5jcwMSUDLgBdjJ57EHdzf0RqTO4ZdLHv7xpMSsVP1oHClqbGTd9UE/yXt9a2Fvm+rPKAL9rU9tXtMCe6uONgnRELrn2VePJYcp3qViP/1HReN4IbT4 EYUlXJ/Tqdph6YERTKUh67mnF4lPfHCsrb9AsPNcMYn7r8tT5dMgC1wjzXO22+tUuD8DWEbnrHPPID1WBCRua3POBMyGUcMkSIEdke739pDoKxW1Ww6iGsbsQX60g5jiJEAg6fghn6P+6osKXr fLO4OirsUo8SKRO1m6YSMf31htvkcJbUbDAe2nG+aeUxEozdVyRxUauMtxYahvqcQPJtEKgAugPoCYrPx+RhutoPyaHOOzUtzXvznOV+2qcE0HfLaSotFPeteQzx7Qj4lKDVNkmkwn8jRyVfMUFzRp0 1v6DqsJe89uIdTyAe65rpyzNt17TDOR8BWLxifOAhDosrW61RfFE+HBU3egySbfs3PxJxHUOrwBOhnGQwILN+bENaLgcQCjczgs9BZ3i+6XK7DwLNFL1xBt42i09NpyIbJYXE1ZkrObA9r rmGLhHCqkhIDyBAaWYYNOdYOVIRbUWSA+bSeCg6xIgy/ FhhxxNsmtYAMzrdjQyjYIIEuAvhe9wOTP1IPNqbtuyEPoObThCtZy3JunneK4SdW5f5rzNDOPu4dHw1EuRBYNmqmXh2Mpw2LWoit/+8Eob4aiZDpeH3HJAXrXHH+lyulJgxm4fkHZXcj25IS r0OOHjuLqAIn7ezceeRnLSfHkjL74klt0aRCIuG0p6MKwVVdHEX2n4WblcYHgEHNUoWWpOb9I3gf6Egb5uk59u9Sjc+9/MRaXoIulv+qgRNDGVMByEIqNlpmPSKnwWEEmtV54aa2QjGMOb282t TuEMpha9uHrgBfEwsKeXZ6Uwx1SPyvNHa5eoTojLc7avBdU//5XwPLp40DRvuLo6Kn6fY2SMeWRqP8A4LtarU+2eYwqWkdeggJFF3LFBkYDDwh9N+j8mBdtv1sg/bguD6yUE3UUN/jZ9nhxraxt 9qrP11ifXnvSK5BToa7t5SFBiMDCM/n/bBINd+N05937KStvC76AsZHFvxl4xVZq2200qDCYzSrGbVrRcJUABvvlXm1EGHWAQcfe9K5UJ5KZIwijd9p1e2OReHNOziw1VGYR3vZ45ZkqNQn RaqYacnmXEGYgXa7ik92PWarE148+TRdoDBC1jPHRNejXNx9KRoU88cZiGENRjm80jTxZ4tWgVFDzS99GhsHkZw2+4pHZNN06gZce1KsQnnx+algAYK"
Зашифрованные данные я получаю от https://aesencryption.net/
[{"paneli/":"7a7","название панели":"Тест гена питания"},{"panel_id":"798","название панели":"Геномика фитнеса"},{"panel_id":"799 ","название панели":"Гормональные расстройства"},{"panel_id":"801","название панели":"Аллергия"},{"panel_id":"802","название панели":"Личные черты" },{"panel_id":"803","название панели":"Дерматология"},{"panel_id":"804","название панели":"Зависимость"},{"panel_id":"805"," название панели":"Неврология"},{"panel_id":"806","название панели":"Геномика образа жизни"},{"panel_id":"807","название панели":"Офтальмология"},{" panel_id":"808","название панели":"Нарушения функции почек"},{"panel_id":"809","название панели":"Признаки, связанные с циркадным ритмом"},{"panel_id":"810"," имя панели":"Желудочно-кишечные расстройства"},{"panel_id":"811","название панели":"Легочные расстройства"},{"panel_id":"812","название панели":"Вакциномика"},{ "panel_id":"813","название панели":"Иммунология"},{"panel_id":"814","название панели":"Стоматологические заболевания"},{"panel_id":"815","название панели ":"Сердечно-сосудистые заболевания"},{"panel_id":"816","название панели":"ЭКО и невынашивание беременности"},{"panel_id":"817","название панели":"Гематологические заболевания"}, {"panel_id":"818","название панели":"Здоровье и заболевания костей"},{"panel_id":"819","название панели":"Инфекционные заболевания"},{"panel_id":"991" ,"название панели":"Запрос QUA"}]
Наконец, я использую эту команду для получения данных расшифровки:
AESFunction.decrypt(str_to_decrypt)
decrypted_string = AESFunction.get_decrypted_string()
print("Decrypted string:", decrypted_string)
Я получаю эту ошибку (которая исходит от «def unpad (текст)»:
TypeError: ord() ожидал строку длины 1, но нашел int
У меня есть идея, что означает эта ошибка, но у меня нет решения для этого. Может кто-нибудь, пожалуйста, помогите мне найти способ расшифровать такие данные, которые я получаю от API
@ sahasrara62 Да, я понял, но в документе это упоминается только так. Любая идея, как изменить эту функцию, поскольку функция ord() всегда возвращает «int» в соответствии с моим пониманием
вам нужно изменить распаковку






текст представляет собой массив байтов, и вы сделали распаковку неправильно, это то, что нужно сделать при распаковке
def unpad(text):
return text[:text[-1]]
Пробовал, получая эту ошибку «UnicodeDecodeError: кодек« utf-8 »не может декодировать байт 0xb3 в позиции 0: недопустимый начальный байт»
Веб-сайт выполняет простое шифрование с помощью AES/CBC/PKCS#7. Ключ получается из ASCII-кодировки f462..., поэтому он имеет длину 32 байта (AES-256), а IV — это ASCII-кодировка 1234567890123456.
Чтобы исправить опубликованный код Python, вам нужно удалить вывод ключа через SHA256, применить статический IV и (для простоты) использовать поддержку PyCryptodome PKCS # 7. Да, вы, вероятно, будете работать быстрее, если откажетесь от решения ChatGPT и перепишете код, например:
from base64 import b64decode
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
iv = b"1234567890123456"
key = b"f4622a74c54b81f0404c1b6589e8f96c"
ct = b64decode("yH0l...gAYK")
cipher = AES.new(key, AES.MODE_CBC, iv)
pt = unpad(cipher.decrypt(ct), AES.block_size)
print(pt.decode("utf-8")) # [{"panel_id":"797",...
Примечания по безопасности: IV не должен быть статическим, а случайным для каждого шифрования. Ключ не должен состоять только из символов ASCII, а должен представлять собой случайную последовательность байтов (например, сгенерированную с помощью CSPRNG или полученную с использованием функции вывода ключа, например PBKDF2). Для целей тестирования оба, конечно, приемлемы.
Это сработало! Большое спасибо.
вы переходите к распаковке, но для этого требуется строка