Eres un agente secreto que intenta comunicarte con tu patria. Por supuesto, la información debe estar oculta para que nadie deje caer su mensaje. ¿Qué sería más adecuado que un gato? ¡A todos les encantan las fotos divertidas de gatos [cita requerida] , por lo que no sospecharán que se esconde información secreta allí!
Inspirado por el algoritmo que utiliza el juego Mónaco para guardar la información de nivel de los niveles compartidos , es su tarea escribir un programa que codifique la información en el bit menos significativo de los colores de una imagen.
Formato de codificación:
- Los primeros 24 bits determinan la longitud de la cadena de bytes codificada restante en bits
- La imagen se lee de izquierda a derecha y de arriba a abajo, obviamente comenzando en el píxel superior izquierdo
- Los canales se leen de rojo a verde a azul.
- Se lee el bit menos significativo de cada canal
- Los bits se guardan en orden Big Endian
Reglas:
- Su programa toma una sola cadena de bytes para codificar y un solo nombre de archivo de imagen para la imagen base
- La imagen resultante debe aparecer como un archivo PNG de color verdadero
- Puede usar E / S en cualquier forma que desee (ARGV, STDIN, STDOUT, escritura / lectura de un archivo), siempre que indique cómo usar su programa
- Debes elegir una imagen aleatoria de un gato divertido y codificar tu programa en ella para mostrar que funciona
- Puede suponer que solo se le proporciona una entrada válida, si la cantidad de bits no es suficiente, la imagen no está en formato de color verdadero, la imagen no existe o problemas similares, puede hacer lo que quiera
- Puede suponer que la imagen proporcionada no contiene ningún canal alfa
- La longitud se cuenta en UTF-8 bytes sin BOM
Puede usar este script PHP para probar su solución, proporcione el nombre del archivo PNG como primer argumento de línea de comando:
<?php
if ($argc === 1) die('Provide the filename of the PNG to read from');
$imageSize = @getimagesize($argv[1]);
if ($imageSize === false) die('Not a PNG file');
list($width, $height) = $imageSize;
$image = imagecreatefrompng($argv[1]);
$read = 0;
$bits = '';
for ($y = 0; $y < $height; $y++) {
for ($x = 0; $x < $width; $x++) {
$colorAt = imagecolorat($image, $x, $y);
$red = ($colorAt >> 16) & 0xFF;
$green = ($colorAt >> 8) & 0xFF;
$blue = ($colorAt >> 0) & 0xFF;
$bits .= ($red & 1).($green & 1).($blue & 1);
$read += 3;
if ($read == 24) {
$length = (int) bindec($bits);
$bits = '';
}
else if ($read > 24 && ($read - 24) > $length) {
$bits = substr($bits, 0, $length);
break 2;
}
}
}
if (strlen($bits) !== $length) die('Not enough bits read to fulfill the length');
$parts = str_split($bits, 8);
foreach ($parts as $part) {
echo chr(bindec($part));
}
code-golf
image-processing
steganography
TimWolla
fuente
fuente
Respuestas:
Perl y ImageMagick (Linux),
198190Editar: Por alguna coincidencia, antes probé en una computadora con la versión Q8 (8 bits de profundidad) de ImageMagick instalada. La versión 'estándar' Q16 requiere explícito
-depth 8
en la línea de comando. En Linux, elidentify
resultado requiere que se elimine la nueva línea también. Ambos factores conducen al aumento del tamaño del código, por lo tanto, publico la versión de Linux (probablemente Mac también) como respuesta, con correcciones aplicadas, y también con algunas cosas solo de Windows eliminadas (conversión cr-lf, binario vs texto, etc.). La versión portátil (un poco más larga) se publica cerca del final.Con nuevas líneas de legibilidad:
Correr:
Se lee desde STDIN, el nombre del archivo de imagen en la primera línea, sigue el mensaje 'secreto', terminado con
ctrl-D
. El nombre del archivo de salida es original con.png
adjunto, no muy agradable, solo se hace por brevedad.Aquí hay una imagen con información muy secreta oculta:
Y con algunos comentarios:
La siguiente es la versión portátil, se ejecuta tanto en Windows (usar
ctrl-Z
para terminar la entrada) como en Linux, el recuento de bytes es 244.fuente
Mathematica,
255234206 bytesHe visto tantosY luego mi ambición de jugar golf aún mejor me ganó ...255
mensajes de correo electrónico mientras probaba esto, estoy excesivamente contento con el tamaño del código. :)Técnicamente es una función y no un "programa", pero, de nuevo, esto es más o menos como escribir "programas" en Mathematica, si ese concepto es válido allí. Llámalo como
Devolverá una expresión de imagen real (porque esa es la forma más natural de devolver una imagen en Mathematica), por lo que si desea un archivo, debe exportarlo:
Aquí está el ejemplo requerido:
Me encantaría mostrarte el mensaje decodificado aquí, pero no encaja ... así que ejecútalo a través del decodificador del OP. ;)
Por cierto, podría hacer que funcione con secretos UTF-8 por solo 7 bytes (cambiar
ToCharacterCode@#
a#~ToCharacterCode~"utf8"
).Código sin golf:
fuente
PHP, 530 bytes
Corre como
php 25443.php -i<input image> -o<output image> -t<file to hide>
.Y aquí hay una imagen de muestra.
El código no oculto está oculto en la imagen de muestra. Probado con el decodificador de OP. Perdón por la imagen no divertida del gato.
fuente
0xff
a255
.<?function
.