ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™ ืื™ืŸ GIF

ื”ืงื“ืžื”

ื’ืจืขืขื˜ื™ื ื’ืก.
ื ื™ื˜ ืึทื–ื•ื™ ืœืึทื ื’ ืฆื•ืจื™ืง, ื•ื•ืขืŸ ืื™ืš ื’ืขืœืขืจื ื˜ ืื™ืŸ ื“ืขืจ ืื•ื ื™ื•ื•ืขืจืกื™ื˜ืขื˜, ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืึท ืงืึธื•ืจืกืขื•ื•ืึธืจืง ืื™ืŸ ื“ื™ ื“ื™ืกืฆื™ืคึผืœื™ืŸ "ืกืึธืคื˜ื•ื•ืึทืจืข ืžืขื˜ื”ืึธื“ืก ืคื•ืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื–ื™ื›ืขืจื”ื™ื™ื˜." ื“ื™ ืึทืกื™ื™ื ืžืึทื ื˜ ืคืืจืœืื ื’ื˜ ืื•ื ื“ื– ืฆื• ืฉืึทืคึฟืŸ ืึท ืคึผืจืึธื’ืจืึทื ื•ื•ืึธืก ืขืžื‘ืขื“ื– ืึท ืึธื ื–ืึธื’ ืื™ืŸ GIF ื˜ืขืงืขืก. ืื™ืš ื‘ืึทืฉืœืึธืกืŸ ืฆื• ื˜ืึธืŸ ื“ืึธืก ืื™ืŸ ื“ื–ืฉืึทื•ื•ืึท.

ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืื™ืš ื•ื•ืขืœ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ืขื˜ืœืขื›ืข ื˜ืขืึธืจืขื˜ื™ืฉ ืคื•ื ืงื˜ืŸ, ื•ื•ื™ ื’ืขื–ื•ื ื˜ ื•ื•ื™ ื•ื•ื™ ื“ืึธืก ืงืœื™ื™ืŸ ืคึผืจืึธื’ืจืึทื ืื™ื– ื‘ืืฉืืคืŸ.

ื˜ืขืึธืจืขื˜ื™ืฉ ื˜ื™ื™ืœ

GIF ืคึฟืึธืจืžืึทื˜

GIF (Graphics Interchange Format - ืึท ืคึฟืึธืจืžืึทื˜ ืคึฟืึทืจ ื™ืงืกื˜ืฉื™ื™ื ื“ื–ืฉื™ื ื’ ื‘ื™ืœื“ืขืจ) ืื™ื– ืึท ืคึฟืึธืจืžืึทื˜ ืคึฟืึทืจ ืกื˜ืึธืจื™ื ื’ ื’ืจืึทืคื™ืง ื‘ื™ืœื“ืขืจ, ื•ื•ืึธืก ืื™ื– ื‘ื™ื›ื•ืœืช ืฆื• ืกื˜ืึธืจื™ื ื’ ืงืึทืžืคึผืจืขืกื˜ ื“ืึทื˜ืŸ ืึธืŸ ืงื•ื•ืึทืœื™ื˜ืขื˜ ืึธื ื•ื•ืขืจ ืื™ืŸ ืึท ืคึฟืึธืจืžืึทื˜ ืคื•ืŸ ืึทืจื•ื™ืฃ ืฆื• 256 ืคืืจื‘ืŸ. ื“ืขืจ ืคึฟืึธืจืžืึทื˜ ืื™ื– ื“ืขื•ื•ืขืœืึธืคึผืขื“ ืื™ืŸ 1987 (GIF87a) ื“ื•ืจืš CompuServe ืคึฟืึทืจ ื˜ืจืึทื ืกืžื™ื˜ื™ื ื’ ืจืึทืกื˜ืขืจ ื‘ื™ืœื“ืขืจ ืื™ื‘ืขืจ ื ืขื˜ื•ื•ืึธืจืงืก. ืื™ืŸ 1989, ื“ื™ ืคึฟืึธืจืžืึทื˜ ืื™ื– ืžืึทื“ืึทืคื™ื™ื“ (GIF89a), ืฉื˜ื™ืฆืŸ ืคึฟืึทืจ ื“ื•ืจื›ื–ืขื™ืงื™ื™ึทื˜ ืื•ืŸ ืึทื ืึทืžื™ื™ืฉืึทืŸ ืื™ื– ืฆื•ื’ืขื’ืขื‘ืŸ.

GIF ื˜ืขืงืขืก ื”ืึธื‘ืŸ ืึท ื‘ืœืึธืง ืกื˜ืจื•ืงื˜ื•ืจ. ื“ื™ ื‘ืœืึทืงืก ืฉื˜ืขื ื“ื™ืง ื”ืึธื‘ืŸ ืึท ืคืึทืจืคืขืกื˜ื™ืงื˜ ืœืขื ื’ (ืึธื“ืขืจ ืขืก ื“ืขืคึผืขื ื“ืก ืื•ื™ืฃ ืขื˜ืœืขื›ืข ืคืœืึทื’ืก), ืึทื–ื•ื™ ืขืก ืื™ื– ื›ึผืžืขื˜ ืื•ืžืžืขื’ืœืขืš ืฆื• ืžืึทื›ืŸ ืึท ื’ืจื™ื™ึทื– ื•ื•ืขื’ืŸ ื•ื•ื• ื™ืขื“ืขืจ ื‘ืœืึธืง ืื™ื– ืœื™ื’ืŸ. ื“ื™ ืกื˜ืจื•ืงื˜ื•ืจ ืคื•ืŸ ื“ื™ ืกื™ืžืคึผืœืึทืกื˜ ื ื™ื˜-ืึทื ื™ืžื™ื™ื˜ื™ื“ GIF ื‘ื™ืœื“ ืื™ืŸ GIF89a ืคึฟืึธืจืžืึทื˜:

ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™ ืื™ืŸ GIF

