เบเบฒเบ™เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต

เบ„เบณ เบญเบงเบเบžเบญเบ™.
เป€เบกเบทเปˆเบญเบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰, เป€เบกเบทเปˆเบญเบ‚เป‰เบญเบเบฎเบฝเบ™เบขเบนเปˆเบกเบฐเบซเบฒเบงเบดเบ—เบฐเบเบฒเป„เบฅ, เบกเบตเบซเบผเบฑเบเบชเบนเบ”เปƒเบ™เบฅเบฐเบšเบฝเบšเบงเบดเป„เบ™ "เบงเบดเบ—เบตเบเบฒเบ™เบŠเบญเบšเปเบงเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™." เบเบฒเบ™เบกเบญเบšเบซเบกเบฒเบเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบเบฑเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบ™เป„เบŸเบฅเปŒ GIF. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเป€เบฎเบฑเบ”เบกเบฑเบ™เบขเบนเปˆเปƒเบ™ Java.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบญเบฐเบ—เบดเบšเบฒเบเบšเบฒเบ‡เบˆเบธเบ”เบ—เบดเบ”เบชเบฐเบ”เบต, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเบ™เบตเป‰เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™.

เบžเบฒเบเบ—เบดเบ”เบชเบฐเบ”เบต

เบฎเบนเบšเปเบšเบš GIF

GIF (Graphics Interchange Format - เบฎเบนเบšเปเบšเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบฅเบเบ›เปˆเบฝเบ™เบฎเบนเบšเบžเบฒเบš) เป€เบ›เบฑเบ™เบฎเบนเบšเปเบšเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบฎเบนเบšเบžเบฒเบšเบฎเบนเบšเบžเบฒเบš, เบชเบฒเบกเบฒเบ”เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเบšเบตเบšเบญเบฑเบ”เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบชเบนเบ™เป€เบชเบเบ„เบธเบ™เบ™เบฐเบžเบฒเบšเปƒเบ™เบฎเบนเบšเปเบšเบšเบ‚เบญเบ‡เบชเบตเป€เบ–เบดเบ‡ 256. เบฎเบนเบšเปเบšเบšเบ™เบตเป‰เป„เบ”เป‰เบ–เบทเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเปƒเบ™เบ›เบต 1987 (GIF87a) เป‚เบ”เบ CompuServe เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบปเปˆเบ‡เบฎเบนเบšเบžเบฒเบš raster เบœเปˆเบฒเบ™เป€เบ„เบทเบญเบ‚เปˆเบฒเบ. เปƒเบ™เบ›เบต 1989, เบฎเบนเบšเปเบšเบšเป„เบ”เป‰เบ–เบทเบเบ”เบฑเบ”เปเบเป‰ (GIF89a), เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ„เบงเบฒเบกเป‚เบ›เปˆเบ‡เปƒเบชเปเบฅเบฐเบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบก.

เป„เบŸเบฅเปŒ GIF เบกเบตเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบšเบฅเบฑเบญเบ. เบ•เบฑเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบชเบฐเป€เบซเบกเบตเบกเบตเบ„เบงเบฒเบกเบเบฒเบงเบ„เบปเบ‡เบ—เบตเปˆ (เบซเบผเบทเบกเบฑเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบšเบฒเบ‡เบ—เบธเบ‡), เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบกเบฑเบ™เป€เบเบทเบญเบšเป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบœเบดเบ”เบžเบฒเบ”เบเปˆเบฝเบงเบเบฑเบšเบšเปˆเบญเบ™เบ—เบตเปˆเปเบ•เปˆเบฅเบฐเบ•เบฑเบ™เบ•เบฑเป‰เบ‡เบขเบนเปˆ. เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบš GIF เบ—เบตเปˆเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบ—เบตเปˆเบ‡เปˆเบฒเบเบ”เบฒเบเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เบฎเบนเบšเปเบšเบš GIF89a:

Steganography เปƒเบ™ GIF

