LSB ስቴጋኖግራፊ

አንድ ጊዜ የእኔን ጻፍኩ በ hub ላይ የመጀመሪያ ልጥፍ. እና ያ ልኡክ ጽሁፍ በጣም ለሚያስደስት ችግር ማለትም ስቴጋኖግራፊ ተወስኗል። እርግጥ ነው፣ በዚያ አሮጌ ርዕስ ላይ የቀረበው መፍትሔ በእውነተኛው የቃሉ ትርጉም ስቴጋኖግራፊ ተብሎ ሊጠራ አይችልም። እሱ የፋይል ቅርጸቶች ያለው ጨዋታ ብቻ ነው፣ ግን በጣም አስደሳች የሆነ ጨዋታ ቢሆንም።

ዛሬ ትንሽ በጥልቀት ለመቆፈር እና የኤልኤስቢ አልጎሪዝምን ለመመልከት እንሞክራለን. ፍላጎት ካሎት በድመት ስር እንኳን ደህና መጣችሁ። (በመቁረጡ ስር ትራፊክ ነው፡ አንድ ሜጋባይት ገደማ።)

በመጀመሪያ ደረጃ, አጭር መግቢያ ማድረግ አስፈላጊ ነው. የክሪፕቶግራፊ ዓላማ ሚስጥራዊ መረጃን ለማንበብ የማይቻል መሆኑን ሁሉም ሰው ያውቃል። እርግጥ ነው, ክሪፕቶግራፊ አፕሊኬሽኖቹ አሉት, ነገር ግን የውሂብ ጥበቃ ሌላ አቀራረብ አለ. መረጃውን ኢንክሪፕት ማድረግ የለብንም ነገር ግን የሌለን አስመስሎ መስራት። ስቴጋኖግራፊ የተፈለሰፈው ለዚህ ነው. ዊኪፔዲያ አረጋግጦልናል “ስቴጋኖግራፊ (ከግሪክ στεγανοσ - የተደበቀ እና የግሪክ γραφω - እኔ እጽፋለሁ፣ በጥሬው “ሚስጥራዊ ጽሑፍ”) የማስተላለፍን እውነታ በምስጢር በመጠበቅ የተደበቀ የመረጃ ስርጭት ሳይንስ ነው።

እርግጥ ነው, ማንም ሰው ክሪፕቶግራፊክ እና ስቴጋኖግራፊክ ዘዴዎችን ማዋሃድ አይከለክልም. ከዚህም በላይ በተግባር ይህንን ያደርጉታል, የእኛ ተግባር ግን መሰረታዊ ነገሮችን መረዳት ነው. የዊኪፔዲያን መጣጥፍ በጥንቃቄ ካጠኑ ፣ ስቴጋኖግራፊ አልጎሪዝም የሚባሉትን ያካተቱ መሆናቸውን ይገነዘባሉ። መያዣ እና መልእክት. መያዣ ማለት ሚስጥራዊ መልእክታችንን ለመደበቅ የሚረዳ ማንኛውም መረጃ ነው።

በእኛ ሁኔታ, መያዣው በ BMP ቅርጸት ምስል ይሆናል. በመጀመሪያ, የዚህን ፋይል መዋቅር እንይ. ፋይሉ በ 4 ክፍሎች ሊከፈል ይችላል: የፋይል ራስጌ, የምስል ራስጌ, ቤተ-ስዕል እና ምስሉ ራሱ. ለዓላማችን፣ በርዕሱ ላይ የተጻፈውን ብቻ ማወቅ አለብን።

የርዕሱ የመጀመሪያዎቹ ሁለት ባይት የቢኤም ፊርማ ናቸው፣ ከዚያም በባይት ውስጥ ያለው የፋይል መጠን በሁለት ቃል ይፃፋል፣ የሚቀጥሉት 4 ባይቶች የተጠበቁ ናቸው እና ዜሮዎችን መያዝ አለባቸው፣ እና በመጨረሻም ፣ ሌላ ድርብ ቃል ከመጀመሪያው ማካካሻ ይይዛል። ወደ ምስሉ ትክክለኛ ባይቶች ፋይል ያድርጉ። በ24-ቢት bmp ፋይል ውስጥ፣ እያንዳንዱ ፒክሰል በሶስት BGR ባይት የተመሰጠረ ነው።