ืคื•ืŸ ืึทืœืข ื“ื™ ื‘ืœืึทืงืก ืคื•ืŸ ื“ื™ ืกื˜ืจื•ืงื˜ื•ืจ, ืื™ืŸ ื“ืขื ืคืึทืœ ืžื™ืจ ื•ื•ืขืœืŸ ื–ื™ื™ืŸ ืื™ื ื˜ืขืจืขืกื™ืจื˜ ืื™ืŸ ื“ื™ ื’ืœืื‘ืืœืข ืคึผืึทืœื™ื˜ืจืข ื‘ืœืึธืง ืื•ืŸ ื“ื™ ืคึผืึทืจืึทืžืขื˜ืขืจืก ืคืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขืš ืคึฟืึทืจ ื“ื™ ืคึผืึทืœื™ื˜ืจืข:

  • CT - ื‘ื™ื™ึทื–ื™ื™ึทืŸ ืคื•ืŸ ืึท ื’ืœืื‘ืืœืข ืคึผืึทืœื™ื˜ืจืข. ืื•ื™ื‘ ื“ืขื ืคืึธืŸ ืื™ื– ื‘ืึทืฉื˜ื™ืžื˜, ื“ื™ ื’ืœืื‘ืืœืข ืคึผืึทืœื™ื˜ืจืข ืžื•ื–ืŸ ืึธื ื”ื™ื™ื‘ืŸ ืžื™ื“ ื ืึธืš ื“ื™ ืœืึทื“ื–ืฉื™ืงืึทืœ ืคืึทืจืฉื˜ืขืœืŸ ืฉืขืคึผืŸ.
  • Size - ืคึผืึทืœื™ื˜ืจืข ื’ืจื™ื™ืก ืื•ืŸ ื ื•ืžืขืจ ืคื•ืŸ ืคืืจื‘ืŸ ืื™ืŸ ื“ื™ ื‘ื™ืœื“. ื•ื•ืึทืœื•ืขืก ืคึฟืึทืจ ื“ืขื ืคึผืึทืจืึทืžืขื˜ืขืจ:

ื’ืจื™ื™ืก
ื ื•ืžืขืจ ืคื•ืŸ ืคืืจื‘ืŸ
ืคึผืึทืœื™ื˜ืจืข ื’ืจื™ื™ืก, ื‘ื™ื˜ืขืก

7
256
768

6
128
384

5
64
192

4
32
96

3
16
48

2
8
24

1
4
12

0
2
6

ืขื ืงืจื™ืคึผืฉืึทืŸ ืžืขื˜ื”ืึธื“ืก

ื“ื™ ืคืืœื’ืขื ื“ืข ืžืขื˜ื”ืึธื“ืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื ื™ืฆื˜ ืฆื• ืขื ืงืจื™ืคึผื˜ ืึทืจื˜ื™ืงืœืขืŸ ืื™ืŸ ื‘ื™ืœื“ ื˜ืขืงืขืก:

  • LSB (Least Significant Bit) ืื•ืคึฟืŸ
  • ืคึผืึทืœืขื˜ื˜ืข ื“ืขืจืฆื• ืื•ืคึฟืŸ

LSB ืื•ืคึฟืŸ - ืึท ืคึผืจืึธืกื˜ ืื•ืคึฟืŸ ืคื•ืŸ ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™. ืขืก ื‘ืืฉื˜ื™ื™ื˜ ืคื•ืŸ ืจื™ืคึผืœื™ื™ืกื™ื ื’ ื“ื™ ืœืขืฆื˜ืข ื‘ืึทื˜ื™ื™ึทื˜ื™ืง ื‘ื™ื˜ืŸ ืื™ืŸ ื“ืขื ืงืึทื ื˜ื™ื™ื ืขืจ (ืื™ืŸ ืื•ื ื“ื–ืขืจ ืคืึทืœ, ื“ื™ ื’ืœืื‘ืืœืข ืคึผืึทืœื™ื˜ืจืข ื‘ื™ื˜ืขืก) ืžื™ื˜ ื“ื™ ื‘ื™ื˜ืŸ ืคื•ืŸ ื“ื™ ืคืึทืจื‘ืึธืจื’ืŸ ืึธื ื–ืึธื’.

