ایل ایس بی سٹیگنوگرافی

ایک دفعہ میں نے اپنا لکھا حب پر پہلی پوسٹ. اور وہ پوسٹ ایک بہت ہی دلچسپ مسئلے کے لیے وقف تھی، یعنی سٹیگنوگرافی۔ یقیناً اس پرانے موضوع میں جو حل تجویز کیا گیا ہے اسے لفظ کے حقیقی معنوں میں سٹیگنگرافی نہیں کہا جا سکتا۔ یہ فائل فارمیٹس کے ساتھ صرف ایک گیم ہے، لیکن اس کے باوجود ایک بہت ہی دلچسپ گیم ہے۔

آج ہم تھوڑا گہرائی میں کھودنے کی کوشش کریں گے اور LSB الگورتھم کو دیکھیں گے۔ اگر آپ دلچسپی رکھتے ہیں تو بلی کے نیچے آپ کا استقبال ہے۔ (کٹ کے نیچے ٹریفک ہے: تقریباً ایک میگا بائٹ۔)

سب سے پہلے تو مختصر تعارف کرانا ضروری ہے۔ سب جانتے ہیں کہ کرپٹو گرافی کا مقصد خفیہ معلومات کو پڑھنا ناممکن بنانا ہے۔ بلاشبہ، خفیہ نگاری کی اپنی ایپلی کیشنز ہیں، لیکن ڈیٹا کے تحفظ کے لیے ایک اور طریقہ ہے۔ ہمیں معلومات کو خفیہ کرنے کی ضرورت نہیں ہے، لیکن یہ دکھاوا کرنا ہے کہ ہمارے پاس یہ نہیں ہے۔ یہی وجہ ہے کہ سٹیگنوگرافی ایجاد ہوئی تھی۔ ویکیپیڈیا ہمیں یقین دلاتا ہے کہ "سٹیگنوگرافی (یونانی سے στεγανοσ - پوشیدہ اور یونانی γραφω - میں لکھتا ہوں، لفظی طور پر "خفیہ تحریر") ٹرانسمیشن کی حقیقت کو خفیہ رکھ کر معلومات کی پوشیدہ ترسیل کی سائنس ہے۔

بلاشبہ، کوئی بھی خفیہ نگاری اور سٹیگنوگرافک طریقوں کو یکجا کرنے سے منع نہیں کرتا ہے۔ مزید یہ کہ عملی طور پر وہ ایسا کرتے ہیں، لیکن ہمارا کام بنیادی باتوں کو سمجھنا ہے۔ اگر آپ ویکیپیڈیا کے مضمون کا بغور مطالعہ کریں گے تو آپ کو پتہ چل جائے گا کہ سٹیگنوگرافی الگورتھم میں نام نہاد شامل ہیں۔ کنٹینر اور پیغام. کنٹینر کوئی بھی ایسی معلومات ہے جو ہمارے خفیہ پیغام کو چھپانے میں مدد کرتی ہے۔

ہمارے معاملے میں، کنٹینر BMP فارمیٹ میں ایک تصویر ہوگی۔ پہلے اس فائل کی ساخت کو دیکھتے ہیں۔ فائل کو 4 حصوں میں تقسیم کیا جاسکتا ہے: فائل ہیڈر، امیج ہیڈر، پیلیٹ اور خود تصویر۔ ہمارے مقاصد کے لیے، ہمیں صرف یہ جاننے کی ضرورت ہے کہ ہیڈر میں کیا لکھا ہے۔

ہیڈر کے پہلے دو بائٹس BM دستخط ہیں، پھر بائٹس میں فائل کا سائز ڈبل لفظ میں لکھا جاتا ہے، اگلے 4 بائٹس محفوظ ہیں اور اس میں زیرو ہونا ضروری ہے، اور آخر میں، ایک اور ڈبل لفظ کے شروع سے آفسیٹ پر مشتمل ہے۔ تصویر کے اصل بائٹس پر فائل کریں۔ 24 بٹ bmp فائل میں، ہر پکسل کو تین BGR بائٹس کے ساتھ انکوڈ کیا جاتا ہے۔

