LSB стСганография

Когда-Ρ‚ΠΎ Π΄Π°Π²Π½ΠΎ я написал свой ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ пост Π½Π° Ρ…Π°Π±Ρ€Π΅. И посвящён Ρ‚ΠΎΡ‚ пост Π±Ρ‹Π» вСсьма интСрСсной ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ стСганографии. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π² Ρ‚ΠΎΠΌ старом Ρ‚ΠΎΠΏΠΈΠΊΠ΅, нСльзя Π½Π°Π·Π²Π°Ρ‚ΡŒ стСганографиСй Π² истинном смыслС этого слова. Π­Ρ‚ΠΎ всСго лишь ΠΈΠ³Ρ€Π° с Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², Π½ΠΎ, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, довольно интСрСсная ΠΈΠ³Ρ€Π°.

БСгодня ΠΌΡ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΊΠΎΠΏΠ½ΡƒΡ‚ΡŒ Ρ‡ΡƒΡ‚ΡŒ-Ρ‡ΡƒΡ‚ΡŒ Π³Π»ΡƒΠ±ΠΆΠ΅ ΠΈ рассмотрим Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ LSB. Если Π²Π°ΠΌ интСрСсно, милости ΠΏΡ€ΠΎΡˆΡƒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚. (Под ΠΊΠ°Ρ‚ΠΎΠΌ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ: ΠΎΠΊΠΎΠ»ΠΎ ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π°.)

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСбольшоС вступлСниС. ВсСм извСстно, Ρ‡Ρ‚ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ – ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ сСкрСтной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. РазумССтся, криптография ΠΈΠΌΠ΅Π΅Ρ‚ свои области примСнСния, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΊ Π·Π°Ρ‰ΠΈΡ‚Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. МоТно Π½Π΅ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, Π° ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΈΠ΄, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅Ρ‘ Π½Π΅Ρ‚. ИмСнно для этого ΠΈ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½Π° стСганография. ВикипСдия увСряСт нас Ρ‡Ρ‚ΠΎ, «стСганография (ΠΎΡ‚ Π³Ρ€Π΅Ρ‡. στΡγανοσ β€” скрытый ΠΈ Π³Ρ€Π΅Ρ‡. γραφω β€” ΠΏΠΈΡˆΡƒ, Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Β«Ρ‚Π°ΠΉΠ½ΠΎΠΏΠΈΡΡŒΒ») β€” это Π½Π°ΡƒΠΊΠ° ΠΎ скрытой ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΡƒΡ‚Ρ‘ΠΌ сохранСния Π² Ρ‚Π°ΠΉΠ½Π΅ самого Ρ„Π°ΠΊΡ‚Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ ΡΠΎΠ²ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ криптографичСскиС ΠΈ стСганографичСскиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Ρ‚Π°ΠΊ ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚, Π½ΠΎ наша Π·Π°Π΄Π°Ρ‡Π° Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с основами. Если Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΡŽ с Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°Ρ… стСганографии Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚.Π½. ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ ΠΈ сообщСниС. ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ β€” это любая информация, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰Π°Ρ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ нашС сСкрСтноС сообщСниС.