ื“ืขืจ ืคึผืจืึธื’ืจืึทื ื•ื•ืขื˜ ื ื•ืฆืŸ ื“ื™ ืœืขืฆื˜ืข ืฆื•ื•ื™ื™ ื‘ื™ื˜ืŸ ืื™ืŸ ื“ื™ ื’ืœืื‘ืืœืข ืคึผืึทืœื™ื˜ืจืข ื‘ื™ื˜ืขืก ื•ื•ื™ ืึท ื˜ื™ื™ืœ ืคื•ืŸ ื“ืขื ืื•ืคึฟืŸ. ื“ืขื ืžื™ื˜ืœ ืึทื– ืคึฟืึทืจ ืึท 24-ื‘ื™ืกืœ ื‘ื™ืœื“, ื•ื•ื• ื“ื™ ืคึผืึทืœื™ื˜ืจืข ืงืึธืœื™ืจ ืื™ื– ื“ืจื™ื™ ื‘ื™ื˜ืขืก ืคึฟืึทืจ ืจื•ื™ื˜, ื‘ืœื•ื™ ืื•ืŸ ื’ืจื™ืŸ, ื ืึธืš ืขืžื‘ืขื“ื“ื™ื ื’ ืึท ืึธื ื–ืึธื’ ืื™ืŸ ืขืก, ื™ืขื“ืขืจ ืงืึธืœื™ืจ ืงืึธืžืคึผืึธื ืขื ื˜ ื•ื•ืขื˜ ื˜ื•ื™ืฉืŸ ืžื™ื˜ ืึท ืžืึทืงืกื™ืžื•ื ืคื•ืŸ 3/255 ื’ืจืึทื“ื–ืฉื™ื™ืฉืึทื ื–. ืึทื–ืึท ืึท ืขื ื“ืขืจื•ื ื’, ืขืจืฉื˜ืขืจ, ื•ื•ืขื˜ ื–ื™ื™ืŸ ื•ืžื–ืขื™ืง ืึธื“ืขืจ ืฉื•ื•ืขืจ ืฆื• ื‘ืึทืžืขืจืงืŸ ืคึฟืึทืจ ื“ื™ ืžืขื ื˜ืฉืœืขืš ืื•ื™ื’, ืื•ืŸ ืฆื•ื•ื™ื™ื˜ื ืก, ืขืก ื•ื•ืขื˜ ื ื™ืฉื˜ ื–ื™ื™ืŸ ืงืขื ื˜ื™ืง ืื•ื™ืฃ ื ื™ื“ืขืจื™ืง-ืงื•ื•ืึทืœื™ื˜ืขื˜ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืคึผืจืึธื“ื•ืงืฆื™ืข ื“ืขื•ื•ื™ืกืขืก.

ื“ื™ ืกื•ืžืข ืคื•ืŸ โ€‹โ€‹ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื˜ ื’ืœื™ื™ึทืš ืึธืคืขื ื’ืขืŸ ืื•ื™ืฃ ื“ื™ ื’ืจื™ื™ืก ืคื•ืŸ ื“ื™ ื‘ื™ืœื“ ืคึผืึทืœื™ื˜ืจืข. ื–ื™ื ื˜ ื“ื™ ืžืึทืงืกื™ืžื•ื ื’ืจื™ื™ืก ืคื•ืŸ ื“ืขืจ ืคึผืึทืœื™ื˜ืจืข ืื™ื– 256 ืคึฟืึทืจื‘ืŸ, ืื•ืŸ ืื•ื™ื‘ ืฆื•ื•ื™ื™ ืึธื ื–ืึธื’ ื‘ื™ื˜ืŸ ื–ืขื ืขืŸ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ ื“ื™ ืงืึธืžืคึผืึธื ืขื ื˜ ืคื•ืŸ ื™ืขื“ืขืจ ืงืึธืœื™ืจ, ื“ื™ ืžืึทืงืกื™ืžื•ื ืึธื ื–ืึธื’ ืœืขื ื’ (ืžื™ื˜ ื“ื™ ืžืึทืงืกื™ืžื•ื ืคึผืึทืœื™ื˜ืจืข ืื™ืŸ ื“ื™ ื‘ื™ืœื“) ืื™ื– 192 ื‘ื™ื˜ืขืก. ืึทืžืึธืœ ื“ืขืจ ืึธื ื–ืึธื’ ืื™ื– ืขืžื‘ืขื“ื™ื“ ืื™ืŸ ื“ื™ ื‘ื™ืœื“, ื“ื™ ื˜ืขืงืข ื’ืจื™ื™ืก ื˜ื•ื˜ ื ื™ืฉื˜ ื˜ื•ื™ืฉืŸ.

