बिल्लियों में जानकारी छिपाना


24

आप अपने पिता के साथ संवाद करने की कोशिश कर रहे एक गुप्त एजेंट हैं। बेशक जानकारी को छिपाने की जरूरत है ताकि कोई भी ईव्स आपके संदेश को न छोड़े। एक बिल्ली की तुलना में बेहतर क्या होगा? सभी को बिल्लियों की अजीब तस्वीरें पसंद हैं [उद्धरण वांछित] , इसलिए उन्हें वहां छिपी गुप्त जानकारी पर संदेह नहीं होगा!


एल्गोरिथ्म से प्रेरित गेम मोनाको साझा स्तरों की स्तर की जानकारी को बचाने के लिए उपयोग करता है यह एक प्रोग्राम लिखने के लिए आपके कार्य है जो किसी छवि के रंगों के कम से कम महत्वपूर्ण बिट में जानकारी को एन्कोडेड करता है।

एन्कोडिंग प्रारूप:

  • पहले 24 बिट में शेष इनकोडिंग बाइट-स्ट्रिंग की लंबाई निर्धारित बिट्स
  • छवि को बाएं से दाएं और ऊपर से नीचे तक पढ़ा जाता है, जाहिर है ऊपरी बाएँ पिक्सेल में शुरू होता है
  • चैनल लाल से हरे से नीले तक पढ़े जाते हैं
  • प्रत्येक चैनल से कम से कम महत्वपूर्ण बिट पढ़ा जाता है
  • बिग एंडियन क्रम में बिट्स सहेजे गए हैं

नियम:

  • आपका प्रोग्राम एन्कोडेड होने के लिए एक सिंगल बाइट-स्ट्रिंग लेता है और बेस इमेज के लिए सिंगल इमेज फाइलनेम
  • परिणामी छवि को एक सच्चे रंग PNG फ़ाइल के रूप में सामने आना चाहिए
  • जब तक आप अपने प्रोग्राम का उपयोग करना चाहते हैं, तब तक आप (ARGV, STDIN, STDOUT, किसी फ़ाइल से लिखना / पढ़ना) में I / O का उपयोग कर सकते हैं।
  • आपको एक अजीब बिल्ली की एक यादृच्छिक छवि चुननी होगी और अपने कार्यक्रम को उसमें यह दिखाना होगा कि आपका कार्यक्रम काम करता है
  • आप यह मान सकते हैं कि आपको केवल वैध इनपुट प्रदान किया जाता है, यदि बिट्स की मात्रा पर्याप्त नहीं है, तो छवि वास्तविक रंग प्रारूप में नहीं है, छवि मौजूद नहीं है या इसी तरह की समस्याएं जो आप चाहते हैं वह कर सकती हैं।
  • आप मान सकते हैं कि प्रदान की गई छवि में कोई अल्फा चैनल नहीं है
  • लंबाई को बिना बॉम के UTF-8 बाइट्स में गिना जाता है

आप अपने समाधान का परीक्षण करने के लिए इस PHP स्क्रिप्ट का उपयोग कर सकते हैं, पहले कमांड लाइन तर्क के रूप में PNG फ़ाइल का नाम प्रदान करें:

<?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));
}

आपका विनिर्देशन कहता है "आपका कार्यक्रम एकल छवि को आधार के रूप में लेता है"। मैथेमेटिका में एक छवि वास्तव में सब कुछ की तरह एक अभिव्यक्ति है, इसलिए तकनीकी रूप से यह विनिर्देश मुझे फ़ाइल-लोडिंग कोड के बाहर करने की अनुमति देगा जो गणना करता है (इनपुट पैरामीटर छवि के फ़ाइल नाम के बजाय वास्तविक छवि होने के साथ) । यदि आप उस तरह का सामान नहीं चाहते हैं, तो आप यह निर्दिष्ट करना चाह सकते हैं कि कार्यक्रम को इनपुट के रूप में छवि का फ़ाइल नाम लेने की आवश्यकता है।
मार्टिन एंडर

4
ME helpimtrappedinacatfactory OW
TheDoctor

इसके अलावा, क्या एन्कोडिंग के लिए इस्तेमाल नहीं किए जाने वाले बिट्स को अछूता रहने की आवश्यकता है? या हम उन्हें जो कुछ भी हम चाहते हैं उसे सेट कर सकते हैं (क्योंकि यह वास्तव में छवि गुणवत्ता को प्रभावित नहीं करेगा और डिकोडिंग के लिए कोई फर्क नहीं पड़ता)?
मार्टिन एंडर

1
क्या मैं पीएनजी फ़ाइल को लोड करने और सहेजने के लिए एक गैर-अंतर्निहित लाइब्रेरी का उपयोग कर सकता हूं, जैसे कि पायथन में पीआईएल?
क्लोडिउ

1
@TimWolla बिल्ली से? इसे घर के अंदर रखें और कूड़े की ट्रे की निगरानी करें। फोटो से? यदि आप एक उच्च पर्याप्त रिज़ॉल्यूशन एक्स-रे तस्वीर लेते हैं, तो आप फ्लैश चिप में व्यक्तिगत ट्रांजिस्टर की स्थिति देख सकते हैं। मुझे यकीन है कि यह गुप्त सूचनाओं को पारित करने का सबसे कुशल तरीका होना चाहिए, हालांकि बिल्ली के पास अन्य विचार हो सकते हैं।
सोनिक एटम

