Você é um agente secreto tentando se comunicar com sua pátria. É claro que a informação precisa estar oculta para que ninguém escute a sua mensagem. O que seria mais adequado do que um gato? Todo mundo adora fotos engraçadas de gatos [carece de fontes?] , Para que eles não vão suspeitar informações esconderijo secreto lá!
Inspirado no algoritmo que o jogo Monaco usa para salvar as informações de níveis compartilhados , é sua tarefa escrever um programa que codifique as informações nas partes menos significativas das cores de uma imagem.
Formato de codificação:
- Os primeiros 24 bits determinam o comprimento da cadeia de bytes codificada restante em bits
- A imagem é lida da esquerda para a direita e de cima para baixo, obviamente começando no pixel superior esquerdo
- Os canais são lidos de vermelho para verde e azul
- O bit menos significativo de cada canal é lido
- Os bits são salvos na ordem Big Endian
Regras:
- Seu programa usa uma única sequência de bytes para ser codificada e um nome de arquivo de imagem único para a imagem base
- A imagem resultante deve ser exibida como um arquivo PNG de cor verdadeira
- Você pode usar E / S da forma que desejar (ARGV, STDIN, STDOUT, gravação / leitura de um arquivo), desde que indique como usar seu programa
- Você deve escolher uma imagem aleatória de um gato engraçado e codificar seu programa para mostrar que seu programa funciona
- Você pode presumir que você recebeu apenas uma entrada válida, se a quantidade de bits não for suficiente, a imagem não estiver no formato de cores verdadeiras, a imagem não existir ou problemas semelhantes, você pode fazer o que deseja
- Você pode assumir que a imagem fornecida não contém nenhum canal alfa
- O comprimento é contado em bytes UTF-8 sem BOM
Você pode usar esse script PHP para testar sua solução, fornecer o nome do arquivo PNG como o primeiro argumento da linha 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
fonte
fonte
Respostas:
Perl e ImageMagick (Linux),
198190Edit: Por alguma coincidência, eu testei anteriormente em um computador com a versão Q8 (profundidade de 8 bits) do ImageMagick instalada. A versão Q16 'padrão' requer explícita
-depth 8
na linha de comando. No Linux, oidentify
resultado requer que a nova linha seja removida também. Ambos os fatores levam ao aumento do tamanho do código, portanto, eu posto a versão Linux (provavelmente Mac também) como resposta, com as correções aplicadas e também com algumas coisas somente para Windows removidas (conversão cr-lf, binário vs texto etc.). A versão portátil (um pouco mais longa) é publicada perto do fim.Com novas linhas para facilitar a leitura:
Corre:
Ele lê STDIN, nome do arquivo de imagem na primeira linha, a mensagem 'secreta' segue e termina com
ctrl-D
. O nome do arquivo de saída é original com.png
anexado - não é muito bom, é feito apenas por uma questão de brevidade.Aqui está uma imagem com algumas informações muito secretas ocultas:
E com alguns comentários:
Em seguida, é a versão portátil, roda no Windows (use
ctrl-Z
para finalizar a entrada) e no Linux; a contagem de bytes é 244.fonte
Mathematica,
255234206 bytesEu já vi tantosE então a minha ambição de jogar golfe ainda me tirou o melhor ...255
s ao testar isso, estou irracionalmente feliz com o tamanho do código. :)Tecnicamente, é uma função e não um "programa", mas, novamente, é assim que você escreve "programas" no Mathematica, se esse conceito é válido até lá. Chame como
Ele retornará uma expressão de imagem real (porque essa é a maneira mais natural de retornar uma imagem no Mathematica); portanto, se você quiser um arquivo, precisará exportá-lo:
Aqui está o exemplo necessário:
Eu adoraria mostrar a mensagem decodificada aqui, mas ela não se encaixa ... então execute-a no decodificador do OP. ;)
Btw, eu poderia fazê-lo funcionar com segredos UTF-8 por apenas 7 bytes (mudar
ToCharacterCode@#
para#~ToCharacterCode~"utf8"
).Código não destruído:
fonte
PHP, 530 bytes
Corra como
php 25443.php -i<input image> -o<output image> -t<file to hide>
.E aqui está uma imagem de amostra.
O código não-oculto está oculto na imagem de amostra. Testado com o decodificador do OP. Desculpe pela imagem do gato não é engraçado.
fonte
0xff
para255
.<?function
.