Vous êtes un agent secret essayant de communiquer avec votre patrie. Bien sûr, les informations doivent être cachées afin que personne ne laisse tomber votre message. Quoi de mieux qu'un chat? Tout le monde aime les images drôles de chats [citation nécessaire] , donc ils ne soupçonneront pas que des informations secrètes s'y cachent!
Inspiré par l'algorithme que le jeu Monaco utilise pour enregistrer les informations de niveau des niveaux partagés, il vous incombe d'écrire un programme qui a codé les informations dans le bit le moins significatif des couleurs d'une image.
Format d'encodage:
- Les 24 premiers bits déterminent la longueur de la chaîne d'octets codée restante en bits
- L'image est lue de gauche à droite et de haut en bas, commençant évidemment dans le pixel supérieur gauche
- Les canaux sont lus du rouge au vert au bleu
- Le bit le moins significatif de chaque canal est lu
- Les bits sont enregistrés dans l'ordre Big Endian
Règles:
- Votre programme prend une seule chaîne d'octets à encoder et un seul nom de fichier d'image pour l'image de base
- L'image résultante doit être sortie en tant que fichier PNG de couleur vraie
- Vous pouvez utiliser les E / S sous la forme que vous souhaitez (ARGV, STDIN, STDOUT, écriture / lecture à partir d'un fichier), tant que vous indiquez comment utiliser votre programme
- Vous devez choisir une image aléatoire d'un chat drôle et y coder votre programme pour montrer que votre programme fonctionne
- Vous pouvez supposer que vous ne disposez que d'une entrée valide, si la quantité de bits n'est pas suffisante, l'image n'est pas au format couleur véritable, l'image n'existe pas ou des problèmes similaires, vous pouvez faire ce que vous voulez
- Vous pouvez supposer que l'image fournie ne contient aucun canal alpha
- La longueur est comptée en octets UTF-8 sans BOM
Vous pouvez utiliser ce script PHP pour tester votre solution, fournir le nom du fichier PNG comme premier argument de ligne de commande:
<?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
la source
la source
Réponses:
Perl et ImageMagick (Linux),
198190Edit: Par une coïncidence, plus tôt, j'ai testé sur un ordinateur avec la version Q8 (profondeur 8 bits) d'ImageMagick installée. La version Q16 «standard» nécessite une explicite
-depth 8
sur la ligne de commande. Sous Linux, leidentify
résultat nécessite également la suppression de la nouvelle ligne. Les deux facteurs conduisent à une augmentation de la taille du code, donc je poste la version Linux (probablement Mac aussi) comme réponse, avec des correctifs appliqués, et aussi avec certains éléments Windows uniquement supprimés (conversion cr-lf, binaire vs texte, etc.). La version portable (légèrement plus longue) est publiée vers la fin.Avec de nouvelles lignes pour la lisibilité:
Courir:
Il lit à partir de STDIN, le nom du fichier image sur la première ligne, le message «secret» suit, terminé par
ctrl-D
. Le nom du fichier de sortie est d'origine avec en.png
annexe - pas très agréable, cela n'est fait que pour la brièveté.Voici une image avec des informations très secrètes cachées à l'intérieur:
Et avec quelques commentaires:
Vient ensuite la version portable, fonctionne à la fois sur Windows (à utiliser
ctrl-Z
pour terminer la saisie) et Linux, le nombre d'octets est de 244.la source
Mathematica,
255234206 octetsJ'ai vu tellement deEt puis mon ambition de jouer au golf encore plus loin a pris le dessus sur moi ...255
s en testant cela, je suis déraisonnablement heureux de la taille du code. :)C'est techniquement une fonction et non un "programme", mais là encore, c'est à peu près comment vous écrivez des "programmes" dans Mathematica, si ce concept est même valable là-bas. Appelez ça comme
Il renverra une expression d'image réelle (car c'est le moyen le plus naturel de renvoyer une image dans Mathematica), donc si vous voulez un fichier, vous devez l'exporter:
Voici l'exemple requis:
J'adorerais vous montrer le message décodé ici, mais il ne convient pas ... alors faites-le passer par le décodeur de l'OP. ;)
Btw, je pourrais le faire fonctionner avec des secrets UTF-8 pour seulement 7 octets (changer
ToCharacterCode@#
en#~ToCharacterCode~"utf8"
).Code non golfé:
la source
PHP, 530 octets
Courez comme
php 25443.php -i<input image> -o<output image> -t<file to hide>
.Et voici un exemple d'image.
Le code non golfé est masqué dans l'exemple d'image. Testé avec le décodeur OP. Désolé pour l'image de chat pas drôle.
la source
0xff
à255
.<?function
.