import requests import base64 import hashlib from Cryptodome.Cipher import AES from Cryptodome.Util.Padding import pad from constants import SMC_LICENSE_KEY, NDR_LICENSE_KEY USER_NAME = "root" USER_ROLE = "admin" FRONT_IP = "192.168.0.1" # Функция считывания общего ключа def shared_key_reader(): # Считываем общий секрет with open("secretShared.bin", "rb") as shared_file: # Считываем содержимое файла и преобразуем его в шестнадцатиричное представление с помощью # функции hex() shared_secret = shared_file.read().hex() return shared_secret SHARED_KEY = shared_key_reader() # Константы для запроса # Authorization-key # Данные, которе требуется зашифровать # data = (SMC_LICENSE_KEY + NDR_LICENSE_KEY).encode("utf-8") # POSTMAN pre_data = base64.b64encode((SMC_LICENSE_KEY + NDR_LICENSE_KEY).encode('utf-8')) # Преобразуем SHARED_KEY в байтовую строку с использованием кодировки UTF-8 key = SHARED_KEY # Создаем инвертированный закодированный ключ encoded_reversed_key = key[::-1].encode("utf-8") # Вычисление вектора инициализации следующим образом: # Берется hash-сумма MD5 от инвертированного общего ключа # C помощью функции hexdigest() получаем строкове представление хэш суммы в виде 16ричных чисел # Обрезаем полученое строковое представление до 16 символов # Кодируем получившуюся строку в UTF-8 iv = hashlib.md5(encoded_reversed_key).hexdigest()[:16].encode('utf-8') # Вычисляем хэш-сумму MD5 и представляем ее в 16ричном виде, а затем кодируем в UTF-8 key_hash = hashlib.md5(key.encode('utf-8')).hexdigest() # Создаем объект cipher от класса AES с использованием ключа key, режима AES.MODE_CBS # (Cipher Block Chaining) и вектора инициализации iv cipher = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv) # Получаем шифр путем: # С помощью функции pad() данные data дополняются до размера блока AES и шифруются объектом cipher encrypted = cipher.encrypt(pad(pre_data, AES.block_size)) # Полученное преобразуем в base64 encrypted_base64_authorization_key = base64.b64encode(encrypted).decode('utf-8') authorization_key_header_data = "x-ndr-key " + encrypted_base64_authorization_key # Authorization user user_data = base64.b64encode(USER_NAME.encode('utf-8')) cipher_user = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv) encrypted_user = cipher_user.encrypt(pad(user_data, AES.block_size)) encrypted_base64_authorization_user = base64.b64encode(encrypted_user).decode('utf-8') authorization_user_header_data = "x-ndr-user " + encrypted_base64_authorization_user # Authorization role user_role_data = base64.b64encode(USER_ROLE.encode('utf-8')) cipher_role = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv) encrypted_user_role = cipher_role.encrypt(pad(user_role_data, AES.block_size)) encrypted_base64_authorization_role = base64.b64encode(encrypted_user_role).decode('utf-8') authorization_role_header_data = "x-ndr-role " + encrypted_base64_authorization_role # Authorization ip ip_data = base64.b64encode(FRONT_IP.encode('utf-8')) cipher_ip = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv) encrypted_ip = cipher_ip.encrypt(pad(ip_data, AES.block_size)) encrypted_base64_authorization_ip = base64.b64encode(encrypted_ip).decode('utf-8') authorization_ip_header_data = "x-ndr-ip " + encrypted_base64_authorization_ip # print("\n\n\n") # print("key = " + encrypted_base64_authorization_key) # print("user = " + encrypted_base64_authorization_user) # print("role = " + encrypted_base64_authorization_role) # print("ip = " + encrypted_base64_authorization_ip) # print("\n\n\n") # Запрос request_url = "https://192.168.56.10:8000/api/v1/auth/session/login" headers = { "Authorization-key": authorization_key_header_data, "Authorization-user": authorization_user_header_data, "Authorization-role": authorization_role_header_data, "Authorization-ip": authorization_ip_header_data, } response = requests.post(request_url, headers=headers, verify=False)