ืคึผืึทืœืขื˜ื˜ืข ื™ืงืกืคึผืึทื ืฉืึทืŸ ืื•ืคึฟืŸ, ื•ื•ืึธืก ืึทืจื‘ืขื˜ ื‘ืœื•ื™ื– ืคึฟืึทืจ ื“ื™ GIF ืกื˜ืจื•ืงื˜ื•ืจ. ืขืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืžืขืจืกื˜ ืขืคืขืงื˜ื™ื•ื• ืื•ื™ืฃ ื‘ื™ืœื“ืขืจ ืžื™ื˜ ืึท ืงืœื™ื™ืŸ ืคึผืึทืœื™ื˜ืจืข. ื–ื™ื™ึทืŸ ืขืกืึทื ืก ืื™ื– ืึทื– ืขืก ื™ื ืงืจื™ืกื™ื– ื“ื™ ื’ืจื™ื™ืก ืคื•ืŸ ื“ืขืจ ืคึผืึทืœื™ื˜ืจืข, ื“ืขืจืžื™ื˜ ืคึผืจืึทื•ื•ื™ื™ื“ื™ื ื’ ื ืึธืš ืคึผืœืึทืฅ ืคึฟืึทืจ ืฉืจื™ื™ื‘ืŸ ื“ื™ ื ื™ื™ื˜ื™ืง ื‘ื™ื˜ืขืก ืื™ืŸ ืคึผืœืึทืฅ ืคื•ืŸ ืงืึธืœื™ืจ ื‘ื™ื˜ืขืก. ืื•ื™ื‘ ืžื™ืจ ื‘ืึทื˜ืจืึทื›ื˜ืŸ ืึทื– ื“ื™ ืžื™ื ื™ืžื•ื ื’ืจื™ื™ืก ืคื•ืŸ ื“ื™ ืคึผืึทืœื™ื˜ืจืข ืื™ื– 2 ืคืืจื‘ืŸ (6 ื‘ื™ื˜ืขืก), ื“ื™ ืžืึทืงืกื™ืžื•ื ื’ืจื™ื™ืก ืคื•ืŸ ื“ื™ ืขืžื‘ืขื“ื™ื“ ืึธื ื–ืึธื’ ืงืขื ืขืŸ ื–ื™ื™ืŸ 256 ร— 3-6 = 762 ื‘ื™ื˜ืขืก. ื“ื™ ื›ื™ืกืึธืจืŸ ืื™ื– ื ื™ื“ืขืจื™ืง ืงืจื™ืคึผื˜ืึธื’ืจืึทืคื™ืง ื–ื™ื›ืขืจื”ื™ื™ื˜; ื“ื™ ืขืžื‘ืขื“ื™ื“ ืึธื ื–ืึธื’ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืœื™ื™ืขื ืขืŸ ืžื™ื˜ ืงื™ื™ืŸ ื˜ืขืงืกื˜ ืจืขื“ืึทืงื˜ืึธืจ ืื•ื™ื‘ ื“ืขืจ ืึธื ื–ืึธื’ ืื™ื– ื ื™ืฉื˜ ืื•ื ื˜ืขืจื˜ืขื ื™ืง ืฆื• ื ืึธืš ืขื ืงืจื™ืคึผืฉืึทืŸ.

ืคึผืจืึทืงื˜ื™ืฉ ื˜ื™ื™ืœ

ืคึผืจืึธื’ืจืึทื ืคึผืœืึทืŸ

ืึทืœืข ื ื™ื™ื˜ื™ืง ืžื›ืฉื™ืจื™ื ืคึฟืึทืจ ื™ืžืคึผืœืึทืžืขื ื™ื ื’ ืขื ืงืจื™ืคึผืฉืึทืŸ ืื•ืŸ ื“ืขืงืจื™ืคึผื˜ื™ืึธืŸ ืึทืœื’ืขืจื™ื“ืึทืžื– ื•ื•ืขื˜ ื–ื™ื™ืŸ ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ืื™ืŸ ื“ืขื ืคึผืขืงืœ com.tsarik.steganography. ื“ืขื ืคึผืขืงืœ ื›ื•ืœืœ ื“ื™ ืฆื•ื‘ื™ื ื“ Encryptor ืžื™ื˜ ืžืขื˜ื”ืึธื“ืก encrypt ะธ decrypt, ืงืœืึทืก Binary, ื•ื•ืึธืก ื’ื™ื˜ ื“ื™ ืคื™ื™ื™ืงื™ื™ื˜ ืฆื• ืึทืจื‘ืขื˜ืŸ ืžื™ื˜ ื‘ื™ืกืœ ืขืจื™ื™ื–, ื•ื•ื™ ื’ืขื–ื•ื ื˜ ื•ื•ื™ ื•ื™ืกื ืขื ืงืœืืกืŸ UnableToEncryptException ะธ UnableToDecryptException, ื•ื•ืึธืก ื–ืึธืœ ื–ื™ื™ืŸ ื’ืขื ื™ืฆื˜ ืื™ืŸ ืฆื•ื‘ื™ื ื“ ืžืขื˜ื”ืึธื“ืก Encryptor ืื™ืŸ ืคืึทืœ ืคื•ืŸ ืงืึธื“ื™ืจื•ื ื’ ืื•ืŸ ื“ื™ืงืึธื•ื“ื™ื ื’ ืขืจืจืึธืจืก ืจื™ืกืคึผืขืงื˜ื™ื•ื•ืœื™.