เบ‚เบญเบ‡เบ—เปˆเบญเบ™เป„เบกเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบปเบ™เปƒเบˆเบเบฑเบšเบ•เบฑเบ™ palette เบ—เบปเปˆเบงเป‚เบฅเบเปเบฅเบฐเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ—เบตเปˆเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบชเปเบฒเบฅเบฑเบš palette:

  • CT โ€” เบกเบต palette เป‚เบฅเบ. เบ–เป‰เบฒเบ—เบธเบ‡เบ™เบตเป‰เบ–เบทเบเบ•เบฑเป‰เบ‡, palette เป‚เบฅเบเบˆเบฐเบ•เป‰เบญเบ‡เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบฑเบ™เบ—เบตเบซเบผเบฑเบ‡เบˆเบฒเบเบˆเบฑเบšเบซเบ™เป‰เบฒเบˆเปเบขเปˆเบฒเบ‡เบกเบตเป€เบซเบ”เบœเบปเบ™.
  • Size - เบ‚เบฐโ€‹เบซเบ™เบฒเบ” palette เปเบฅเบฐโ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เบชเบตโ€‹เปƒเบ™โ€‹เบฎเบนเบšโ€‹เบžเบฒเบšโ€‹. เบ„เปˆเบฒเบชเปเบฒเบฅเบฑเบšเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ™เบตเป‰:

เป€เบฅเบทเบญเบเบ‚เบฐเบซเบ™เบฒเบ”
เบˆเปเบฒเบ™เบงเบ™เบชเบต
เบ‚เบฐเบซเบ™เบฒเบ” Palette, bytes

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 (Bit Significant Bit).
  • เบงเบดเบ—เบตเบเบฒเบ™เป€เบžเบตเปˆเบก Palette

เบงเบดเบ—เบตเบเบฒเบ™ LSB - เบงเบดเบ—เบตเบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡ steganography. เบกเบฑเบ™เบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบเบฒเบ™เบ›เปˆเบฝเบ™ bits เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบเปƒเบ™เบ–เบฑเบ‡ (เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ, palette bytes เบ—เบปเปˆเบงเป‚เบฅเบ) เบเบฑเบš bits เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ‡เป„เบงเป‰.

เป‚เบ„เบ‡เบเบฒเบ™เบˆเบฐเปƒเบŠเป‰เบชเบญเบ‡เบšเบดเบ”เบชเบธเบ”เบ—เป‰เบฒเบเปƒเบ™ palette bytes เบ—เบปเปˆเบงเป‚เบฅเบเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰. เบ™เบตเป‰เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบชเปเบฒเบฅเบฑเบšเบฎเบนเบšเบžเบฒเบš 24-bit, เบšเปˆเบญเบ™เบ—เบตเปˆ palette เบชเบตเปเบกเปˆเบ™เบชเบฒเบก bytes เบชเปเบฒเบฅเบฑเบšเบชเบตเปเบ”เบ‡, เบชเบตเบŸเป‰เบฒ, เปเบฅเบฐเบชเบตเบ‚เบฝเบง, เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฑเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบกเบฑเบ™, เปเบ•เปˆเบฅเบฐเบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบชเบตเบˆเบฐเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบชเบนเบ‡เบชเบธเบ”เบ‚เบญเบ‡ 3/255 gradations. เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เบ—เปเบฒเบญเบดเบ”, เบˆเบฐเป€เบšเบดเปˆเบ‡เบšเปเปˆเป€เบซเบฑเบ™เบซเบผเบทเบเบฒเบเบ—เบตเปˆเบˆเบฐเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบเบฑเบšเบ•เบฒเบ‚เบญเบ‡เบกเบฐเบ™เบธเบ”, เปเบฅเบฐเบญเบฑเบ™เบ—เบตเบชเบญเบ‡, เบกเบฑเบ™เบˆเบฐเบšเปเปˆเป€เบซเบฑเบ™เป„เบ”เป‰เปƒเบ™เบญเบธเบ›เบฐเบเบญเบ™เบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบ„เบธเบ™เบ™เบฐเบžเบฒเบšเบ•เปˆเปเบฒ.

