Volver a actualizaciones
ActualizadaSep 2, 2026

jdvrif — Actualizado!

Herramienta de esteganografía para imágenes JPG

Compartir

jdvrif

jdvrif es una herramienta de esteganografía de línea de comandos rápida y fácil de usar para ocultar y extraer cualquier tipo de archivo mediante una imagen JPG.

También existe una edición web, que puedes usar de inmediato, como una alternativa conveniente a descargar y compilar el código fuente de la CLI. Las cargas de archivos web están limitadas a 20MB.

Un port experimental en Rust jdvrif-rs está disponible para aquellos interesados en ese lenguaje.

Demo Image
Imagen de demostración: "Un lugar de ocultamiento" / PIN: 2190398302048725932

A diferencia del común método de esteganografía LSB de ocultar datos dentro de los píxeles de una imagen de portada, jdvrif oculta principalmente datos dentro de segmentos de aplicación de una imagen JPG (ICC, EXIF, XMP, etc.).

La excepción a esto es el modo de ocultamiento para la plataforma Reddit (-r), donde usamos el método de esteganografía QIM (Modulación de Índice de Cuantización en el dominio DCT de JPEG), ya que es el único método de almacenamiento que funciona actualmente para Reddit.

Puedes ocultar cualquier tipo de archivo de hasta 2GB en el modo de ocultamiento predeterminado, aunque otros modos de ocultamiento para plataformas y sitios compatibles (listados a continuación) tienen sus propios límites de tamaño mucho más pequeños y *otros requisitos.

Para una mayor capacidad de almacenamiento y mejor seguridad, tu archivo de datos incrustado se comprime con libdeflate/zlib — a menos que ya sea un tipo de archivo comprimido de más de 10 MB — y se cifra con XChaCha20-Poly1305 usando la biblioteca criptográfica libsodium.

jdvrif se deriva en parte de la técnica implementada por el investigador de seguridad David Buchanan.

Compilación y Uso (Linux)

$ sudo apt update
$ sudo apt install g++ cmake ninja-build util-linux libsodium-dev libturbojpeg0-dev zlib1g-dev libdeflate-dev

$ chmod +x compile_jdvrif.sh
$ ./compile_jdvrif.sh

$ sudo cp jdvrif /usr/bin
$ jdvrif 

Usage: jdvrif conceal [-b] <cover_image> <secret_file>
       jdvrif recover <cover_image>  
       jdvrif --info

$ jdvrif conceal your_cover_image.jpg your_secret_file.doc
 
Platform compatibility for output image:-

  ✓ X-Twitter
  ✓ Tumblr
  ✓ Mastodon
  ✓ Pixelfed
  ✓ PostImage
  ✓ ImgBB
  ✓ ImgPile
  ✓ Flickr
  
Saved "file-embedded" JPG image: jrif_4e87c566c.jpg (143029 bytes).

Recovery PIN: [***2166776980318349924***]

Important: Keep your PIN safe, so that you can extract the hidden file.

Complete!
        
$ jdvrif recover jrif_4e87c566c.jpg

PIN: *******************

Extracted hidden file: your_secret_file.doc (6165 bytes).

Complete! Please check your file.

Plataformas Compatibles

******************
Nota: Bluesky ahora guarda las imágenes como WEBP de forma predeterminada.

Para guardar una imagen como JPG, de modo que aún puedas recuperar datos ocultos con jdvrif.
Primero haz clic en la imagen dentro de la publicación para abrirla, luego haz clic derecho sobre la imagen. En el menú, selecciona Abrir imagen en una pestaña nueva.

Selecciona la nueva pestaña y, dentro de la barra de direcciones, ve al final de la dirección y agrega @jpg y luego presiona Enter.
Haz clic derecho en la imagen y, en el menú, selecciona Guardar imagen como...

Tu imagen ahora debería descargarse como JPG, que funcionará con jdvrif.

Si deseas una herramienta para ocultar datos usando imágenes WEBP para publicar en Bluesky, puedes usar mi herramienta CLI de esteganografía WEBP wbpdv
******************

Límite de tamaño de publicación medido por el tamaño combinado de la imagen de portada + archivo de datos comprimido:

Flickr (200MB), ImgPile (100MB), ImgBB (32MB),
PostImage (32MB), Pixelfed (15MB).

Límite de tamaño medido solo por el tamaño del archivo de datos comprimido:

Mastodon (~6MB), Tumblr (~64KB), X-Twitter (~10KB).

Por ejemplo, con Mastodon, si tu imagen de portada es de 1MB, aún puedes incrustar un archivo de datos de hasta el límite de ~6MB.

*Otros: La plataforma Bluesky tiene límites de tamaño separados para la imagen de portada y el archivo de datos oculto comprimido:

Bluesky (opción -b). Límite máximo de tamaño de imagen de portada (2,000,000 bytes / ~1.9MB). Límite máximo de tamaño de tu archivo de datos oculto comprimido (carga útil) (~171KB).

La imagen de portada final incrustada (imagen de portada + archivo oculto) no debe exceder los 2,000,000 bytes (~1.9MB). El script "create_bsky_post.py" es necesario para publicar imágenes en Bluesky. Más información sobre este script más abajo en la página.

