mouredev /
Hello-Python
Curso para aprender el lenguaje de programación Python desde cero y para principiantes. 100 clases, 44 horas en vídeo, código, proyectos y grupo de chat. Fundamentos, frontend, backend, testing, IA...
Loading repository data…
P1NKW0LF / repository
Código de python que implementa un sistema de esteganografía
La estenografía es una técnica que se utiliza para ocultar información dentro de otro tipo de datos, como imágenes, audio o texto, de manera que la información oculta pase desapercibida para quien no conozca el método.
La estenografía en imágenes utiliza diversas técnicas para ocultar datos dentro de imágenes. Estas técnicas se basan en manipular los píxeles de la imagen de manera sutil para codificar información. Las técnicas mas usadas para esto son:
El bit menos significativo es el bit en la posición más baja dentro de un número binario. Se encuentra en el extremo derecho de la representación binaria.
Si tienes el número binario 10110101 (en decimal es 181), los bits se numeran de la siguiente manera (de derecha a izquierda):
Posición: 7 6 5 4 3 2 1 0
Número: 1 0 1 1 0 1 0 1
El cálculo de la cantidad de datos que puedes ocultar en una imagen depende de varios factores, como el tipo de imagen, la técnica de esteganografía utilizada, y la resolución de la imagen.
La capacidad de ocultación de datos en una imagen depende de la cantidad de bits que se pueden modificar sin afectar de manera perceptible a la calidad visual.
La resolución de la imagen se refiere al número de píxeles en la imagen. Para calcular la cantidad de píxeles en la imagen, multiplica la ancho de la imagen por el alto. Por ejemplo, si una imagen tiene una resolución de 1920x1080 píxeles: Cantidad de pixeles = 1920×1080 = 2,073,600 pixeles
En imágenes en formato RGB, cada píxel tiene tres componentes de color: rojo (R), verde (G) y azul (B). En una imagen estándar de 8 bits por canal, cada componente de color ocupa 8 bits. Por lo tanto, un píxel en una imagen RGB ocupa:
Bits por pixel = 8 (R) + 8 (G) + 8 (B) = 24 bits
Dependiendo de la técnica de esteganografía, puedes ocultar datos modificando los bits menos significativos (LSB) de cada componente de color. En el método de LSB por ejemplo, puedes modificar solo el bit menos significativo de cada componente de color sin que se note una diferencia visual significativa.
Bits por pixel (con LSB) = 1 (R) + 1 (G) + 1 (B) = 3 bits
Ahora sabiendo cuántos bits se pueden modificar por píxel, puedes calcular la cantidad total de datos que se pueden ocultar en toda la imagen:
Datos ocultos (en bits) = Cantidad de pixeles × Bits por pixel
Usando una resolución de 1920x1080 píxeles:
Datos ocultos = 2,073,600 × 3 = 6,220,800 bits / 8 (byte) = 777,600 bytes = 777.6 KB
Esto significa que en una imagen de 1920x1080 píxeles, puedes ocultar hasta 777.6 KB de datos utilizando el método LSB.
El umbral en el que los cambios se vuelven perceptibles depende de varios factores, como el tipo de imagen (por ejemplo, imágenes de alta resolución o de baja resolución), la técnica de esteganografía utilizada, y cuántos bits se modifican por píxel.
Este código implementa un sistema básico de esteganografía, que es la técnica de ocultar información dentro de un archivo, como una imagen. En este caso, el mensaje de texto se oculta en una imagen PNG utilizando la técnica de LSB. Se emplea el formato RGB de la imagen para ocultar bits del mensaje, y luego se puede extraer el mensaje oculto de la imagen.
Esta función se encarga de ocultar un mensaje dentro de una imagen.
imagen_path: Ruta del archivo de imagen donde se ocultará el mensaje.mensaje: El mensaje que queremos ocultar (como texto).output_path: Ruta donde se guardará la imagen con el mensaje oculto.Carga de la imagen:
img = Image.open(imagen_path).convert("RGB")
La imagen se carga utilizando la librería PIL, y se convierte a formato RGB (Red, Green, Blue) para trabajar con los valores de los colores de los píxeles.
Conversión del mensaje a binario:
mensaje_bin = ''.join(format(ord(c), '08b') for c in mensaje) + '11111111'
El mensaje de texto se convierte a binario. Cada carácter del mensaje se convierte a su representación binaria utilizando ord(c) (que obtiene el valor Unicode del carácter) y format(..., '08b') para convertirlo en una cadena binaria de 8 bits. Al final del mensaje se agrega un delimitador ('11111111') para marcar el final del mensaje oculto.
Modificación de los píxeles de la imagen:
for i in range(img_array.shape[0]):
for j in range(img_array.shape[1]):
for k in range(3):
if index < len(mensaje_bin):
nuevo_valor = (img_array[i, j, k] & 254) | int(mensaje_bin[index])
img_array[i, j, k] = nuevo_valor
index += 1
Se recorre cada píxel de la imagen. La imagen es representada como una matriz de valores RGB. En cada componente RGB (rojo, verde, azul), se utiliza la operación & 254 para borrar el bit menos significativo (el bit de menos peso) y luego se reemplaza por el siguiente bit del mensaje binario utilizando | int(mensaje_bin[index]). Esto se repite hasta que se hayan ocultado todos los bits del mensaje.
La operación & 254 es una operación a nivel de bits (bitwise), y su propósito es manipular el valor de un número binario asegurándose de que el último bit sea 0, sin afectar los otros bits. En el contexto de la esteganografía, este tipo de operación es útil para manipular los últimos bits de los valores RGB de la imagen sin alterar los otros bits.
Guardado de la imagen modificada:
nueva_img = Image.fromarray(img_array)
nueva_img.save(output_path)
Después de haber ocultado el mensaje, la imagen modificada se guarda en el archivo especificado por output_path.
extraer_mensajeEsta función se encarga de extraer el mensaje oculto de una imagen.
imagen_path: Ruta del archivo de imagen que contiene el mensaje oculto.Carga de la imagen:
img = Image.open(imagen_path)
img_array = np.array(img)
La imagen se carga de nuevo, y se convierte en una matriz de valores numéricos para poder acceder a los píxeles.
Extracción de los bits del mensaje oculto:
mensaje_bin = ''
for i in range(img_array.shape[0]):
for j in range(img_array.shape[1]):
for k in range(3):
mensaje_bin += str(img_array[i, j, k] & 1)
Se recorre cada píxel de la imagen y, para cada componente RGB, se obtiene el bit menos significativo utilizando & 1. Estos bits se concatenan para formar la cadena binaria que representa el mensaje.
Conversión de los bits binarios a texto:
mensaje = ''
for i in range(0, len(mensaje_bin), 8):
byte = mensaje_bin[i:i+8]
if byte == '11111111':
break
mensaje += chr(int(byte, 2))
Una vez que se tienen todos los bits del mensaje oculto, se agrupan de 8 en 8 para formar los bytes del mensaje original. Luego, cada byte se convierte a su correspondiente carácter utilizando chr(int(byte, 2)). Si se encuentra el delimitador '11111111' (que indica el fin del mensaje), el proceso de extracción termina.
En la parte de [i:i+8] los ':' son un slicing lo que permite seleccionar un subconjunto de lo
Selected from shared topics, language and repository description—not editorial ratings.
mouredev /
Curso para aprender el lenguaje de programación Python desde cero y para principiantes. 100 clases, 44 horas en vídeo, código, proyectos y grupo de chat. Fundamentos, frontend, backend, testing, IA...
mouredev /
Ruta de estudio basada en ejercicios de código de la comunidad MoureDev para aprender y practicar lógica usando cualquier lenguaje de programación.
mouredev /
Ejercicios de código semanales en 2023 de la comunidad MoureDev para practicar lógica en cualquier lenguaje de programación.
turicas /
Backend do Brasil.IO (para código dos scripts de coleta de dados, veja o link na página de cada dataset)
luizomf /
Códigos do meu novo curso de Python.
basedosdados /
⚙️ Código de manutenção do datalake (metadados e pacotes de acesso) | 📖 Docs: https://basedosdados.org/docs/home