Π’ нашСм случаС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ BMP. Для Π½Π°Ρ‡Π°Π»Π° рассмотрим структуру этого Ρ„Π°ΠΉΠ»Π°. Π€Π°ΠΉΠ» условно ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π½Π° 4 части: Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ„Π°ΠΉΠ»Π°, Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ изобраТСния, ΠΏΠ°Π»ΠΈΡ‚Ρ€Ρƒ ΠΈ само ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Для Π½Π°ΡˆΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ Π½Π°Π΄ΠΎ Π·Π½Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ записано Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅.

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° Π±Π°ΠΉΡ‚Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° – это сигнатура BM, Π΄Π°Π»Π΅Π΅ Π² Π΄Π²ΠΎΠΉΠ½ΠΎΠΌ словС записан Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° Π² Π±Π°ΠΉΡ‚Π°Ρ…, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ 4 Π±Π°ΠΉΡ‚Π° Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π½ΡƒΠ»ΠΈ ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π² Π΅Ρ‰Ρ‘ ΠΎΠ΄Π½ΠΎΠΌ Π΄Π²ΠΎΠΉΠ½ΠΎΠΌ словС записано смСщСниС ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π° Ρ„Π°ΠΉΠ»Π°, Π΄ΠΎ собствСнно Π±Π°ΠΉΡ‚ΠΎΠ² изобраТСния. Π’ 24-Π±ΠΈΡ‚Π½ΠΎΠΌ bmp-Ρ„Π°ΠΉΠ»Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ пиксСл ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽΡ‚ΡΡ трСмя Π±Π°ΠΉΡ‚Π°ΠΌΠΈ BGR.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ Π΄ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π΄ΠΎ изобраТСния, ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ Ρ‚ΡƒΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ Π½Π°ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Для этого Π½Π°ΠΌ ΠΈ пригодится ΠΌΠ΅Ρ‚ΠΎΠ΄ LSB. Π‘ΡƒΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: ΠΌΡ‹ замСняСм младшиС Π±ΠΈΡ‚Ρ‹ Π² Π±Π°ΠΉΡ‚Π°Ρ…, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΡ… Π·Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ†Π²Π΅Ρ‚Π°. Допустим, Ссли ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ Π±Π°ΠΉΡ‚ нашСго сСкрСтного сообщСния – 11001011, Π° Π±Π°ΠΉΡ‚Ρ‹ Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ –…11101100 01001110 01111100 0101100111…, Ρ‚ΠΎ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ. ΠœΡ‹ Ρ€Π°Π·ΠΎΠ±ΡŒΡ‘ΠΌ Π±Π°ΠΉΡ‚ сСкрСтного сообщСния Π½Π° 4 Π΄Π²ΡƒΡ…Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ части: 11, 00, 10, 11, ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ младшиС Π±ΠΈΡ‚Ρ‹ изобраТСния: …11101111 01001100 01111110 0101100111…. Вакая Π·Π°ΠΌΠ΅Π½Π° Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚Π½Π° чСловСчСскому Π³Π»Π°Π·Ρƒ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ старыС устройства Π²Ρ‹Π²ΠΎΠ΄Π°, Π΄Π°ΠΆΠ΅ Π½Π΅ смогут ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Ρ‹.

ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 2 ΠΌΠ»Π°Π΄ΡˆΠΈΡ… Π±ΠΈΡ‚Π°, Π½ΠΎ ΠΈ любоС ΠΈΡ… количСство. Π’ΡƒΡ‚ Π΅ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ: Ρ‡Π΅ΠΌ большСС количСство Π±ΠΈΡ‚ ΠΌΡ‹ мСняСм, Ρ‚Π΅ΠΌ больший ΠΎΠ±ΡŠΡ‘ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΏΡ€ΡΡ‚Π°Ρ‚ΡŒ, ΠΈ Ρ‚Π΅ΠΌ большиС ΠΏΠΎΠΌΠ΅Ρ…ΠΈ Π² исходном ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ это Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²ΠΎΡ‚ Π²Π°ΠΌ Π΄Π²Π° изобраТСния:

LSB стСганография
LSB стСганография

ΠŸΡ€ΠΈ всём ΠΆΠ΅Π»Π°Π½ΠΈΠΈ я Ρ‚Π°ΠΊ ΠΈ Π½Π΅ сумСл ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ, Π° Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ описанного ΠΌΠ΅Ρ‚ΠΎΠ΄Π° спрятана поэма Π›ΡŒΡŽΠΈΡΠ° ΠšΡΡ€ΠΎΠ»Π»Π° Β«ΠžΡ…ΠΎΡ‚Π° Π½Π° Π‘Π½Π°Ρ€ΠΊΠ°Β». Если Π²Ρ‹ Π΄ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ Π΄ΠΎ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, Ρ‚ΠΎ Π²Π°ΠΌ навСрняка интСрСсно ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΈ ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Она довольна проста, Π½ΠΎ сразу ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΡƒ, Ρ‡Ρ‚ΠΎ сдСлано всё Π½Π° Delphi. ΠŸΡ€ΠΈΡ‡ΠΈΠ½ этому Π΄Π²Π΅: 1. Π― ΡΡ‡ΠΈΡ‚Π°ΡŽ Delphi Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ Π³ΠΎΠ΄Π½Ρ‹ΠΌ языком; 2. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ, Π² процСссС ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ курса ΠΏΠΎ основам машинного зрСния, Π° рСбята, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ я этот курс Ρ‡ΠΈΡ‚Π°ΡŽ, ΠΏΠΎΠΊΠ° Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΊΡ€ΠΎΠΌΠ΅ Delphi Π½Π΅ Π·Π½Π°ΡŽΡ‚. Для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ Π½Π΅ Π·Π½Π°ΠΊΠΎΠΌ с синтаксисом Π½Π°Π΄ΠΎ ΠΏΠΎΡΡΠ½ΠΈΡ‚ΡŒ ΠΎΠ΄Π½Ρƒ Π²Π΅Ρ‰ΡŒ shl x – ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²Π»Π΅Π²ΠΎ Π½Π° x, shr x – ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΉ сдвиг Π²ΠΏΡ€Π°Π²ΠΎ Π½Π° x.

Π‘Ρ‡ΠΈΡ‚Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ записываСм Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ тСкст, хранящийся Π² строкС ΠΈ замСняСм младшиС Π΄Π²Π° Π±Π°ΠΉΡ‚Π°:
Код для записи:

for i:=1 to length(str) do
    begin
      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);
 
    end;

ΠΊΠΎΠ΄ для считывания:

for i:=1 to MsgSize do
    begin
      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);
    end;

Ну ΠΈ для совсСм Π»Π΅Π½ΠΈΠ²Ρ‹Ρ… – ссылка Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ Π΅Ρ‘ исходный ΠΊΠΎΠ΄.

Бпасибо.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com