ื”ื•ื™ืคึผื˜ ืคึผืจืึธื’ืจืึทื ืคึผืขืงืœ com.tsarik.programs.gifed ื•ื•ืขื˜ ืึทืจื™ื™ึทื ื ืขืžืขืŸ ืึท ืจืึทื ืึทื‘ืึทืœ ืคึผืจืึธื’ืจืึทื ืงืœืึทืก ืžื™ื˜ ืึท ืกื˜ืึทื˜ื™ืง ืื•ืคึฟืŸ main, ืึทืœืึทื•ื™ื ื’ ืื™ืจ ืฆื• ืœื•ื™ืคืŸ ื“ืขื ืคึผืจืึธื’ืจืึทื; ืึท ืงืœืึทืก ื•ื•ืึธืก ืกื˜ืึธืจื– ืคึผืจืึธื’ืจืึทื ืคึผืึทืจืึทืžืขื˜ืขืจืก; ืื•ืŸ ืคึผืึทืงืึทื“ื–ืฉืึทื– ืžื™ื˜ ืื ื“ืขืจืข ืงืœืืกืŸ.

ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืึทืœื’ืขืจื™ื“ืึทืžื– ื–ื™ืš ื•ื•ืขื˜ ื–ื™ื™ืŸ ื“ืขืจืœืื ื’ื˜ ืื™ืŸ ื“ืขื ืคึผืขืงืœ com.tsarik.programs.gifed.gif ืงืœืืกืŸ GIFEncryptorByLSBMethod ะธ GIFEncryptorByPaletteExtensionMethod. ื‘ื™ื™ื“ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืงืœืืกืŸ ื•ื•ืขื˜ ื™ื ืกื˜ืจื•ืžืขื ื˜ ื“ื™ ืฆื•ื‘ื™ื ื“ Encryptor.

ื‘ืึทื–ื™ืจื˜ ืื•ื™ืฃ ื“ื™ ืกื˜ืจื•ืงื˜ื•ืจ ืคื•ืŸ ื“ื™ GIF ืคึฟืึธืจืžืึทื˜, ืื™ืจ ืงืขื ืขืŸ ืžืึทื›ืŸ ืึท ื’ืขื ืขืจืึทืœ ืึทืœื’ืขืจื™ื“ืึทื ืคึฟืึทืจ ื™ื ื˜ืจืึธื•ื“ื•ืกื™ื ื’ ืึท ืึธื ื–ืึธื’ ืื™ืŸ ื“ื™ ื‘ื™ืœื“ ืคึผืึทืœื™ื˜ืจืข:

ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™ ืื™ืŸ GIF

ืฆื• ื‘ืึทืฉื˜ื™ืžืขืŸ ื“ืขื ื‘ื™ื™ึทื–ื™ื™ึทืŸ ืคื•ืŸ ืึท ืึธื ื–ืึธื’ ืื™ืŸ ืึท ื‘ื™ืœื“, ืขืก ืื™ื– ื ื™ื™ื˜ื™ืง ืฆื• ืœื™ื™ื’ืŸ ืึท ื–ื™ื›ืขืจ ืกื™ืงื•ื•ืึทื ืก ืคื•ืŸ ื‘ื™ื˜ืŸ ืฆื• ื“ื™ ืึธื ื”ื™ื™ื‘ ืคื•ืŸ ื“ื™ ืึธื ื–ืึธื’, ื•ื•ืึธืก ื“ื™ ื“ื™ืงืึธื•ื“ืขืจ ืœื™ื™ืขื ื˜ ืขืจืฉื˜ืขืจ ืื•ืŸ ื˜ืฉืขืงืก ืคึฟืึทืจ ืจื™ื›ื˜ื™ืง. ืื•ื™ื‘ ืขืก ืื™ื– ื ื™ืฉื˜ ื’ืœื™ื™ึทื›ืŸ, ืขืก ืื™ื– ืงืึทื ืกื™ื“ืขืจื“ ืึทื– ืขืก ืื™ื– ืงื™ื™ืŸ ืคืึทืจื‘ืึธืจื’ืŸ ืึธื ื–ืึธื’ ืื™ืŸ ื“ื™ ื‘ื™ืœื“. ื•ื•ื™ื™ึทื˜ืขืจ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืกืคึผืขืฆื™ืคื™ืฆื™ืจืŸ ื“ื™ ืœืขื ื’ ืคื•ืŸ ื“ื™ ืึธื ื–ืึธื’. ื“ืขืจื ืึธืš ื“ืขืจ ื˜ืขืงืกื˜ ืคื•ืŸ ื“ืขืจ ืึธื ื–ืึธื’ ื–ื™ืš.

ืงืœืึทืก ื“ื™ืึทื’ืจืึทืžืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ื’ืื ืฆืข ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ:

ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™ ืื™ืŸ GIF

ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืคึผืจืึธื’ืจืึทื

ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ื’ืื ืฆืข ืคึผืจืึธื’ืจืึทื ืงืขื ืขืŸ ื–ื™ื™ืŸ ืฆืขื˜ื™ื™ืœื˜ ืื™ืŸ ืฆื•ื•ื™ื™ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ: ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ืฆื•ื‘ื™ื ื“ ืขื ืงืจื™ืคึผืฉืึทืŸ ืื•ืŸ ื“ืขืงืจื™ืคึผื˜ื™ืึธืŸ ืžืขื˜ื”ืึธื“ืก Encryptor, ืื™ืŸ ืงืœืืกืŸ GIFEncryptorByLSBMethod ะธ GIFEncryptorByPaletteExtensionMethod, ืื•ืŸ ื“ื™ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ื‘ืึทื ื™ืฆืขืจ ืฆื•ื‘ื™ื ื“.

ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื“ื™ ืงืœืึทืก GIFEncryptorByLSBMethod.

ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™ ืื™ืŸ GIF