เบˆเปเบฒเบ™เบงเบ™เบ‚เปเป‰เบกเบนเบ™เป‚เบ”เบเบเบปเบ‡เบˆเบฐเบ‚เบถเป‰เบ™เบเบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡ palette เบฎเบนเบšเบžเบฒเบš. เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบ‚เบฐเบซเบ™เบฒเบ”เบชเบนเบ‡เบชเบธเบ”เบ‚เบญเบ‡ palette เปเบกเปˆเบ™ 256 เบชเบต, เปเบฅเบฐเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบชเบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ–เบทเบเบ‚เบฝเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐเบชเบต, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ„เบงเบฒเบกเบเบฒเบงเบ‚เปเป‰เบ„เบงเบฒเบกเบชเบนเบ‡เบชเบธเบ” (เบกเบต palette เบชเบนเบ‡เบชเบธเบ”เปƒเบ™เบฎเบนเบšเบžเบฒเบš) เปเบกเปˆเบ™ 192 bytes. เป€เบกเบทเปˆเบญเบ‚เปเป‰เบ„เบงเบฒเบกเบ–เบทเบเบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบฎเบนเบšเบžเบฒเบš, เบ‚เบฐเบซเบ™เบฒเบ”เป„เบŸเบฅเปŒเบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡.

เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ Palette, เป€เบŠเบดเปˆเบ‡เบžเบฝเบ‡เปเบ•เปˆเป€เบฎเบฑเบ”เบงเบฝเบเบชเปเบฒเบฅเบฑเบšเป‚เบ„เบ‡เบชเป‰เบฒเบ‡ GIF. เบกเบฑเบ™เบˆเบฐเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ—เบตเปˆเบชเบธเบ”เปƒเบ™เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบกเบต palette เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ. เป‚เบ”เบเป€เบ™เบทเป‰เบญเปเบ—เป‰เปเบฅเป‰เบงเบ‚เบญเบ‡เบกเบฑเบ™เปเบกเปˆเบ™เบงเปˆเบฒเบกเบฑเบ™เป€เบžเบตเปˆเบกเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡ palette, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบˆเบถเปˆเบ‡เบชเบฐเบซเบ™เบญเบ‡เบžเบทเป‰เบ™เบ—เบตเปˆเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบฝเบ™ bytes เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เปเบ—เบ™ bytes เบชเบต. เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบžเบดโ€‹เบˆเบฒโ€‹เบฅเบฐโ€‹เบ™เบฒโ€‹เบงเปˆเบฒโ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบ•เปเบฒโ€‹เปˆโ€‹เบชเบธเบ”โ€‹เบ—เบตเปˆโ€‹เบ‚เบญเบ‡ palette เปเบกเปˆเบ™ 2 เบชเบต (6 bytesโ€‹)โ€‹, เบซเบผเบฑเบ‡โ€‹เบˆเบฒเบโ€‹เบ™เบฑเป‰เบ™โ€‹เบ‚เบฐโ€‹เบซเบ™เบฒเบ”โ€‹เบชเบนเบ‡โ€‹เบชเบธเบ”โ€‹เบ‚เบญเบ‡โ€‹เบ‚เปเป‰โ€‹เบ„เบงเบฒเบกโ€‹เบ—เบตเปˆโ€‹เบเบฑเบ‡โ€‹เบ•เบปเบงโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เปเบกเปˆเบ™ 256 ร— 3โ€“6 = 762 bytesโ€‹. เบ‚เปเป‰เป€เบชเบเปเบกเปˆเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ•เปเปˆเบฒ; เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบเบฑเบ‡เป„เบงเป‰เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰เป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเปเบเป‰เป„เบ‚เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบ”เป†เบ–เป‰เบฒเบ‚เปเป‰เบ„เบงเบฒเบกเบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบก.

เบžเบฒเบเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”

เบเบฒเบ™เบญเบญเบเปเบšเบšเป‚เบ„เบ‡เบเบฒเบ™

เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ—เบฑเบ‡เปเบปเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ” เปเบฅเบฐเบฅเบฐเบšเบปเบšเบ–เบญเบ”เบฅเบฐเบซเบฑเบ” algorithms เบˆเบฐเบ–เบทเบเบฅเบงเบกเบขเบนเปˆเปƒเบ™เบŠเบธเบ” com.tsarik.steganography. เบŠเบธเบ”เบ™เบตเป‰เบ›เบฐเบเบญเบšเบกเบตเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš Encryptor เบ”เป‰เบงเบโ€‹เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™โ€‹ encrypt ะธ decrypt, เบซเป‰เบญเบ‡เบฎเบฝเบ™ Binary, เป€เบŠเบดเปˆเบ‡เบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš bit arrays, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบซเป‰เบญเบ‡เบฎเบฝเบ™เบเบปเบเป€เบงเบฑเป‰เบ™ UnableToEncryptException ะธ UnableToDecryptException, เบ—เบตเปˆเบ„เบงเบ™เบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš Encryptor เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบเบฒเบ™เบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เบœเบดเบ”เบžเบฒเบ”เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš.

