Anda adalah agen rahasia yang mencoba berkomunikasi dengan tanah air Anda. Tentu saja informasi itu perlu disembunyikan sehingga tidak ada orang yang mencuri pesan Anda. Apa yang lebih cocok daripada kucing? Semua orang suka gambar lucu kucing [rujukan?] , Jadi mereka tidak akan curiga ada informasi rahasia yang bersembunyi di sana!
Terinspirasi oleh algoritme permainan yang digunakan Monako untuk menyimpan informasi level dari level bersama , tugas Anda adalah menulis program yang menyandikan informasi ke dalam warna warna yang paling tidak signifikan.
Format pengodean:
- 24 bit pertama menentukan panjang byte-string yang tersisa dalam bit
- Gambar dibaca dari kiri ke kanan dan dari atas ke bawah, jelas dimulai dari piksel kiri atas
- Saluran dibaca dari merah ke hijau ke biru
- Bit paling signifikan dari setiap saluran dibaca
- Bit disimpan dalam urutan Big Endian
Aturan:
- Program Anda membutuhkan byte-string tunggal untuk dikodekan dan nama file gambar tunggal untuk gambar dasar
- Gambar yang dihasilkan harus keluar sebagai file PNG warna asli
- Anda dapat menggunakan I / O dalam bentuk apa pun yang Anda suka (ARGV, STDIN, STDOUT, menulis / membaca dari file), selama Anda menyatakan bagaimana menggunakan program Anda
- Anda harus memilih gambar acak kucing lucu dan menyandikan program Anda ke dalamnya untuk menunjukkan bahwa program Anda berfungsi
- Anda dapat mengasumsikan bahwa Anda hanya memberikan input yang valid, jika jumlah bit tidak mencukupi, gambar tidak dalam format warna yang sebenarnya, gambar tidak ada atau masalah serupa Anda dapat melakukan apa yang Anda inginkan
- Anda dapat mengasumsikan bahwa gambar yang disediakan tidak mengandung saluran alfa
- Panjangnya dihitung dalam UTF-8 byte tanpa BOM
Anda dapat menggunakan skrip PHP ini untuk menguji solusi Anda, berikan nama file PNG sebagai argumen baris perintah pertama:
<?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
sumber
sumber
Jawaban:
Perl & ImageMagick (Linux),
198190Sunting: Secara kebetulan, sebelumnya saya menguji pada komputer dengan Q8 (kedalaman 8 bit) versi diinstal ImageMagick. Versi Q16 'Standar' membutuhkan eksplisit
-depth 8
pada baris perintah. Di Linux,identify
hasilnya juga harus menghapus baris baru. Kedua faktor menyebabkan peningkatan ukuran kode, oleh karena itu saya memposting versi Linux (mungkin Mac juga) sebagai jawaban, dengan perbaikan diterapkan, dan juga dengan beberapa hal yang hanya Windows yang dihapus (konversi cr-lf, konversi biner vs teks, dll.). Versi portabel (sedikit lebih panjang) diposting di dekat akhir.Dengan baris baru untuk keterbacaan:
Menjalankan:
Bunyinya dari STDIN, nama file gambar di baris pertama, pesan 'rahasia' berikut, diakhiri dengan
ctrl-D
. Nama file keluaran asli dengan.png
ditambahkan - tidak terlalu bagus, itu hanya dilakukan untuk singkatnya.Berikut gambar dengan beberapa informasi rahasia yang tersembunyi di dalamnya:
Dan dengan beberapa komentar:
Berikutnya adalah versi portabel, berjalan pada Windows (digunakan
ctrl-Z
untuk mengakhiri input) dan Linux, jumlah byte adalah 244.sumber
Mathematica,
255234206 byteSaya telah melihat begitu banyakDan kemudian ambisi saya untuk bermain golf lebih jauh lagi mendapatkan yang terbaik dari saya ...255
saat menguji ini, saya sangat senang tentang ukuran kode. :)Secara teknis fungsi dan bukan "program", tetapi sekali lagi ini cukup banyak bagaimana Anda menulis "program" di Mathematica, jika konsep itu bahkan berlaku di sana. Sebut saja seperti
Ini akan mengembalikan ekspresi gambar yang sebenarnya (karena itu cara paling alami untuk mengembalikan gambar di Mathematica), jadi jika Anda menginginkan file, Anda perlu mengekspornya:
Ini adalah contoh yang diperlukan:
Saya ingin menunjukkan pesan yang diterjemahkan kepada Anda di sini, tetapi tidak cocok ... jadi jalankan melalui dekoder OP. ;)
Btw, saya bisa membuatnya bekerja dengan rahasia UTF-8 hanya 7 byte (berubah
ToCharacterCode@#
menjadi#~ToCharacterCode~"utf8"
).Kode tidak dikunci:
sumber
PHP, 530 byte
Jalankan seperti
php 25443.php -i<input image> -o<output image> -t<file to hide>
.Dan inilah contoh gambar.
Kode yang tidak digabungkan disembunyikan dalam gambar sampel. Diuji dengan decoder OP. Maaf untuk gambar kucing tidak lucu.
sumber
0xff
menjadi255
.<?function
.