ืคื™ืขืœื“ืก firstLSBit ะธ secondLSBit ืึทื ื˜ื”ืึทืœื˜ืŸ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ื‘ื™ื˜ืŸ ืคื•ืŸ ื™ืขื“ืขืจ ื‘ื™ื™ื˜ ืคื•ืŸ ื“ื™ ื‘ื™ืœื“ ืื™ืŸ ื•ื•ืึธืก ื“ื™ ืึธื ื–ืึธื’ ื–ืึธืœ ื–ื™ื™ืŸ ืืจื™ื™ืŸ ืื•ืŸ ืคื•ืŸ ื•ื•ื• ื“ื™ ืึธื ื–ืึธื’ ื–ืึธืœ ื–ื™ื™ืŸ ืœื™ื™ืขื ืขืŸ. ืคืขืœื“ checkSequence ืกื˜ืึธืจื– ืึท ื˜ืฉืขืง ื‘ื™ืกืœ ืกื™ืงื•ื•ืึทื ืก ืฆื• ืขื ืฉื•ืจ ื“ืขืจืงืขื ื•ื ื’ ืคื•ืŸ ื“ื™ ืขืžื‘ืขื“ื™ื“ ืึธื ื–ืึธื’. ืกื˜ืึทื˜ื™ืง ืื•ืคึฟืŸ getEncryptingFileParameters ืงืขืจื˜ ื“ื™ ืคึผืึทืจืึทืžืขื˜ืขืจืก ืคื•ืŸ ื“ื™ ืกืคึผืขืกืึทืคื™ื™ื“ ื˜ืขืงืข ืื•ืŸ ื“ื™ ืงืขืจืึทืงื˜ืขืจื™ืกื˜ื™ืงืก ืคื•ืŸ ื“ื™ ืคึผืึธื˜ืขื ืฆื™ืขืœ ืึธื ื–ืึธื’.

ืื•ืคึฟืŸ ืึทืœื’ืขืจื™ื“ืึทื encrypt ืงืœืึทืก GIFEncryptorByLSBMethod:

ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™ ืื™ืŸ GIF

ืื•ืŸ ื–ื™ื™ืŸ ืงืึธื“:

@Override
public void encrypt(File in, File out, String text) throws UnableToEncodeException, NullPointerException, IOException {
	if (in == null) {
		throw new NullPointerException("Input file is null");
	}
	if (out == null) {
		throw new NullPointerException("Output file is null");
	}
	if (text == null) {
		throw new NullPointerException("Text is null");
	}
	
	// read bytes from input file
	byte[] bytes = new byte[(int)in.length()];
	InputStream is = new FileInputStream(in);
	is.read(bytes);
	is.close();
	
	// check format
	if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
		throw new UnableToEncodeException("Input file has wrong GIF format");
	}
	
	// read palette size property from first three bits in the 10-th byte from the file
	byte[] b10 = Binary.toBitArray(bytes[10]);
	byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
	
	// calculate color count and possible message length
	int bOrigColorCount = (int)Math.pow(2, bsize+1);
	int possibleMessageLength = bOrigColorCount*3/4;
	int possibleTextLength = possibleMessageLength-2;// one byte for check and one byte for message length
	
	if (possibleTextLength < text.length()) {
		throw new UnableToEncodeException("Text is too big");
	}
	
	int n = 13;
	
	// write check sequence
	for (int i = 0; i < checkSequence.length/2; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		ba[firstLSBit] = checkSequence[2*i];
		ba[secondLSBit] = checkSequence[2*i+1];
		bytes[n] = Binary.toByte(ba);
		n++;
	}
	
	// write text length
	byte[] cl = Binary.toBitArray((byte)text.length());
	for (int i = 0; i < cl.length/2; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		ba[firstLSBit] = cl[2*i];
		ba[secondLSBit] = cl[2*i+1];
		bytes[n] = Binary.toByte(ba);
		n++;
	}
	
	// write message
	byte[] textBytes = text.getBytes();
	for (int i = 0; i < textBytes.length; i++) {
		byte[] c = Binary.toBitArray(textBytes[i]);
		for (int ci = 0; ci < c.length/2; ci++) {
			byte[] ba = Binary.toBitArray(bytes[n]);
			ba[firstLSBit] = c[2*ci];
			ba[secondLSBit] = c[2*ci+1];
			bytes[n] = Binary.toByte(ba);
			n++;
		}
	}
	
	// write output file
	OutputStream os = new FileOutputStream(out);
	os.write(bytes);
	os.close();
}

ืึทืœื’ืขืจื™ื“ืึทื ืื•ืŸ ืžืงื•ืจ ืงืึธื“ ืคื•ืŸ ื“ืขื ืื•ืคึฟืŸ decrypt ืงืœืึทืก GIFEncryptorByLSBMethod:

ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™ ืื™ืŸ GIF