เบŠเบธเบ”เป‚เบ„เบ‡เบเบฒเบ™เบ•เบปเป‰เบ™เบ•เป com.tsarik.programs.gifed เบˆเบฐเบฅเบงเบกเป€เบญเบปเบฒเบซเป‰เบญเบ‡เบฎเบฝเบ™เป‚เบ›เบฃเปเบเบก runnable เบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™ static main, เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เป‚เบ„เบ‡เบเบฒเบ™; เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ—เบตเปˆเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เป‚เบ„เบ‡เบเบฒเบ™; เปเบฅเบฐเบเบฒเบ™เบซเบธเป‰เบกเบซเปเปˆเบเบฑเบšเบซเป‰เบญเบ‡เบฎเบฝเบ™เบญเบทเปˆเบ™เป†.

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ•เบปเบงเป€เบญเบ‡เบˆเบฐเบ–เบทเบเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปƒเบ™เบŠเบธเบ” com.tsarik.programs.gifed.gif เบซเป‰เบญเบ‡เบฎเบฝเบ™ GIFEncryptorByLSBMethod ะธ GIFEncryptorByPaletteExtensionMethod. เบ—เบฑเบ‡เบชเบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš Encryptor.

เบญเบตเบ‡เบ•เบฒเบกเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡เบฎเบนเบšเปเบšเบš GIF, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเป‰เบฒเบ‡เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบปเปˆเบงเป„เบ›เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบ™เบฐเบ™เปเบฒเบ‚เปเป‰เบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ palette เบฎเบนเบšเบžเบฒเบš:

Steganography เปƒเบ™ GIF

เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบ™เบฎเบนเบšเบžเบฒเบš, เบกเบฑเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบฅเปเบฒเบ”เบฑเบšเบ—เบตเปˆเปเบ™เปˆเบ™เบญเบ™เบ‚เบญเบ‡ bits เปƒเบชเปˆเบˆเบธเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก, เป€เบŠเบดเปˆเบ‡เบ•เบปเบงเบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เบˆเบฐเบญเปˆเบฒเบ™เบเปˆเบญเบ™เปเบฅเบฐเบเบงเบ”เป€เบšเบดเปˆเบ‡เบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡. เบ–เป‰เบฒเบกเบฑเบ™เบšเปเปˆเบเบปเบ‡เบเบฑเบ™, เบกเบฑเบ™เบ–เบทเบงเปˆเบฒเบšเปเปˆเบกเบตเบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ‡เป„เบงเป‰เปƒเบ™เบฎเบนเบšเบžเบฒเบš. เบ•เปเปˆเป„เบ›, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบเปเบฒเบ™เบปเบ”เบ„เบงเบฒเบกเบเบฒเบงเบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ‚เปเป‰เบ„เบงเบฒเบกเบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡.

เปเบœเบ™เบงเบฒเบ”เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เบ—เบฑเบ‡เปเบปเบ”:

Steganography เปƒเบ™ GIF

เบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ„เบ‡เบเบฒเบ™

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ„เบ‡เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบชเบฒเบกเบฒเบ”เปเบšเปˆเบ‡เบญเบญเบเป€เบ›เบฑเบ™เบชเบญเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบš: เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเปเบฅเบฐเบเบฒเบ™เบ–เบญเบ”เบฅเบฐเบซเบฑเบ” Encryptor, เปƒเบ™เบซเป‰เบญเบ‡เบฎเบฝเบ™ GIFEncryptorByLSBMethod ะธ GIFEncryptorByPaletteExtensionMethod, เปเบฅเบฐเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบœเบนเป‰เปƒเบŠเป‰.

เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบซเป‰เบญเบ‡เบฎเบฝเบ™ GIFEncryptorByLSBMethod.

