বিড়ালগুলিতে তথ্য গোপন করা হচ্ছে


24

আপনি আপনার পিতৃভূমির সাথে যোগাযোগের চেষ্টা করছেন এমন একটি গোপন এজেন্ট। অবশ্যই তথ্যগুলি লুকিয়ে রাখা দরকার যাতে আপনার বার্তাটি কেউই ফেলে না। একটি বিড়াল চেয়ে ভাল উপযুক্ত কি হতে পারে? প্রত্যেকে বিড়ালের মজার ছবি পছন্দ করে [উদ্ধৃতি আবশ্যক] , সুতরাং তারা সেখানে গোপন তথ্য লুকিয়ে রাখার সন্দেহ করবে না!


অ্যালগরিদম দ্বারা অনুপ্রাণিত গেমটি মোনাকো ভাগ করা স্তরের স্তরের তথ্য সংরক্ষণ করতে ব্যবহার করে এমন একটি প্রোগ্রাম লিখতে আপনার কাজ যা কোনও চিত্রের রঙের নূন্যতম গুরুত্বপূর্ণ বিটটিতে তথ্য এনকোড করে থাকে write

এনকোডিং বিন্যাস:

  • প্রথম 24 বিট অবশিষ্ট এনকোড বাইট-স্ট্রিং এর দৈর্ঘ্য নির্ধারণ বিট
  • চিত্রটি বাম থেকে ডানে এবং উপরে থেকে নীচে পর্যন্ত পড়া হয়, স্পষ্টতই উপরের বাম পিক্সেল থেকে শুরু হয়
  • চ্যানেলগুলি লাল থেকে সবুজ থেকে নীল পর্যন্ত পড়া হয়
  • প্রতিটি চ্যানেলের সর্বনিম্ন উল্লেখযোগ্য বিটটি পড়া হয়
  • বিটগুলি বিগ এন্ডিয়ান ক্রমে সংরক্ষণ করা হয়

নিয়মাবলী:

  • আপনার প্রোগ্রামটি এনকোড করতে একটি একক বাইট-স্ট্রিং এবং বেস চিত্রের জন্য একটি একক চিত্র ফাইলের নাম নেয়
  • ফলস্বরূপ চিত্রটি অবশ্যই সত্য রঙের পিএনজি ফাইল হিসাবে প্রকাশিত হওয়া উচিত
  • আপনি নিজের প্রোগ্রামটি কীভাবে ব্যবহার করবেন সে সম্পর্কে যতক্ষণ না বলছেন ততক্ষণ আপনি আপনার পছন্দ মতো (এআরজিভি, এসটিডিএন, এসটিডিআউট, একটি ফাইল থেকে লেখার / পড়ার) আই / ও ব্যবহার করতে পারেন
  • আপনার প্রোগ্রামটি কাজ করে তা দেখানোর জন্য আপনাকে অবশ্যই একটি মজাদার বিড়ালের একটি এলোমেলো চিত্র চয়ন করতে হবে এবং এতে আপনার প্রোগ্রামটিকে এনকোড করতে হবে
  • আপনি ধরে নিতে পারেন যে আপনি কেবল বৈধ ইনপুট সরবরাহ করেছেন, যদি বিটের পরিমাণ যথেষ্ট না হয় তবে চিত্রটি সত্য রঙের ফর্ম্যাটে না থাকে, চিত্রটির অস্তিত্ব থাকে না বা অনুরূপ সমস্যাগুলি যা আপনি চান তা করতে পারেন
  • আপনি ধরে নিতে পারেন যে সরবরাহিত চিত্রটিতে কোনও আলফা চ্যানেল নেই
  • দৈর্ঘ্য বিওএম ছাড়াই ইউটিএফ -8 বাইটে গণনা করা হয়

আপনি নিজের সমাধানটি পরীক্ষা করতে এই পিএইচপি স্ক্রিপ্টটি ব্যবহার করতে পারেন, প্রথম কমান্ড লাইন আর্গুমেন্ট হিসাবে পিএনজি ফাইলের নাম সরবরাহ করুন:

<?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
আমাকে helpimtrappedinacatfactory OW চলাচলের
TheDoctor

