Jesteś tajnym agentem próbującym komunikować się ze swoją ojczyzną. Oczywiście informacje muszą być ukryte, aby nikt nie podsłuchiwał Twojej wiadomości. Co byłoby bardziej odpowiednie niż kot? Wszyscy uwielbiają śmieszne zdjęcia kotów [potrzebne źródło] , więc nie będą podejrzewać ukrytych tam tajnych informacji!
Zainspirowany algorytmem, którego gra Monako używa do zapisywania informacji o poziomie wspólnych poziomów , Twoim zadaniem jest napisanie programu, który zakodował informacje w najmniej znaczącym kolorze kolorów obrazu.
Format kodowania:
- Pierwsze 24 bity określają długość pozostałego zakodowanego ciągu bajtów w bitach
- Obraz jest odczytywany od lewej do prawej i od góry do dołu, oczywiście zaczynając od lewego górnego piksela
- Kanały są odczytywane z czerwonego na zielony na niebieski
- Odczytywany jest najmniej znaczący bit z każdego kanału
- Bity są zapisywane w kolejności Big Endian
Zasady:
- Twój program wymaga jednego ciągu bajtów do zakodowania i pojedynczej nazwy pliku obrazu dla obrazu podstawowego
- Powstały obraz musi być wyprowadzony jako plik PNG o prawdziwym kolorze
- Możesz używać We / Wy w dowolnej formie (ARGV, STDIN, STDOUT, zapis / odczyt z pliku), o ile podasz sposób korzystania z programu
- Musisz wybrać losowy obraz śmiesznego kota i zakodować w nim swój program, aby pokazać, że Twój program działa
- Możesz założyć, że podano tylko prawidłowe dane wejściowe, jeśli ilość bitów nie jest wystarczająca, obraz nie jest w prawdziwym formacie kolorów, obraz nie istnieje lub podobne problemy możesz zrobić, co chcesz
- Możesz założyć, że dostarczony obraz nie zawiera żadnego kanału alfa
- Długość jest liczona w bajtach UTF-8 bez BOM
Możesz użyć tego skryptu PHP do przetestowania rozwiązania, podając nazwę pliku PNG jako pierwszy argument wiersza poleceń:
<?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
źródło
źródło
Odpowiedzi:
Perl i ImageMagick (Linux),
198190Edycja: Zbiegiem okoliczności wcześniej testowałem na komputerze z zainstalowaną wersją ImageMagick w wersji Q8 (8 bitów). „Standardowa” wersja Q16 wymaga wyraźnego podania
-depth 8
w wierszu polecenia. W systemie Linuxidentify
wynik również wymaga usunięcia znaku nowej linii. Oba czynniki prowadzą do zwiększenia rozmiaru kodu, dlatego w odpowiedzi zamieszczam wersję Linuksa (prawdopodobnie także Maca) z zastosowanymi poprawkami, a także z usuniętymi elementami tylko dla systemu Windows (konwersja cr-lf, binarna vs tekst itp.). Wersja przenośna (nieco dłuższa) jest opublikowana pod koniec.Z nowymi liniami dla czytelności:
Biegać:
Czyta ze STDIN, nazwa pliku obrazu w pierwszym wierszu, następuje komunikat „tajny”, zakończony
ctrl-D
. Nazwa pliku wyjściowego jest oryginalna z.png
dołączonym - niezbyt ładnym, jest zrobiona tylko dla zwięzłości.Oto zdjęcie, w którym ukryte są bardzo tajne informacje:
I z pewnymi komentarzami:
Dalej jest wersja przenośna, działa zarówno na systemie Windows (użyj
ctrl-Z
do zakończenia wprowadzania danych), jak i na Linuksie, liczba bajtów wynosi 244.źródło
Mathematica,
255234206 bajtówWidziałem tak wieleA potem moja ambicja, aby zagrać w golfa jeszcze bardziej, zwróciła moją uwagę ...255
sekund podczas testowania tego, jestem niesłusznie szczęśliwy z powodu rozmiaru kodu. :)Z technicznego punktu widzenia jest to funkcja, a nie „program”, ale z drugiej strony jest to sposób, w jaki piszesz „programy” w Mathematica, jeśli ta koncepcja jest tam nawet ważna. Nazwij to jak
Zwróci rzeczywiste wyrażenie obrazu (ponieważ jest to najbardziej naturalny sposób na zwrócenie obrazu w Mathematica), więc jeśli chcesz plik, musisz go wyeksportować:
Oto wymagany przykład:
Chciałbym pokazać tutaj zdekodowaną wiadomość, ale nie pasuje ... więc uruchom ją przez dekoder OP. ;)
Przy okazji, mogę sprawić, że będzie działać z sekretami UTF-8 za zaledwie 7 bajtów (zmiana
ToCharacterCode@#
na#~ToCharacterCode~"utf8"
).Nieskluczony kod:
źródło
PHP, 530 bajtów
Biegnij jak
php 25443.php -i<input image> -o<output image> -t<file to hide>
.A oto przykładowy obraz.
Nieskluczony kod jest ukryty w przykładowym obrazie. Testowane z dekoderem OP. Przepraszam za nie śmieszne zdjęcie kota.
źródło
0xff
do255
.<?function
.