import datetimedef obtener_dia_mes():
today = datetime.date.today()
return today.daydef es_primo(num):
if num <= 1:
return False
elif num <= 3:
return True
elif num % 2 == 0 or num % 3 == 0:
return False
i = 5
while i * i <= num:
if num % i == 0 or num % (i + 2) == 0:
return False
i += 6
return Truedef generar_validacion(mensaje):
if len(mensaje) < 512:
return "El mensaje cifrado debe tener al menos 512 bytes"
codigo_verificacion = mensaje[:16] + mensaje[-16:]
datos = mensaje[16:-16]
dia_mes = obtener_dia_mes()
estado_actual = dia_mes
for i in range(0, len(datos), 4):
if not datos[i:i+2].isdigit():
return "La cadena no comienza con el día del mes en hexadecimal"
estado = int(datos[i:i+2], 16)
if estado % estado_actual != 0:
return "Los estados intermedios no son múltiplos del estado inicial"
if estado >= estado_actual:
return "El tercer estado no es menor que el segundo estado"
estado_actual = estado
resultado_final = sum(int(datos[i:i+2], 16) for i in range(0, len(datos), 4))
ultimos_dos_caracteres = str(resultado_final)[-2:]
if not es_primo(int(ultimos_dos_caracteres)):
return "Los últimos dos caracteres no son números primos"
return "Mensaje válido. Código de verificación: " + codigo_verificacion# Ejemplo de uso
mensaje_cifrado = "090A0B0C...ABCDE" # Reemplaza esto con tu mensaje cifrado
resultado = generar_validacion(mensaje_cifrado)
print(resultado)
Este código sigue las reglas especificadas para validar un mensaje cifrado según los criterios proporcionados. Puedes ajustarlo según tus necesidades específicas o integrarlo en tu aplicación según sea necesario.
Representación en Pseudocódigo
A continuación, se muestra el algoritmo en forma de pseudocódigo:
Función obtener_día_mes():
Devolver día del mes actual en formato hexadecimalFunción es_primo(num):
Si num es menor o igual a 1, Devolver Falso
Si num es igual a 2 o 3, Devolver Verdadero
Si num es divisible por 2 o 3, Devolver Falso
Para cada número i desde 5 hasta la raíz cuadrada de num:
Si num es divisible por i o i+2, Devolver Falso
Devolver VerdaderoFunción generar_validación(mensaje):
Si longitud de mensaje es menor que 512, Devolver "El mensaje cifrado debe tener al menos 512 bytes"
Asignar a código_verificación los primeros 16 y los últimos 16 caracteres de mensaje
Asignar a datos los caracteres entre la posición 16 y longitud-16 de mensaje
Asignar a estado_actual el resultado de obtener_día_mes()
Para cada i desde 0 hasta longitud de datos - 1 con incremento de 4:
Si los caracteres en posición i a i+1 de datos no son dígitos hexadecimales, Devolver "La cadena no comienza con el día del mes en hexadecimal"
Asignar a estado el valor entero de los caracteres en posición i a i+1 de datos en formato hexadecimal
Si estado modulo estado_actual no es cero, Devolver "Los estados intermedios no son múltiplos del estado inicial"
Si estado es mayor o igual a estado_actual, Devolver "El tercer estado no es menor que el segundo estado"
Asignar a estado_actual el valor de estado
Asignar a resultado_final la suma de los valores enteros de los caracteres en posiciones i a i+1 de datos en formato hexadecimal para cada i desde 0 hasta longitud de datos - 1 con incremento de 4
Asignar a ultimos_dos_caracteres los últimos dos caracteres de resultado_final en formato cadena
Si no es_primo(entero(ultimos_dos_caracteres)), Devolver "Los últimos dos caracteres no son números primos"
Devolver "Mensaje válido. Código de verificación: " concatenado con código_verificación
Este pseudocódigo sigue la misma lógica que la implementación en Python, pero en un formato más general y legible, que debería ser fácil de traducir a cualquier otro lenguaje de programación.
Estructura Básica de un Nodo en C
Aquí tienes la estructura básica de un nodo en C para una lista enlazada simple que almacena enteros:
#include <stdio.h>
#include <stdlib.h>// Definición de la estructura del nodo
struct Nodo {
int dato; // Dato almacenado en el nodo
struct Nodo* siguiente; // Puntero al siguiente nodo
};int main() {
// Crear un nodo
struct Nodo* nodo1 = (struct Nodo*)malloc(sizeof(struct Nodo));
// Asignar valores al nodo
nodo1->dato = 10;
nodo1->siguiente = NULL; // El siguiente nodo es NULL porque es el único nodo de la lista
// Imprimir el valor almacenado en el nodo
printf("Dato del nodo: %d\n", nodo1->dato);
// Liberar la memoria asignada al nodo
free(nodo1);
return 0;
}