#7GERA #ENISA #NIS2 #CCDCOE #UkraineRussiaWar : $BTC / $ETH

import networkx as nx import matplotlib.pyplot as plt import random # Definir el grafo de arquitectura de seguridad def build_security_graph(): G = nx.Graph() # Nodos: Países/Regiones (enfoque en Europa + Ucrania, sin EE. UU.) nodes = [ 'Ucrania', 'Polonia', 'Alemania', 'Francia', 'Reino Unido', 'Estonia', 'Rumanía', 'Bulgaria', 'Suecia', 'Finlandia', 'Turquía', 'Suiza' # Neutral para datos ] G.add_nodes_from(nodes) # Aristas: Alianzas/Prioridades (geopolítico, económico, cibernético, información) # Pesos: Fuerza (1-10, más alto = lazo más fuerte) edges = [ ('Ucrania', 'Polonia', {'weight': 9, 'type': 'geopolítico/económico'}), ('Ucrania', 'Alemania', {'weight': 8, 'type': 'económico/cibernético'}), ('Ucrania', 'Francia', {'weight': 7, 'type': 'información/poder blando'}), ('Ucrania', 'Reino Unido', {'weight': 8, 'type': 'militar/inteligencia'}), ('Ucrania', 'Estonia', {'weight': 6, 'type': 'cibernético'}), ('Ucrania', 'Rumanía', {'weight': 7, 'type': 'geopolítico/mar negro'}), ('Polonia', 'Alemania', {'weight': 9, 'type': 'económico'}), ('Alemania', 'Francia', {'weight': 10, 'type': 'núcleo de la UE'}), ('Francia', 'Reino Unido', {'weight': 7, 'type': 'post-Brexit'}), ('Estonia', 'Suecia', {'weight': 8, 'type': 'cibernético nórdico'}), ('Suecia', 'Finlandia', {'weight': 9, 'type': 'nórdico'}), ('Rumanía', 'Bulgaria', {'weight': 6, 'type': 'mar negro'}), ('Ucrania', 'Turquía', {'weight': 5, 'type': 'militar/drone'}), ('Suiza', 'Alemania', {'weight': 6, 'type': 'protección de datos'}), ('Suiza', 'Ucrania', {'weight': 4, 'type': 'centro de datos neutral'}) ] G.add_edges_from(edges) return G # Simular la propagación de amenazas híbridas (por ejemplo, ataque cibernético comenzando desde un nodo externo) def simulate_threat(G, start_node='External_Threat', target='Ucrania', steps=5): # Agregar nodo de amenaza externa G.add_node(start_node) # Conectar amenaza a aristas vulnerables (por ejemplo, a nodos que enfrentan a Rusia) G.add_edge(start_node, 'Ucrania', {'weight': 1, 'type': 'híbrido'}) G.add_edge(start_node, 'Estonia', {'weight': 1, 'type': 'cibernético'}) G.add_edge(start_node, 'Rumanía', {'weight': 1, 'type': 'información'}) # Propagación simple: Caminata aleatoria con verificación de resiliencia current = start_node path = [current] resilience_scores = {node: random.uniform(0.7, 1.0) for node in G.nodes()} # Alta resiliencia en la red for _ in range(steps): neighbors = list(G.neighbors(current)) if not neighbors: break next_node = random.choice(neighbors) edge_weight = G[current][next_node]['weight'] # La resiliencia atenúa la propagación if random.random() > (edge_weight / 10) * resilience_scores[next_node]: print(f"Amenaza bloqueada en {next_node} debido a la resiliencia.") break current = next_node path.append(current) return path, resilience_scores[target] # Visualizar el grafo def visualize_graph(G): pos = nx.spring_layout(G) edge_labels = nx.get_edge_attributes(G, 'type') nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=500) nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels) plt.title("Grafo de Arquitectura de Seguridad Europea-Ucrania") plt.show() # O guardar como imagen: plt.savefig('security_arch.png') # Ejecución principal if __name__ == "__main__": G = build_security_graph() threat_path, ukraine_resilience = simulate_threat(G, steps=10) print(f"Ruta de Amenaza Simulada: {threat_path}") print(f"Puntuación de Resiliencia de Ucrania: {ukraine_resilience:.2f}") visualize_graph(G) # Comentar si no se muestra; guardar en su lugar para la imagen