አሁን ወደ ምስሉ እንዴት እንደምናገኝ እናውቃለን, የሚቀረው እዚያ የምንፈልገውን መረጃ እንዴት መጻፍ እንደምንችል ለመረዳት ነው. ለዚህ የኤልኤስቢ ዘዴ ያስፈልገናል. የስልቱ ይዘት የሚከተለው ነው፡- ለቀለም ኢንኮዲንግ ሃላፊነት ባለው ባይት ውስጥ በትንሹ ጉልህ የሆኑትን ቢት እንተካለን። ቀጣዩ የምስጢር መልእክታችን ባይት 11001011 ከሆነ እና በምስሉ ላይ የሚታዩት ባይቶች...11101100 01001110 01111100 0101100111... ከሆነ ኢንኮዲንግ ይህን ይመስላል። ሚስጥራዊውን መልእክት ባይት ወደ 4 ባለ ሁለት ቢት ክፍሎች 11 ፣ 00 ፣ 10 ፣ 11 እንከፍለዋለን።11 01001100 01111110 0101100111…. እንዲህ ዓይነቱ ምትክ በአጠቃላይ በሰው ዓይን አይታይም. ከዚህም በላይ ብዙ የቆዩ የውጤት መሳሪያዎች እንደነዚህ ያሉትን ጥቃቅን ለውጦች እንኳን ማሳየት አይችሉም.

2 በጣም አስፈላጊ የሆኑትን ቢት ብቻ ሳይሆን ማንኛውንም ቁጥራቸውን መቀየር እንደሚችሉ ግልጽ ነው. የሚከተለው ስርዓተ-ጥለት አለ፡ ብዙ ቢት በምንለውጥ ቁጥር፣ ብዙ መረጃዎችን መደበቅ እንችላለን፣ እና ይህ በዋናው ምስል ላይ የበለጠ ጣልቃ ገብነት ያስከትላል። ለምሳሌ፣ ሁለት ምስሎች እዚህ አሉ።

LSB ስቴጋኖግራፊ
LSB ስቴጋኖግራፊ

የተቻለውን ያህል ጥረት ቢያደርግም በመካከላቸው ያለውን ልዩነት ማየት አልቻልኩም, ነገር ግን በሁለተኛው ምስል ውስጥ, የተገለጸውን ዘዴ በመጠቀም, የሉዊስ ካሮል ግጥም "የ Snark አደን" ተደብቋል. ይህን እስካሁን ካነበብክ፣ ስለ አተገባበሩ ለማወቅ ፍላጎት ይኖርህ ይሆናል። በጣም ቀላል ነው, ነገር ግን ሁሉም ነገር በዴልፊ ውስጥ መደረጉን ወዲያውኑ አስጠነቅቃችኋለሁ. ለዚህ ሁለት ምክንያቶች አሉ፡ 1. ዴልፊ ጥሩ ቋንቋ ነው ብዬ አስባለሁ; 2. ይህ ፕሮግራም የተወለደው በኮምፒዩተር እይታ መሰረታዊ ነገሮች ላይ ኮርስ በማዘጋጀት ሂደት ላይ ነው ፣ እና ይህንን ኮርስ የማስተምራቸው ሰዎች ከዴልፊ በስተቀር ሌላ ምንም ነገር ገና አያውቁም። አገባቡን ለማያውቁ ሰዎች አንድ ነገር መገለጽ አለበት፡ shl x በመጠኑ ወደ ግራ በ x፣ shr x በመጠኑ ወደ ቀኝ በ x ነው።

በሕብረቁምፊ ውስጥ የተከማቸ ጽሑፍ ወደ መያዣው ውስጥ እየጻፍን እና የታችኛውን ሁለት ባይት እየተተካን እንደሆነ እንገምታለን።
የመቅጃ ኮድ፡

ለ i:=1 እስከ ርዝመት(str) አድርግ
    ጀመረ
      l1:=ባይት(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.ቦታ፡= f.ቦታ-1;
      tmp:=((tmp shr 2) shl 2)+l1;
      f.WriteBuffer (tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.ቦታ፡= f.ቦታ-1;
      tmp:=((tmp shr 2) shl 2)+l2;
      f.WriteBuffer (tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.ቦታ፡= f.ቦታ-1;
      tmp:=((tmp shr 2) shl 2)+l3;
      f.WriteBuffer (tmp,1);
 
      f.ReadBuffer(tmp,1);
      f.ቦታ፡= f.ቦታ-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);
    መጨረሻ

ደህና ፣ በእውነቱ ለሰነፎች - ከፕሮግራሙ እና ከምንጩ ኮድ ጋር አገናኝ.

እናመሰግናለን.

ምንጭ: hab.com

አስተያየት ያክሉ