जवाबों:


3

पर्ल एंड इमेजमैजिक (लिनक्स), 198 190

संपादित करें: कुछ संयोग से, पहले मैंने क्यू 8 (8 बिट डेप्थ) संस्करण के साथ एक कंप्यूटर पर परीक्षण किया था जो कि ImageMagick का संस्करण था। 'Standard' Q16 संस्करण को -depth 8कमांड लाइन पर स्पष्ट होना चाहिए । लिनक्स पर, identifyपरिणाम को हटाने के लिए भी नई लाइन की आवश्यकता होती है। दोनों कारकों में कोड आकार में वृद्धि होती है, इसलिए मैं एक उत्तर के रूप में लिनक्स (शायद मैक भी) संस्करण को लागू करता हूं, इसके साथ ही फिक्स किए गए, और कुछ विंडोज-केवल सामान हटाए गए (cr-lf रूपांतरण, बाइनरी बनाम टेक्स्ट आदि) के साथ भी। पोर्टेबल (थोड़ा लंबा) संस्करण अंत के पास पोस्ट किया गया है।

पठनीयता के लिए नई सुर्खियों के साथ:

$/=$1;
<>=~/\n/;
$_=`identify -format %wx%h $\``;
chop;
open O,"|convert -size $_ -depth 8 rgb: $`.png";
$_=`convert $\` rgb:`;
print O$_&y//\376/cr|unpack('B*',pack(NX,2048*length$').$')&y//\1/cr

चलाएँ:

perl cat.pl

यह STDIN से पढ़ता है, पहली पंक्ति में छवि फ़ाइल नाम, 'गुप्त' संदेश निम्नानुसार है ctrl-D। आउटपुट फ़ाइल नाम मूल के साथ .pngजोड़ा गया है - बहुत अच्छा नहीं है, यह केवल संक्षिप्तता के लिए किया जाता है।

यहाँ कुछ गुप्त जानकारी के साथ एक छवि छिपी है:

यहाँ छवि विवरण दर्ज करें

और कुछ टिप्पणियों के साथ:

# Undef input record separator, because we'll slurp input.

$/=$1;

# Read from STDIN, separate first line. 
# $` (prematch) contains image file name,
# $' (postmatch) - text to encode.

<>=~/\n/;

# Get IM's 'identify' output, width and height of the image. 
# Note: we don't have to separate them, \d+x\d+ string will 
# do just fine.

$_=`identify -format %wx%h $\``;
chop;

# Open output pipe - IM's 'convert' command that takes raw RGB data from 
# STDIN and writes output to PNG file. Interpolated into this command
# line is previous IM's 'identify' result. Convert wants '-size' command
# option in case of raw RGB input - for obvious reason.

open O,"|convert -size $_ -depth 8 rgb: $`.png";

# Get raw RGB data into $_.

$_=`convert $\` rgb:`;

# Last line does all the job. 

# y//\376/cr --- create string same length as $_, fill with 0xFE
# $_&y//\376/cr --- zero least significant bit for all image bytes (1).
# pack(NX,2048*length$') --- multiply by 8 (bytes to bits count) and 
#         shift left by 8 (because we'll pack long integer into 3 bytes) -
#         i.e. multiply by 2048.
# unpack('B*',pack(NX,2048*length$').$') ---- append 'secret text' to 
#       its encoded length and convert to 'binary' (consisting of 1 and 
#       0 characters) string.
# ... &y//\1/cr --- equivalent of tr/01/\0\1/. We don't have to worry 
#       that raw RGB length is larger than encoded text length, because
#       '&' truncates longer string argument (2).
# Then bitwise-'or' (1) and (2) strings.

print O$_&y//\376/cr|unpack('B*',pack(NX,2048*length$').$')&y//\1/cr

अगला पोर्टेबल संस्करण है, दोनों विंडोज पर चलता है ( ctrl-Zइनपुट समाप्त करने के लिए उपयोग करें) और लिनक्स, बाइट गिनती 244 है।

$_=do{local$/;<>};
/\n/;
$_=`identify -format %wx%h $\``;
chomp;
open I,'-|:raw',"convert $` rgb:";
open O,'|-:raw',"convert -size $_ -depth 8 rgb: $`.png";
$_=do{local$/;<I>};
print O$_&y//\376/cr|unpack('B*',pack(NX,2048*length$').$')&y//\1/cr

10

गणितज्ञ, 255 234 206 बाइट्स

मैंने इसे 255परीक्षण करते समय बहुत सारे देखे हैं , मैं कोड के आकार के बारे में अनुचित रूप से खुश हूं। :) और फिर इसे और नीचे ले जाने की मेरी महत्वाकांक्षा ने मुझे और भी बेहतरीन बना दिया ...