Reddit (opción -r). Si bien la plataforma Reddit tiene un límite de tamaño de carga de imágenes de 20MB, la capacidad de almacenamiento de datos para la imagen de portada es mucho menor y depende del tamaño de las dimensiones de la imagen.

Por ejemplo, una imagen de portada con dimensiones 1024x1024 puede almacenar solo ~6KB de datos, una imagen con dimensiones 4096x4096 puede almacenar ~109KB y una imagen con dimensiones máximas 6324×6324 puede almacenar ~254KB.

Para plataformas como X-Twitter, Reddit y Tumblr, que tienen límites de tamaño de datos pequeños, es posible que desees centrarte en datos que se compriman bien, como archivos de texto, etc.

https://github.com/user-attachments/assets/c8c38e6d-ea23-4d67-98d9-cebdcd82b449

https://github.com/user-attachments/assets/88aaa5f7-3272-4d0c-aa59-1a5bfe2f08dc

Argumentos de modo de jdvrif:

conceal - Comprime, cifra e incrusta tu archivo de datos secreto dentro de una imagen de portada JPG.
recover - Descifra, descomprime y extrae el archivo de datos oculto de una imagen de portada JPG.

Opciones de plataforma del modo conceal de jdvrif:

"-r" Para crear imágenes JPG "con archivo incrustado" compatibles para publicar en la plataforma Reddit, debes usar la opción -r con el modo conceal.

$ jdvrif conceal -r my_image.jpg hidden.doc

Estas imágenes solo son compatibles para publicar en Reddit. Tu archivo de datos incrustado se eliminará si se publica en una plataforma diferente.

Al guardar/descargar una imagen de Reddit, asegúrate de hacer clic en la imagen dentro de la publicación para expandirla completamente antes de guardarla.

https://github.com/user-attachments/assets/9f1b4607-e7f1-4c5f-8929-b42c1a85bb88

"-b" Para crear imágenes JPG "con archivo incrustado" compatibles para publicar en la plataforma Bluesky, debes usar la opción -b con el modo conceal.

$ jdvrif conceal -b my_image.jpg hidden.doc

Estas imágenes solo son compatibles para publicar en Bluesky. Tu archivo de datos incrustado se eliminará si se publica en una plataforma diferente.

También debes usar el script de Python create_bsky_post.py (que se encuentra en la carpeta src/bsky del repositorio) para publicar la imagen en Bluesky. No funcionará si publicas imágenes en Bluesky a través del sitio web del navegador o la aplicación móvil.

Para usar el script, deberás crear una contraseña de aplicación desde tu cuenta de Bluesky.

Consulta el script create_bsky_post.py en la carpeta src/bsky para ver algunos ejemplos básicos de uso.

https://github.com/user-attachments/assets/b4c72ea7-40e3-49b0-89aa-ae2dd8ccccb9

Software y Recursos de Terceros

Aplicaciones principales

  • libsodium — generación criptográfica aleatoria, derivación de claves Argon2id y flujos secretos XChaCha20-Poly1305. Vinculado dinámicamente como biblioteca del sistema.

    Licencia: Licencia ISC

    Copyright (c) 2013–2026 Frank Denis.

  • libjpeg-turbo — procesamiento JPEG y transformación sin pérdida. Vinculado dinámicamente como biblioteca del sistema.

    Este software se basa en parte en el trabajo del Independent JPEG Group.

    Licencias: Licencia del Independent JPEG Group, Licencia BSD Modificada de 3 Cláusulas, y Licencia zlib.

    Copyright © 1991–2020 Thomas G. Lane y Guido Vollbeding.

    Copyright © 2009–2023 D. R. Commander. Todos los derechos reservados.

    Copyright © 2015 Viktor Szathmáry. Todos los derechos reservados.

  • zlib — Compresión y descompresión zlib en streaming. Vinculado dinámicamente como biblioteca del sistema.

    Licencia: Licencia zlib

    Copyright (C) 1995–2026 Jean-loup Gailly y Mark Adler.

  • libdeflate — Compresión rápida de formato zlib de búfer completo. Vinculado dinámicamente como biblioteca del sistema.

    Licencia: MIT

    Copyright 2016 Eric Biggers.

    Copyright 2024 Google LLC.

Código y recursos incorporados

Script auxiliar opcional para publicar en Bluesky

  • Bryan Newbold / ATProto Hacker Cookbook — create_bsky_post.py — Base para el fork del script auxiliar para publicar en Bluesky (src/bsky/bsky_post.py). Para referencia, consulta la copia del Cookbook

    Licencia: CC0 1.0 Universal.

  • Requests — Solicitudes HTTP y API de Bluesky.

    Licencia: Apache 2.0 / NOTICE

    Copyright 2019 Kenneth Reitz.

  • Beautiful Soup 4 — Análisis de metadatos HTML y Open Graph.

    Licencia: MIT

    Copyright (c) Leonard Richardson.

  • Pillow — Validación de imágenes, dimensiones y manejo de relación de aspecto.

    Licencia: MIT-CMU

    Copyright PIL © 1997–2011 Secret Labs AB y © 1995–2011 Fredrik Lundh y colaboradores.

    Copyright Pillow © 2010 Jeffrey "Alex" Clark y colaboradores.

Categorías