@Override
public String decrypt(File in) throws UnableToDecodeException, NullPointerException, IOException {
	if (in == null) {
		throw new NullPointerException("Input file is null");
	}
	
	// read bytes from input file
	byte[] bytes = new byte[(int)in.length()];
	InputStream is = new FileInputStream(in);
	is.read(bytes);
	is.close();
	
	// check format
	if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
		throw new UnableToDecodeException("Input file has wrong GIF format");
	}
	
	// read palette size property from first three bits in the 10-th byte from the file
	byte[] b10 = Binary.toBitArray(bytes[10]);
	byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
	
	// calculate color count and possible message length
	int bOrigColorCount = (int)Math.pow(2, bsize+1);
	int possibleMessageLength = bOrigColorCount*3/4;
	int possibleTextLength = possibleMessageLength-2;	// one byte for check and one byte for message length
	
	int n = 13;
	
	// read check sequence
	byte[] csBits = new byte[checkSequence.length];
	for (int i = 0; i < 4; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		csBits[2*i] = ba[firstLSBit];
		csBits[2*i+1] = ba[secondLSBit];
		n++;
	}
	byte cs = Binary.toByte(csBits);
	
	if (cs != Binary.toByte(checkSequence)) {
		throw new UnableToDecodeException("There is no encrypted message in the image (Check sequence is incorrect)");
	}
	
	// read text length
	byte[] cl = new byte[8];
	for (int i = 0; i < 4; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		cl[2*i] = ba[firstLSBit];
		cl[2*i+1] = ba[secondLSBit];
		n++;
	}
	byte textLength = Binary.toByte(cl);
	
	if (textLength < 0) {
		throw new UnableToDecodeException("Decoded text length is less than 0");
	}
	if (possibleTextLength < textLength) {
		throw new UnableToDecodeException("There is no messages (Decoded message length (" + textLength + ") is less than Possible message length (" + possibleTextLength + "))");
	}
	
	// read text bits and make text bytes
	byte[] bt = new byte[textLength];
	for (int i = 0; i < bt.length; i++) {
		byte[] bc = new byte[8];
		for (int bci = 0; bci < bc.length/2; bci++) {
			byte[] ba = Binary.toBitArray(bytes[n]);
			bc[2*bci] = ba[firstLSBit];
			bc[2*bci+1] = ba[secondLSBit];
			n++;
		}
		bt[i] = Binary.toByte(bc);
	}
	
	return new String(bt);
}

ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืงืœืึทืก GIFEncryptorByPaletteExtensionMethod ื•ื•ืขื˜ ื–ื™ื™ืŸ ืขื ืœืขืš, ื‘ืœื•ื™ื– ื“ืขืจ ืื•ืคึฟืŸ ืคื•ืŸ ืฉืคึผืึธืจืŸ / ืœื™ื™ืขื ืขืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื™ื– ืึทื ื“ืขืจืฉ.

ืื™ืŸ ืงืœืึทืก MainFrame ืจืึทืคึผืขืจ ืžืขื˜ื”ืึธื“ืก ื–ืขื ืขืŸ ื“ื™ืกืงืจื™ื™ื‘ื“: encryptImage(Encryptor encryptor) ะธ decryptImage(Encryptor encryptor), ืคึผืจืึทืกืขืกื™ื ื’ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ืŸ ืคื•ืŸ ืฆื•ื‘ื™ื ื“ ืžืขื˜ื”ืึธื“ืก Encryptor ืื•ืŸ ื™ื ื˜ืขืจืึทืงื˜ื™ื ื’ ืžื™ื˜ ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ, ื“"ื” ืขืคืŸ ืึท ื˜ืขืงืข ืกืขืœืขืงืฆื™ืข ื“ื™ืึทืœืึธื’, ื•ื•ื™ื™ึทื–ื•ื ื’ ื˜ืขื•ืช ืึทืจื˜ื™ืงืœืขืŸ, ืืื–"ื• ื•; ื•ื•ื™ ืื•ื™ืš ืื ื“ืขืจืข ืžืขื˜ื”ืึธื“ืก: openImage(), ืึทืœืึทื•ื™ื ื’ ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืฆื• ืื•ื™ืกืงืœื™ื™ึทื‘ืŸ ืึท ื‘ื™ืœื“, exit(), ื•ื•ืึธืก ืึทืจื•ื™ืกื’ืึทื ื’ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ื“ื™ ืžืขื˜ื”ืึธื“ืก ื–ืขื ืขืŸ ื’ืขืจื•ืคืŸ ืคื•ืŸ Actionืก ืงืึธืจืึทืกืคึผืึทื ื“ื™ื ื’ ืžืขื ื™ื• ื–ืื›ืŸ. ื“ืขืจ ืงืœืึทืก ืื•ื™ืš ื™ืžืคึผืœืึทืžืึทื ืฅ ืึทื’ื–ื™ืœื™ืขืจื™ ืžืขื˜ื”ืึธื“ืก: createComponents() - ืฉืึทืคื•ื ื’ ืคื•ืŸ ืคืึธืจืขื ืงืึทืžืคึผืึธื•ื ืึทื ืฅ, loadImageFile(File f) - ืœืึธื•ื“ื™ื ื’ ืึท ื‘ื™ืœื“ ืื™ืŸ ืึท ืกืคึผืขืฆื™ืขืœ ืงืึธืžืคึผืึธื ืขื ื˜ ืคึฟื•ืŸ ืึท ื˜ืขืงืข. ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืงืœืึทืก GIFEncryptorByPaletteExtensionMethod ืขื ืœืขืš ืฆื• ื“ื™ ืงืœืึทืก ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ GIFEncryptorByLSBMethod, ื“ืขืจ ื”ื•ื™ืคึผื˜ ื—ื™ืœื•ืง ืื™ื– ืื™ืŸ ื“ื™ ื•ื•ืขื’ ืึธื ื–ืึธื’ ื‘ื™ื˜ืขืก ื–ืขื ืขืŸ ื’ืขืฉืจื™ื‘ืŸ ืื•ืŸ ืœื™ื™ืขื ืขืŸ ืคื•ืŸ ื“ื™ ืคึผืึทืœื™ื˜ืจืข.