f=(j=ImageData[Import@#2,t="Byte"];k=(d=IntegerDigits)[j,2,8]~Flatten~2;n=1;(k[[n++,-1]]=#)&/@d[Length@#,2,24]~Join~#&[Join@@d[ToCharacterCode@#,2,8]];ArrayReshape[#~FromDigits~2&/@k,Dimensions@j]~Image~t)&

यह तकनीकी रूप से एक फ़ंक्शन है और "प्रोग्राम" नहीं है, लेकिन फिर यह बहुत ज्यादा है कि आप गणितज्ञों में "प्रोग्राम" कैसे लिखते हैं, अगर यह अवधारणा वहां भी मान्य है। जैसे बुलाओ

f["my secret", "fully/qualified/cat.png"]

यह एक वास्तविक छवि अभिव्यक्ति लौटाएगा (क्योंकि यह एक प्राकृतिक तरीका है, जो किसी चित्र को गणित में वापस करने के लिए है), इसलिए यदि आप एक फ़ाइल चाहते हैं, तो आपको इसे निर्यात करने की आवश्यकता है:

Export["output-cat.png", f["my secret", "input-cat.png"]]

यहाँ आवश्यक उदाहरण है:

यहाँ छवि विवरण दर्ज करें

मैं आपको यहां डिकोड किए गए संदेश को दिखाना पसंद करूंगा, लेकिन यह फिट नहीं है ... इसलिए इसे ओपी के डिकोडर के माध्यम से चलाएं। ;)

Btw, मैं इसे यूटीएफ -8 रहस्यों के साथ सिर्फ 7 बाइट्स (परिवर्तन ToCharacterCode@#में #~ToCharacterCode~"utf8") के लिए काम कर सकता हूं ।

अघोषित कोड:

f[secret_, filename_] := (
  bits = Join @@ IntegerDigits[ToCharacterCode[secret], 2, 8];
  bits = Join[d[Length @ bits, 2, 24], bits];
  data = ImageData[Import@#2, "Byte"];
  dims = Dimensions@data;
  data = Flatten[IntegerDigits[data, 2, 8], 2];
  m = n = 1;
  While[m <= Length @ bits,
    data[[n++, -1]] = bits[[m++]]
  ];
  Image[ArrayReshape[FromDigits[#, 2] & /@ data, dims], "Byte"]
)

"मैं आपको यहां डिकोड किए गए संदेश को दिखाना चाहूंगा, लेकिन यह फिट नहीं है ... इसलिए इसे ओपी के डिकोडर के माध्यम से चलाएं;)" - मैंने किया और यह मुझे "????????" ??? +++++++ ?? ++++++++++++++++++++ ================= ~ === ~ ============ ~ :::: ~~~~~ = [... 9773 पात्रों के लिए] "
TessellatingHeckler

1
@TellellatingHeckler, यह सही है। इसे एक मोनोसैप्ड फ़ॉन्ट में आज़माएँ और इस बात से अवगत रहें कि वहाँ UNIX शैली की नई लाइनें हैं (उदाहरण के लिए टर्मिनल में या PowerShell में कम से कम 180 वर्ण चौड़ाई के साथ प्रयास करें, या यदि आप इसे अपने ब्राउज़र में वेब स्क्रिप्ट के रूप में चला रहे हैं, तो) तब स्रोत देखें);)
मार्टिन एंडर

2
समझा! बहुत मेटा। मदद करता है कि मैं PuTTY के KiTTY संस्करण में हूं, बहुत T
TessellatingHeckler

5

PHP, 530 बाइट

<?php function p($i,$j){return str_pad(decbin($i),$j,0,0);}extract(getopt("i:o:t:"));$t=file_get_contents($t);$_=imagecreatefrompng($i);list($w,$h)=getimagesize($i);$b="";for($i=0;$i<strlen($t);)$b.=p(ord($t[$i++]),8);$l=strlen($b);$b=p($l,24).$b;$l+=24;for($i=$x=$y=0;$y<$h;$y++){for(;$x<$w;){$C=imagecolorat($_,$x,$y);$R=($C>>16)&0xff;$G=($C>>8)&0xff;$B=$C&0xff;$i<$l&&$R=$b[$i++]|$R&~1;$i<$l&&$G=$b[$i++]|$G&~1;$i<$l&&$B=$b[$i++]|$B&~1;imagesetpixel($_,$x++,$y,imagecolorallocate($_,$R,$G,$B));if($i>$l){imagepng($_,$o);die;}}}

जैसे दौड़ो php 25443.php -i<input image> -o<output image> -t<file to hide>

और यहाँ एक नमूना छवि है।

http://i.imgur.com/hevnrbm.png

नमूना छवि में अनगुल्ड कोड छिपा हुआ है। ओपी के डिकोडर के साथ परीक्षण किया गया। मजाकिया बिल्ली की तस्वीर के लिए खेद है।


1
कृपया अपने उत्तर में असंगठित कोड जोड़ें।
AL

1
आप छोटा कर सकते हैं 0xffकरने के लिए 255
टिमवोला

आप 4 बाइट्स बचा सकते हैं यदि आप छोटे टैग मानते हैं <?function:।
nyuszika7h
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.