Proyecto Esteganografia 1 Alejandro Zuñiga
Dia 1
18 mayo 2025
El día de hoy nos hemos reunido de manera virtual mediante la plataforma Google Meet para revisar detalladamente el proyecto y hacer un plan sobre cómo pensamos realizar el proyecto.
Hemos investigado profundamente qué es la esteganografía e investigamos un poco sobre cada función y tener un poco más claro qué tenemos que hacer, cómo funciona cada función y tener un poco más claro el proceso de codificación.
Decidimos que cada tarea asignada sería realizada en orden y tomando en cuenta la investigación anteriormente hecha.
Tenemos como idea principal la asignación de tareas, tomando en cuenta el marco de trabajo de tipo Scrum. Este tipo de marco nos ayuda con la elaboración de una manera más individual y más ordenada.
Hemos decidido que la mejor manera de realizar las funciones sería dividiéndolas para posteriormente revisarlas en reuniones, conversarlas, mejorarlas y revisarlas.
Además, establecimos todos los días trabajar en este código para evitar atrasos y errores, y trabajarlo de una manera más ordenada.
En resumen, el día de hoy investigamos acerca del proyecto y funciones, establecimos un orden para trabajar mientras avanzamos las funciones y la documentación externa.
Dia 2
19 mayo 2025
El día de hoy pudimos avanzar con la creación del cronograma, el cual vamos a actualizar el día que finalicemos las funciones y el día que entreguemos el proyecto. Esto porque decidimos que, a partir de mañana, se estará trabajando únicamente en las funciones. El día que las terminemos, nos reuniremos para realizar los ensambles, revisar el código y probarlo. Por lo tanto, ayer y hoy fueron días de planeación.
Además, el día de hoy también se hizo investigación acerca de temas que no habíamos cubierto en su totalidad y de dudas que surgieron. Esto para tratar de dejar lo más claro posible todo acerca del proyecto y enfocarnos únicamente en la creación del código durante estos próximos días. Tenemos contemplado que duraremos entre 4 y 5 días creando el código, lo cual es un tiempo suficiente para terminar las funciones, y tendríamos 3 días para detallar, mejorar aspectos y tratar de que todo se cumpla para la fecha de entrega.
Como lo comenté, en la reunión de hoy nos enfocamos en la aclaración de dudas, un análisis del proyecto e investigación, además de la elaboración del cronograma, que será una ayuda muy grande para nuestro orden.
Hoy fue un día en el que me dediqué por completo al desarrollo de la función 7: "Ocultar un mensaje en los metadatos de un archivo pdf".
Antes de comenzar la codificación de dicha función, hice una investigación para entender mejor cómo funcionan los metadatos en los archivos pdf. En resumen, los metadatos son información adicional almacenada dentro del archivo y no son visibles al usuario. El objetivo de esta función es aprovechar esa área para ocultar información dentro de esa sección oculta.
Decidí hacer dos funciones para cada opción: una para ocultar mensajes dentro de un pdf y otra para recuperar un mensaje dentro de un pdf.
En la primera opción, lo primero que se hace es pedir la ruta del pdf y el mensaje que se desea ocultar. Después, el código verifica si el archivo existe; en caso de no existir, el proceso se detiene para evitar errores. Si la ruta sí existe, el código procede a leer el pdf con la librería PdfReader y copia todas las páginas al nuevo documento usando PdfWriter.
Ahora, para insertar el mensaje dentro del PDF y que no se vea, se utiliza add_metadata, que es una función proporcionada por la librería PyPDF2 y que permite agregar o modificar los metadatos de un PDF bajo una clave que llamé "/Mensaje Secreto".
Finalmente, el archivo se guarda en la misma ruta, pero con la palabra "Modificado" al final del nombre.
La función complementaria, que permite recuperar el mensaje, solicita la ruta del archivo, valida su existencia y accede a los metadatos del PDF para buscar la clave personalizada que contiene el mensaje secreto. En caso de encontrarla, se muestra al usuario, y si no se encuentra, se informa que no hay ningún mensaje oculto.
En conclusión, me sentí satisfecho con la creación de hoy, ya que no solo cumple su función con robustez, sino que también me ayudó a aprender más sobre los metadatos.
Además, todos los casos de prueba funcionaron con éxito.
Hoy únicamente me encargué de la función 8, "Análisis de metadatos en PDF", la cual tiene como objetivo detectar posibles intentos de ocultamiento de información dentro de los metadatos del documento.
Antes que nada, investigué un poco sobre cómo funciona y para entender mejor qué tipo de comportamientos pueden considerarse sospechosos en los metadatos de un PDF. Encontré que es posible ocultar información en campos como el título, autor, asunto o palabras clave, aprovechando que estos suelen ser inspeccionados con poca frecuencia.
La función, creada con el nombre de "analizarMetadatosPdf", le pide al usuario la ruta del archivo PDF a analizar y una lista de palabras inusuales, que define el usuario.
Al ejecutar la función, lo primero que hace, al igual que la función 7, es verificar la existencia del archivo. En caso de no encontrarse, se muestra un mensaje y la función termina. En caso de existir, se carga con PdfReader y se accede a sus metadatos a través del atributo metadata.
El código realiza 3 tipos de análisis:
-
Detección de texto largo: por cada metadato, si su valor es una cadena y tiene más de 50 caracteres, se considera sospechoso.
-
Palabras clave inusuales: el usuario puede especificar palabras que no deberían aparecer en un archivo normal, como "clave", "oculto", "secreto", entre otras. Si alguna de estas aparece dentro de los metadatos, la función lo reporta.
-
Códigos binarios o hexadecimales: se cuentan cuántos caracteres binarios o hexadecimales hay en el valor de cada metadato, y en caso de haber más de 50, se considera que hay un mensaje codificado.
En mi opinión, esta fue una función más complicada, ya que el contexto que nos otorgaron era muy reducido, pero pude terminarla bien y fue interesante ver una herramienta tan flexible.
Con esta función terminada, y pequeños avances en la documentación externa, daré por finalizada la tarea de hoy.
Dia 6
23 mayo 2025
La creación de este código fue un tanto curiosa, ya que en un principio lucía como que iba a ser una función muy extensa y muy complicada.
Primero tuve que investigar acerca de los caracteres invisibles llamados Unicode. Estos existen dentro de una cadena de texto pero no se ven visualmente. Los cuales son:
- \u200B (Zero Width Space)
- \u200C (Zero Width Non-Joiner)
- \u200D (Zero Width Joiner)
- \u2060 (Word Joiner)
Estos caracteres se pueden utilizar de forma maliciosa para ocultar información y manipular textos digitales.
En un principio, como creí que iba a ser una función muy extensa, traté de hacerla extensa, probando hasta que pudiera funcionar, y después de un par de horas, un video con información muy útil me ayudó a realizar el código. El video me explicaba más a detalle cómo funcionan los caracteres Unicode y cómo implementarlos de una manera más efectiva y sencilla, y a partir de ahí todo fue más fluido.
Ordené en una lista los cuatro principales caracteres invisibles, después se recorre cada uno de ellos en el texto ingresado y se agrega en una lista llamada "encontrados", que almacena los caracteres invisibles usando repr que es una herramienta que muestra caracteres especiales.
De esta tarea aprendí que lo que parece difícil a veces se resuelve fácil y aprendí a mejorar mis habilidades de resolución de problemas.
Mañana continuaré con la función 10 y trataré de hacerlo más productivo.
Dia 7
24 mayo 2025
Para finalizar con las funciones hoy trabajé únicamente con la función 10 que al igual que la 8 los problemas de tamaño me detuvieron un poco más.
Antes que nada tuve que investigar acerca del código hash que es una función que transforma cualquier texto en una secuencia única de caracteres. Además en Python viene incorporada una librería que es indispensable y útil a la hora de realizar esta función y trabajar con hash, la función se llama hashlib. Gracias a esta librería me permitió hacer cada función en un par de líneas.
Para esta función hice 2, las cuales llamé verificarHashMensajeOriginal que recibe un mensaje y devuelve su hash y verificarMensajeRecuperado que recibe el mensaje recuperado y el hash original, calcula el nuevo hash y lo compara. En caso de coincidir el caso está intacto y en caso de que no coincidan se devuelve un mensaje que indica que fue alterado. Gracias a esta librería me permitió hacer cada función en un par de líneas.
Si bien al inicio me demoré en crear esta función debido a que no estaba informado, después de entender bien cómo funciona, el código surgió en cuestión de minutos lo cual me permitió el día de hoy trabajar y avanzar en la documentación externa, probar los códigos y estudiarlo.
El día de hoy, Ian y yo nos reunimos para trabajar juntos, ya que ayer ambos finalizamos nuestras respectivas funciones y las probamos individualmente. Hoy nos enfocamos principalmente en el ensamble final del proyecto, lo cual resultó ser un proceso más tedioso de lo que esperábamos. Aunque algunas funciones funcionaban correctamente, otras presentaban errores al ser integradas dentro del menú principal (función número 11). Estos errores eran, en su mayoría, básicos y fácilmente prevenibles, pero debido a nuestra inexperiencia, tuvimos que invertir tiempo adicional en identificarlos y solucionarlos. Este contratiempo hizo que avanzáramos más lento de lo que habíamos planeado.
Además, trabajamos en la documentación externa del proyecto, un proceso extenso pero no necesariamente complicado. Implicó revisar una gran cantidad de detalles y asegurarnos de incluir toda la información necesaria de forma clara y ordenada. Sin embargo, como el ensamble final aún no estaba funcionando completamente, tuvimos que posponer dos aspectos clave de la documentación: el manual de usuario y las pruebas de funcionalidad.
A pesar de los obstáculos, sentimos que hoy tuvimos un buen progreso. Estimamos que hemos completado aproximadamente un 70% tanto del ensamble final como de la documentación externa. Decidimos, por el momento, incluir en la documentación solo las funciones que han demostrado funcionar correctamente en nuestras pruebas, para evitar inconsistencias.
Para el día de mañana queremos finalizar la documentación externa, terminar el ensamble completo del proyecto y dedicar un buen tiempo a revisar cada parte cuidadosamente. También planeamos mejorar detalles como los nombres de las funciones, los comentarios en el código y el aspecto general del proyecto, con el fin de entregar una versión más pulida y ordenada.
En resumen, aunque el día fue más desafiante de lo que esperábamos, logramos superar varios obstáculos importantes. Mañana será el día decisivo para cerrar con éxito este proyecto.
Dia 9
26 mayo 2025
El día de hoy, por fin logramos terminar completamente tanto la documentación externa como el ensamble final del proyecto. Aunque la documentación externa nos tomó un poco más de tiempo del que habíamos estimado, logramos completarla, cuidando los detalles y asegurándonos de que cada sección estuviera bien explicada y organizada. En cuanto al ensamble final, hoy el trabajo fue mucho más fluido, ya que lo habíamos dejado bastante avanzado desde ayer. Eso nos permitió enfocarnos en pulir los últimos detalles sin contratiempos mayores.
Además, nos reunimos nuevamente de forma virtual para revisar todo lo que quedaba pendiente. Afortunadamente, los aspectos que faltaban eran relativamente sencillos: ajustes menores, organización de archivos y pruebas rápidas de funcionalidad. En general, fue una sesión de trabajo bastante eficiente, ya que ambos sabíamos lo que quedaba por hacer y lo ejecutamos con agilidad.
Reflexionando sobre el proceso, sentimos que este proyecto nos ayudó a crecer en muchos aspectos. No solo fortalecimos nuestras habilidades de codificación y nuestra capacidad para resolver problemas técnicos, sino que también mejoramos en cuanto a planificación, trabajo en equipo y toma de decisiones bajo presión. Fue una experiencia completa que nos exigió tanto a nivel técnico como personal. Sin duda, creemos que este proyecto nos aportó mucho valor como personas y, especialmente, como futuros profesionales en el área de la programación.
Para el día de mañana, que está destinado a la entrega final, únicamente tenemos contemplado elaborar el cronograma definitivo, completar la bitácora, hacer una última revisión general del proyecto, esta vez menos detallada, enfocándonos más en la presentación final, y finalmente entregar el trabajo.
En resumen, estamos muy satisfechos con los resultados y con todo lo que hemos aprendido a lo largo del desarrollo. Ha sido un camino retador, pero también enriquecedor.
Finalmente, el día de hoy no teníamos tareas programadas del proyecto, más que avanzar con la bitácora.
Nos reunimos de forma presencial para revisar el proyecto y probar función por función, asegurándonos de que no hubiera errores. Afortunadamente, no encontramos ningún problema y todo funcionó correctamente.
Además, pudimos completar el diagrama de Gantt satisfactoriamente, lo que nos deja únicamente con la entrega final del proyecto.
Comentarios
Publicar un comentario