ืคึผืจืึธื’ืจืึทื ืึธืคึผืขืจืึทืฆื™ืข

LBS ืื•ืคึฟืŸ

ื–ืืœ ืก ื–ืึธื’ืŸ ืขืก ืื™ื– ืึท ื‘ื™ืœื“ ื•ื•ื™ ื“ืึธืก:

ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™ ืื™ืŸ GIF

ืื™ืŸ ื“ืขื ื‘ื™ืœื“, ื“ื™ ืคึผืึทืœื™ื˜ืจืข ื‘ืืฉื˜ื™ื™ื˜ ืคื•ืŸ 256 ืคืืจื‘ืŸ (ื•ื•ื™ ืคึผืึทื™ื ื˜ ืกืึทื•ื•ืขืก). ื“ื™ ืขืจืฉื˜ืข ืคื™ืจ ืคืืจื‘ืŸ ื–ืขื ืขืŸ: ื•ื•ื™ื™ึทืก, ืฉื•ื•ืึทืจืฅ, ืจื•ื™ื˜, ื’ืจื™ืŸ. ืื ื“ืขืจืข ืคืืจื‘ืŸ ื–ืขื ืขืŸ ืฉื•ื•ืึทืจืฅ. ื“ื™ ื’ืœืื‘ืืœืข ืคึผืึทืœื™ื˜ืจืข ื‘ื™ืกืœ ืกื™ืงื•ื•ืึทื ืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื•ื•ื™ ื’ื™ื™ื˜:

11111111 11111111 11111111 00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111 00000000...

ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™ ืื™ืŸ GIF

ืึทืžืึธืœ ื“ืขืจ ืึธื ื–ืึธื’ ืื™ื– ืขืžื‘ืขื“ื™ื“, ื“ื™ ืึทื ื“ืขืจืœื™ื™ื ื“ ื‘ื™ื˜ืŸ ื•ื•ืขื˜ ื–ื™ื™ืŸ ืจื™ืคึผืœื™ื™ืกื˜ ืžื™ื˜ ื“ื™ ื‘ื™ื˜ืŸ ืคื•ืŸ ื“ืขืจ ืึธื ื–ืึธื’. ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ ื‘ื™ืœื“ ืื™ื– ื›ึผืžืขื˜ ื ื™ื˜ ืึทื ื“ืขืจืฉ ืคื•ืŸ ื“ืขืจ ืึธืจื™ื’ื™ื ืขืœ.

ืึธืจื™ื’ื™ื ืขืœ
ื‘ื™ืœื“ ืžื™ื˜ ืขืžื‘ืขื“ื™ื“ ืึธื ื–ืึธื’

ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™ ืื™ืŸ GIF
ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™ ืื™ืŸ GIF

ืคึผืึทืœืขื˜ื˜ืข ื™ืงืกืคึผืึทื ืฉืึทืŸ ืื•ืคึฟืŸ

ื•ื•ืขืŸ ืื™ืจ ืขืคึฟืขื ืขืŸ ืึท ื‘ื™ืœื“ ืžื™ื˜ ืึท ืึธื ื–ืึธื’ ืžื™ื˜ ื“ืขื ืื•ืคึฟืŸ, ืื™ืจ ื•ื•ืขื˜ ื–ืขืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ื‘ื™ืœื“:

ืกื˜ืขื’ืึทื ืึธื’ืจืึทืคื™ ืื™ืŸ GIF

ืขืก ืื™ื– ืงืœืึธืจ ืึทื– ื“ืขืจ ืื•ืคึฟืŸ ื•ื•ืขื˜ ื ื™ืฉื˜ ืึทืจื‘ืขื˜ืŸ ืคึฟืึทืจ ืคื•ืœ-ืคืœืขื“ื–ืฉื“ ืฉืคึผื™ืึธื ืึทื–ืฉ ืึทืงื˜ื™ื•ื•ื™ื˜ืขื˜ืŸ, ืื•ืŸ ืงืขืŸ ื“ืึทืจืคืŸ ื ืึธืš ืขื ืงืจื™ืคึผืฉืึทืŸ ืคื•ืŸ ื“ืขื ืึธื ื–ืึธื’.

ืขื ืงืจื™ืคึผืฉืึทืŸ / ื“ืขืงืจื™ืคึผื˜ื™ืึธืŸ ืื™ืŸ ืึทื ื™ืžืึทื˜ืขื“ ื‘ื™ืœื“ืขืจ ืึทืจื‘ืขื˜ ืคึผื•ื ืงื˜ ื•ื•ื™ ืื™ืŸ ืจืขื’ื•ืœืขืจ ืกื˜ืึทื˜ื™ืง ื‘ื™ืœื“ืขืจ, ืึธื‘ืขืจ ื“ื™ ืึทื ืึทืžื™ื™ืฉืึทืŸ ืื™ื– ื ื™ืฉื˜ ืฆืขื‘ืจืื›ืŸ.

ืžืงื•ืจื™ื ื’ืขื ื™ืฆื˜:

ื“ืึทื•ื ืœืึธื•ื“:

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’