import os
import base64
import hashlib
from Crypto.Cipher import AES
import json
from datetime import datetime
import requests

raw_url = input("Input LINK URL: ")

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}


class AESCrypt:
    AES_BLOCK_SIZE = 16
    HASH_ALGORITHM = 'SHA-256'
    IV = b'\x00' * AES_BLOCK_SIZE

    @staticmethod
    def generate_key(password):
        hashed_key = hashlib.sha256(password.encode()).digest()
        return hashed_key

    @staticmethod
    def pad_message(message):
        padding_length = AESCrypt.AES_BLOCK_SIZE - (len(message) % AESCrypt.AES_BLOCK_SIZE)
        padded_message = message + (chr(padding_length) * padding_length).encode()
        return padded_message

    @staticmethod
    def unpad_message(padded_message):
        padding_length = padded_message[-1]
        return padded_message[:len(padded_message) - padding_length]

    @staticmethod
    def decrypt(password, encoded_ciphertext):
        key = AESCrypt.generate_key(password)
        cipher = AES.new(key, AES.MODE_CBC, AESCrypt.IV)
        ciphertext = base64.b64decode(encoded_ciphertext)
        decrypted_message = cipher.decrypt(ciphertext)
        unpadded_message = AESCrypt.unpad_message(decrypted_message)
        return unpadded_message.decode()

def fetch_and_decode_raw_content(raw_link, headers):
    try:
        response = requests.get(raw_link, headers=headers)
        response.raise_for_status()  # Raise an HTTPError for bad responses
        return response.text
    except requests.RequestException as e:
        print(f"Error fetching raw content: {e}")
        return None
        
def add_info_to_data(data):
    info_data = {
        "[</>] [SnifferBy]": "EnzoZxx",
        "[</>] [Telegram]": "https://t.me/XDecrytorId",
        "[</>] [Tools]": "Python Decrypt x Keep Json 1.0.3 ©"
    }
    data["Info"] = info_data                

def main():
    enzo_password = "ZnVja2JveQ=="
    password = base64.b64decode(enzo_password).decode('utf-8')
    

    try:
        # Fetch and decode raw content
        decrypted_text = fetch_and_decode_raw_content(raw_url, headers)

        # Check if decryption is successful before proceeding
        if decrypted_text:
            encrypted_data = json.loads(AESCrypt.decrypt(password, decrypted_text))

        decrypted_data = []

        for entry in ["Servers", "Networks", "SSLNetworks"]:
            for network in encrypted_data.get(entry, []):
                for key in ["SNIHost", "Payload"]:
                    if key in network:
                        network[key] = AESCrypt.decrypt(password, network[key])
                if "ProxySettings" in network and "Squid" in network["ProxySettings"]:
                    network["ProxySettings"]["Squid"] = AESCrypt.decrypt(password, network["ProxySettings"]["Squid"])

        decrypted_data.append(encrypted_data)

        folder_name = "/storage/emulated/0/EnzoSniffer/"
        os.makedirs(folder_name, exist_ok=True)

        file_path = os.path.join(folder_name, "[ScbuildData]SnifferBY_ENzoZxx.txt")
        
        add_info_to_data(encrypted_data)
        output_data = {"Info": encrypted_data.pop("Info"), **encrypted_data}
        
        with open(file_path, "w") as output_file:
            json.dump(output_data, output_file, indent=4, ensure_ascii=False)  
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        number_of_entries = sum(len(encrypted_data.get(entry, [])) for entry in ["Servers", "Networks", "SSLNetworks"])

        success_message = (
            f"* Decryption Successful {number_of_entries}\n"
            f"* Timestamp: {timestamp}\n"
            f"* SnifferBy: EnzoZxx\n"
            f"* =========================================="
        )
        print(success_message)

    except json.JSONDecodeError as e:
        print(f"Error decoding JSON: {e}")
    except requests.RequestException as e:
        print(f"Error making the request: {e}")
    except Exception as e:
        print(f"Error: {e}")

if __name__ == "__main__":
    main()