এছাড়াও, এনকোডিংয়ের জন্য ব্যবহৃত বিটগুলি কী অদৃশ্য থাকার প্রয়োজন? বা আমরা যা চাই তা এগুলিতে সেট করতে পারি (যেহেতু এটি চিত্রের মানের উপর প্রভাব ফেলবে না এবং ডিকোডিংয়ের জন্য কোনও গুরুত্বপূর্ণ নয়)?
মার্টিন এন্ডার

1
আমি কি পিএনজি ফাইল লোড এবং সংরক্ষণের জন্য একটি অন্তর্নির্মিত গ্রন্থাগার ব্যবহার করতে পারি, যেমন পাইথনে পিআইএল?
ক্লাদিউ

1
@ টিমওয়ালা বিড়াল থেকে? এটি বাড়ির ভিতরে রাখুন এবং লিটার ট্রে পর্যবেক্ষণ করুন। ছবি থেকে? আপনি যদি উচ্চ পরিমাণে রেজোলিউশন এক্স-রে ফটো নেন তবে আপনি ফ্ল্যাশ চিপে পৃথক ট্রানজিস্টারের অবস্থা দেখতে সক্ষম হতে পারেন। আমি নিশ্চিত যে এটি গোপন তথ্য যাচাই করার সবচেয়ে কার্যকর পদ্ধতি হতে হবে, যদিও বিড়ালের অন্যান্য ধারণা থাকতে পারে।
সনিক এটম

উত্তর:


3

পার্ল এবং ইমেজম্যাগিক (লিনাক্স), 198 190 190

সম্পাদনা: কিছুটা কাকতালীয়ভাবে এর আগে আমি ইমেজম্যাগিকের কিউ 8 (8 বিট গভীরতা) সংস্করণ সহ একটি কম্পিউটারে পরীক্ষা করেছি। 'স্ট্যান্ডার্ড' কিউ 16 সংস্করণটির -depth 8কমান্ড লাইনে স্পষ্ট প্রয়োজন requires লিনাক্সে, 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"]]

প্রয়োজনীয় উদাহরণটি এখানে:

এখানে চিত্র বর্ণনা লিখুন

আমি আপনাকে এখানে ডিকোড করা বার্তাটি দেখাতে চাই, তবে এটি ফিট হয় না ... সুতরাং এটি ওপি'র ডিকোডারের মাধ্যমে চালান। ;)

বিটিডব্লিউ, আমি এটি মাত্র 7 বাইট ( ToCharacterCode@#রূপান্তর #~ToCharacterCode~"utf8") এর জন্য ইউটিএফ -8 গোপনের সাথে কাজ করতে পারি could

অবহেলিত কোড:

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"]
)

"আমি এখানে ডিকোডেড বার্তাটি আপনাকে দেখাতে চাই, তবে এটি খাপ খায় না ... সুতরাং ওপি'র ডিকোডারের মাধ্যমে এটি চালান;;)" - আমি করেছি এবং এটি আমাকে দেয় "?????????? ??? +++++++ ?? ++++++++++++++++++++ ================= ~ === ~ ============ ~ :::: ~~~~~ = [... 73৯73 characters অক্ষরের জন্য]] "
টেসেল্লাটিংহেকলার

1
@ টেসেল্লাটিংহেকলার, এটি সঠিক। এটিকে মনসোপসিড ফন্টে ব্যবহার করে দেখুন এবং সচেতন থাকুন যে সেখানে ইউনিক্স-স্টাইলের নতুন লাইন রয়েছে (উদাহরণস্বরূপ টার্মিনালে চেষ্টা করুন বা কমপক্ষে 180 টি অক্ষরের প্রস্থ সহ পাওয়ারশেল চেষ্টা করুন বা আপনি যদি এটি আপনার ব্রাউজারে ওয়েব স্ক্রিপ্ট হিসাবে চালাচ্ছেন, তারপরে উত্সটি দেখুন);)
মার্টিন এন্ডার

2
আমি দেখি! খুব মেটা। সাহায্য করে আমিও পুটিং এর বিড়ালছানা সংস্করণ আছি, 😸
TessellatingHeckler

5

পিএইচপি, 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
আপনার উত্তরে অবরুদ্ধ কোডটি যুক্ত করুন।
আওয়ামী লীগের

1
আপনি সংক্ষিপ্ত 0xffকরতে পারেন 255
টিমওয়োলা

আপনি 4 বাইট সংরক্ষণ করতে পারবেন যদি আপনি সংক্ষিপ্ত ট্যাগ অনুমান: <?function
nyuszika7h
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.