# Chemins des fichiers
file_paths = {
    "off_rocket": "/var/www/html/modification_carto/off rocket",
    "ori_ocas_pcr": "/var/www/html/modification_carto/ori ocas pcr 2.1"
}

# Lire le contenu des fichiers
file_contents = {}
for file_name, file_path in file_paths.items():
    with open(file_path, "rb") as file:
        file_contents[file_name] = file.read()

# MCUID en bytes
mcuid_bytes = bytes.fromhex("410482850C80A82F830600102417E000")

# Positions pertinentes des bytes à modifier
relevant_positions = [
    1388869, 1397894, 1397895, 1397896, 1397897, 1397898, 1397899,
    1402550, 1402551, 2073408, 2073409, 2073410, 2073412, 2073413, 2073414,
    2073415, 2073416, 2073417, 2073418, 2073419, 2073420, 2073421, 2073422,
    2073423, 2073425, 2073426, 2073427, 2073428, 2073429, 2073430, 2073431,
    2073432, 2073434, 2073435, 2073436, 2073437, 2073438, 2073439, 2073440,
    2073441, 2073443, 2073444
]

# Extraire les bytes originaux et modifiés aux positions pertinentes
original_bytes = [file_contents['ori_ocas_pcr'][pos] for pos in relevant_positions]
modified_bytes = [file_contents['off_rocket'][pos] for pos in relevant_positions]

# Analyser les différences avec MCUID
def analyze_diff_with_mcuid(original, modified, mcuid):
    results = {
        'diff_mcuid': [],
        'diff_add_mcuid': [],
        'diff_sub_mcuid': [],
        'diff_xor_mcuid': []
    }
    for i in range(len(original)):
        mcuid_byte = mcuid[i % len(mcuid)]
        results['diff_mcuid'].append(modified[i] - mcuid_byte)
        results['diff_add_mcuid'].append((modified[i] + mcuid_byte) % 256)
        results['diff_sub_mcuid'].append((modified[i] - mcuid_byte) % 256)
        results['diff_xor_mcuid'].append(modified[i] ^ mcuid_byte)
    return results

diff_patterns = analyze_diff_with_mcuid(original_bytes, modified_bytes, mcuid_bytes)

# Afficher les motifs de différences
print("\nMotifs de différences avec MCUID :")
for pattern, values in diff_patterns.items():
    print(f"{pattern}: {values}")

# Séquences de transformations conditionnelles ou séquentielles
def sequential_transformations(byte_seq, mcuid_bytes):
    results = {
        'diff_then_add_mcuid': [],
        'add_then_xor_then_sub': [],
        'xor_then_add_then_rotate': []
    }
    for i in range(len(byte_seq)):
        mcuid_byte = mcuid_bytes[i % len(mcuid_bytes)]
        
        # Différence puis addition avec MCUID
        diff = byte_seq[i] - mcuid_byte
        results['diff_then_add_mcuid'].append((diff + mcuid_byte) % 256)
        
        # Addition, XOR puis soustraction avec MCUID
        add = (byte_seq[i] + mcuid_byte) % 256
        xor = add ^ mcuid_byte
        results['add_then_xor_then_sub'].append((xor - mcuid_byte) % 256)
        
        # XOR, addition puis rotation
        xor = byte_seq[i] ^ mcuid_byte
        add = (xor + mcuid_byte) % 256
        rotate = ((add << 1) & 0xFF) | ((add >> 7) & 0x01)
        results['xor_then_add_then_rotate'].append(rotate)
    return results

transformed_sequential_results = sequential_transformations(modified_bytes, mcuid_bytes)

# Afficher les résultats des transformations séquentielles
print("\nRésultats des transformations séquentielles :")
for transform_type, result in transformed_sequential_results.items():
    print(f"Résultats transformés par {transform_type} :")
    print(result)
    print(f"Comparaison avec les bytes modifiés ({transform_type}) :")
    for i, (orig, mod, trans) in enumerate(zip(original_bytes, modified_bytes, result)):
        print(f"Position {relevant_positions[i]}: Original {orig}, Modifié {mod}, Transformé {trans}, Correspondance: {'Oui' if mod == trans else 'Non'}")
    print("\n")