اب ہم جانتے ہیں کہ تصویر تک کیسے پہنچنا ہے، بس یہ سمجھنا باقی ہے کہ ہم وہاں اپنی مطلوبہ معلومات کیسے لکھ سکتے ہیں۔ اس کے لیے ہمیں LSB طریقہ کی ضرورت ہوگی۔ طریقہ کار کا خلاصہ درج ذیل ہے: ہم کلر انکوڈنگ کے ذمہ دار بائٹس میں کم سے کم اہم بٹس کو تبدیل کرتے ہیں۔ آئیے کہتے ہیں کہ اگر ہمارے خفیہ پیغام کا اگلا بائٹ 11001011 ہے، اور تصویر میں موجود بائٹس ہیں...11101100 01001110 01111100 0101100111...، تو انکوڈنگ اس طرح نظر آئے گی۔ ہم خفیہ پیغام بائٹ کو 4 دو بٹ ​​حصوں میں تقسیم کریں گے: 11، 00، 10، 11، اور تصویر کے کم ترتیب والے بٹس کو نتیجے میں آنے والے ٹکڑوں سے بدل دیں گے: ...11101111 01001100 01111110 0101100111…. اس طرح کی تبدیلی عام طور پر انسانی آنکھ کے لئے قابل توجہ نہیں ہے. مزید یہ کہ بہت سے پرانے آؤٹ پٹ ڈیوائسز ایسی معمولی تبدیلیوں کو بھی ظاہر نہیں کر سکیں گے۔

یہ واضح ہے کہ آپ نہ صرف 2 کم سے کم اہم بٹس کو بلکہ ان میں سے کسی بھی تعداد کو تبدیل کر سکتے ہیں۔ مندرجہ ذیل پیٹرن ہے: ہم جتنے زیادہ بٹس بدلیں گے، اتنی ہی زیادہ معلومات ہم چھپا سکتے ہیں، اور اس سے اصل تصویر میں زیادہ مداخلت ہوگی۔ مثال کے طور پر، یہاں دو تصاویر ہیں:

ایل ایس بی سٹیگنوگرافی
ایل ایس بی سٹیگنوگرافی

اپنی پوری کوشش کے باوجود میں ان میں فرق نہیں دیکھ سکا لیکن اس کے باوجود دوسری تصویر میں بیان کردہ طریقہ استعمال کرتے ہوئے لیوس کیرول کی نظم "The Hunting of the Snark" چھپی ہے۔ اگر آپ نے ابھی تک پڑھا ہے، تو آپ شاید عمل درآمد کے بارے میں جاننے میں دلچسپی رکھتے ہیں۔ یہ بہت آسان ہے، لیکن میں آپ کو فوراً خبردار کروں گا کہ ڈیلفی میں سب کچھ ہو چکا ہے۔ اس کی دو وجوہات ہیں: 1. میرے خیال میں ڈیلفی ایک اچھی زبان ہے۔ 2. یہ پروگرام کمپیوٹر ویژن کی بنیادی باتوں پر ایک کورس کی تیاری کے دوران پیدا ہوا تھا، اور جن لوگوں کو میں یہ کورس پڑھا رہا ہوں وہ ابھی تک ڈیلفی کے علاوہ کچھ نہیں جانتے ہیں۔ ان لوگوں کے لیے جو نحو سے واقف نہیں ہیں، ایک چیز کی وضاحت ضروری ہے: shl x x کی طرف سے بائیں طرف ایک بٹ وائز شفٹ ہے، shr x x کی طرف سے دائیں طرف ایک بٹ وائز شفٹ ہے۔

ہم فرض کرتے ہیں کہ ہم کنٹینر میں سٹرنگ میں ذخیرہ شدہ متن لکھ رہے ہیں اور نچلے دو بائٹس کو تبدیل کر رہے ہیں:
ریکارڈنگ کوڈ:

i:=1 سے لمبائی(str) کے لیے
    شروع کریں
      l1:=byte(str[i]) shr 6;
      l2:=byte(str[i]) shl 2; l2:=l2 shr 6;
      l3:=byte(str[i]) shl 4; l3:=l3 shr 6;
      l4:=byte(str[i]) shl 6; l4:=l4 shr 6;
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer(tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.Position:=f.Position-1;
      tmp:=((tmp shr 2) shl 2)+l4;
      f.WriteBuffer(tmp,1);
 
    آخر

پڑھنے کے لیے کوڈ:

i:=1 سے MsgSize کے لیے
    شروع کریں
      f.ReadBuffer(tmp,1);
      l1:=tmp shl 6;
      f.ReadBuffer(tmp,1);
      l2:=tmp shl 6; l2:=l2 shr 2;
      f.ReadBuffer(tmp,1);
      l3:=tmp shl 6; l3:=l3 shr 4;
      f.ReadBuffer(tmp,1);
      l4:=tmp shl 6; l4:=l4 shr 6;
      str:=str+char(l1+l2+l3+l4);
    آخر

ٹھیک ہے، واقعی سست لوگوں کے لئے - پروگرام اور اس کے سورس کوڈ سے لنک کریں۔.

آپ کا شکریہ.

ماخذ: www.habr.com

نیا تبصرہ شامل کریں