Steganography เปƒเบ™ GIF

เบ—เบปเปˆเบ‡เบ™เบฒ firstLSBit ะธ secondLSBit เบกเบตเบˆเปเบฒเบ™เบงเบ™เบšเบดเบ”เบ‚เบญเบ‡เปเบ•เปˆเบฅเบฐ byte เบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบ‚เปเป‰เบ„เบงเบฒเบกเบ„เบงเบ™เบˆเบฐเบ–เบทเบเปƒเบชเปˆเปเบฅเบฐเบˆเบฒเบเบšเปˆเบญเบ™เบ—เบตเปˆเบ‚เปเป‰เบ„เบงเบฒเบกเบ„เบงเบ™เบญเปˆเบฒเบ™. เบžเบฒเบเบชเบฐเบซเบ™เบฒเบก checkSequence เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบฅเปเบฒเบ”เบฑเบš check bit เป€เบžเบทเปˆเบญเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบเบฒเบ™เบฎเบฑเบšเบฎเบนเป‰เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบเบฑเบ‡เป„เบงเป‰. เบงเบดเบ—เบตเบเบฒเบ™เบ„เบปเบ‡เบ—เบตเปˆ getEncryptingFileParameters เบชเบปเปˆเบ‡เบ„เบทเบ™เบžเบฒเบฅเบฒเบกเบดเป€เบ•เบตเบ‚เบญเบ‡เป„เบŸเบฅเปŒเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปเบฅเบฐเบ„เบธเบ™เบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰.

เบชเบนเบ”เบงเบดเบ—เบต encrypt เบซเป‰เบญเบ‡โ€‹เบฎเบฝเบ™ GIFEncryptorByLSBMethod:

Steganography เปƒเบ™ 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();
}

Algorithm เปเบฅเบฐเบฅเบฐเบซเบฑเบ”เปเบซเบผเปˆเบ‡เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™ decrypt เบซเป‰เบญเบ‡โ€‹เบฎเบฝเบ™ GIFEncryptorByLSBMethod:

Steganography เปƒเบ™ 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 เปเบฅเบฐเบเบฒเบ™เบžเบปเบงเบžเบฑเบ™เบเบฑเบšเบœเบนเป‰เปƒเบŠเป‰, i.e. เป€เบ›เบตเบ”เบเปˆเบญเบ‡เป€เบฅเบทเบญเบเป„เบŸเบฅเปŒ, เบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบชเบฐเปเบ”เบ‡เบ‚เปเป‰เบœเบดเบ”เบžเบฒเบ”, เปเบฅเบฐเบญเบทเปˆเบ™เป†; เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบญเบทเปˆเบ™เป†: openImage(), เปƒเบซเป‰โ€‹เบœเบนเป‰โ€‹เปƒเบŠเป‰โ€‹เป€เบžเบทเปˆเบญโ€‹เบ„เบฑเบ”โ€‹เป€เบฅเบทเบญเบโ€‹เป€เบญเบปเบฒโ€‹เบฎเบนเบšโ€‹เบžเบฒเบšโ€‹, exit(), เป€เบŠเบดเปˆเบ‡เบญเบญเบเบˆเบฒเบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เบงเบดเบ—เบตเบเบฒเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เป€เบญเบตเป‰เบ™เบงเปˆเบฒเบˆเบฒเบ Actionเบฅเบฒเบเบเบฒเบ™เป€เบกเบ™เบนเบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™. เบซเป‰เบญเบ‡เบฎเบฝเบ™เบ™เบตเป‰เบเบฑเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบงเบดเบ—เบตเบเบฒเบ™เบŠเปˆเบงเบ: createComponents() - เบเบฒเบ™โ€‹เบชเป‰เบฒเบ‡โ€‹เบญเบปเบ‡โ€‹เบ›เบฐโ€‹เบเบญเบšโ€‹เบ‚เบญเบ‡โ€‹เบฎเบนเบšโ€‹เปเบšเบšโ€‹, loadImageFile(File f) โ€” เบเบฒเบ™เป‚เบซเบผเบ”เบฎเบนเบšเบžเบฒเบšเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบžเบดเป€เบชเบ”เบˆเบฒเบเป„เบŸเบฅเปŒ. เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบšเบฑเบ”โ€‹เบ‚เบญเบ‡โ€‹เบซเป‰เบญเบ‡โ€‹เบฎเบฝเบ™โ€‹ GIFEncryptorByPaletteExtensionMethod เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบซเป‰เบญเบ‡เบฎเบฝเบ™ GIFEncryptorByLSBMethod, เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™ bytes เบ‚เปเป‰เบ„เบงเบฒเบกเบ–เบทเบเบ‚เบฝเบ™เปเบฅเบฐเบญเปˆเบฒเบ™เบˆเบฒเบ palette.

เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เป‚เบ„เบ‡เบเบฒเบ™

เบงเบดเบ—เบตเบเบฒเบ™ LBS

เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบกเบตเบฎเบนเบšเบžเบฒเบšเปเบšเบšเบ™เบตเป‰:

Steganography เปƒเบ™ GIF

เปƒเบ™เบฎเบนเบšเบ™เบตเป‰, palette เบ›เบฐเบเบญเบšเบ”เป‰เบงเบ 256 เบชเบต (เป€เบ›เบฑเบ™ Paint saves). เบชเบตเปˆเบชเบตเบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™: เบชเบตเบ‚เบฒเบง, เบชเบตเบ”เปเบฒ, เบชเบตเปเบ”เบ‡, เบชเบตเบ‚เบฝเบง. เบชเบตเบญเบทเปˆเบ™เป†เปเบกเปˆเบ™เบชเบตเบ”เปเบฒ. เบฅเปเบฒเบ”เบฑเบš bit palette เบ—เบปเปˆเบงเป‚เบฅเบเบˆเบฐเป€เบ›เบฑเบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

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

Steganography เปƒเบ™ GIF

เป€เบกเบทเปˆเบญเบ‚เปเป‰เบ„เบงเบฒเบกเบ–เบทเบเบเบฑเบ‡, เบšเบดเบ”เบ—เบตเปˆเบ‚เบฝเบ™เป„เบงเป‰เบˆเบฐเบ–เบทเบเปเบ—เบ™เบ—เบตเปˆเบ”เป‰เบงเบเบšเบดเบ”เบˆเบฒเบเบ‚เปเป‰เบ„เบงเบฒเบก. เบฎเบนเบšเบžเบฒเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™เป€เบเบทเบญเบšเบšเปเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบˆเบฒเบเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš.

เบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš
เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบกเบตเบ‚เปเป‰เบ„เบงเบฒเบกเบเบฑเบ‡

Steganography เปƒเบ™ GIF
Steganography เปƒเบ™ GIF

เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ Palette

เป€เบกเบทเปˆเบญเบ—เปˆเบฒเบ™เป€เบ›เบตเบ”เบฎเบนเบšเบžเบฒเบšเบ—เบตเปˆเบกเบตเบ‚เปเป‰เบ„เบงเบฒเบกเป‚เบ”เบเปƒเบŠเป‰เบงเบดเบ—เบตเบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เบฎเบนเบšเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

Steganography เปƒเบ™ GIF

เบกเบฑเบ™เป€เบ›เบฑเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบงเปˆเบฒเบงเบดเบ—เบตเบเบฒเบ™เบ™เบตเป‰เบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบชเปเบฒเบฅเบฑเบšเบเบดเบ”เบˆเบฐเบเปเบฒ espionage เบขเปˆเบฒเบ‡เป€เบ•เบฑเบกเบ—เบตเปˆ, เปเบฅเบฐเบญเบฒเบ”เบˆเบฐเบฎเบฝเบเบฎเป‰เบญเบ‡เปƒเบซเป‰เบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก.

เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”/เบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เปƒเบ™เบฎเบนเบšเบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเป€เบฎเบฑเบ”เบงเบฝเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบฎเบนเบšเบžเบฒเบšเบชเบฐเบ–เบดเบ”เบ›เบปเบเบเบฐเบ•เบด, เปเบ•เปˆเบžเบฒเบšเป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเบšเปเปˆเป„เบ”เป‰เปเบ•เบ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเปƒเบŠเป‰:

เบ”เบฒเบงเป‚เบซเบฅเบ”:

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster