import gnupg import json import pyodbc # Función para obtener conexión a MSSQL def obtener_conexion(): return pyodbc.connect( 'DRIVER={ODBC Driver 18 for SQL Server};' 'SERVER=140.82.58.83,14338;' 'DATABASE=licencias;' 'UID=sa;' 'PWD=hG0eT6P9CDXQmbVQ3S4IHPX5drBMVxog;' 'TrustServerCertificate=yes' ) def leer_descifrar_y_validar_licencia(archivo_licencia, passphrase): # Inicializar GPG gpg = gnupg.GPG() try: # Leer el archivo cifrado with open(archivo_licencia, 'rb') as f: contenido_cifrado = f.read() # Descifrar los datos descifrado = gpg.decrypt(contenido_cifrado, passphrase=passphrase) if not descifrado.ok: print(f"Error al descifrar los datos: {descifrado.status}") return print("Licencia descifrada correctamente.") # Verificar la firma de los datos verificacion = gpg.verify(descifrado.data) if verificacion: print("La firma de la licencia es válida.") else: print("La firma de la licencia no es válida.") print(f"Detalles de la verificación de la firma: {verificacion.stderr}") return # Extraer los datos JSON de la parte firmada datos_firmados = descifrado.data.decode('utf-8') # Los datos firmados con PGP suelen tener la forma: # -----BEGIN PGP SIGNED MESSAGE----- # Hash: SHA512 # # { # "software": "MINDS", # ... # } # # Debemos eliminar los encabezados PGP para obtener el JSON puro. # Buscar el comienzo del JSON real (después de los encabezados PGP) json_inicio = datos_firmados.find("{") json_final = datos_firmados.rfind("}") if json_inicio == -1 or json_final == -1: print("No se pudo encontrar el bloque JSON en los datos firmados.") return # Extraer el bloque JSON datos_licencia_json = datos_firmados[json_inicio:json_final + 1] # Convertir el JSON a un diccionario de Python datos_licencia = json.loads(datos_licencia_json) print("Datos de la licencia:") print(datos_licencia) # Verificar los datos contra la base de datos if verificar_datos_contra_bd(datos_licencia): print("La licencia es válida y coincide con los datos en la base de datos.") else: print("La licencia no coincide con los datos almacenados en la base de datos.") except Exception as e: print(f"Error al leer, descifrar y validar la licencia: {str(e)}") def verificar_datos_contra_bd(datos_licencia): try: # Conectar a la base de datos MSSQL conn = obtener_conexion() cursor = conn.cursor() # Consultar los datos de la licencia en la base de datos cursor.execute(''' SELECT * FROM licencias WHERE software = ? AND version = ? AND license_key = ? AND expiry_date = ? AND licensed_to = ? ''', ( datos_licencia['software'], datos_licencia['version'], datos_licencia['license_key'], datos_licencia['expiry_date'], datos_licencia['licensed_to'] )) # Obtener el resultado de la consulta resultado = cursor.fetchone() conn.close() # Verificar si se encontraron coincidencias return resultado is not None except pyodbc.Error as e: print(f"Error al verificar la licencia en la base de datos: {str(e)}") return False # Archivo de licencia cifrado archivo_licencia = 'licencia.cbs' # Frase de paso para descifrar passphrase = '172999' # Llamar a la función para leer, descifrar y validar la licencia leer_descifrar_y_validar_licencia(archivo_licencia, passphrase)