เบเบฒเบเบเปเบฒเบชเบฐเปเบซเบเบต
เบเบณ เบญเบงเบเบเบญเบ.
เปเบกเบทเปเบญเบเปเปเบเบปเบเบกเบฒเบเบตเป, เปเบกเบทเปเบญเบเปเบญเบเบฎเบฝเบเบขเบนเปเบกเบฐเบซเบฒเบงเบดเบเบฐเบเบฒเปเบฅ, เบกเบตเบซเบผเบฑเบเบชเบนเบเปเบเบฅเบฐเบเบฝเบเบงเบดเปเบ "เบงเบดเบเบตเบเบฒเบเบเบญเบเปเบงเบเบงเบฒเบกเบเบญเบเปเบเบเบญเบเบเปเปเบกเบนเบ." เบเบฒเบเบกเบญเบเบซเบกเบฒเบเบฎเบฝเบเบฎเปเบญเบเปเบซเปเบเบงเบเปเบฎเบปเบฒเบชเปเบฒเบเปเบเบเบเบฒเบเบเบตเปเบเบฑเบเบเปเปเบเบงเบฒเบกเปเบเปเบเบฅเป GIF. เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเปเบฎเบฑเบเบกเบฑเบเบขเบนเปเปเบ Java.
เปเบเบเบปเบเบเบงเบฒเบกเบเบตเปเบเปเบฒเบเบฐเปเบเบปเปเบฒเบเบฐเบญเบฐเบเบดเบเบฒเบเบเบฒเบเบเบธเบเบเบดเบเบชเบฐเบเบต, เปเบเบฑเปเบเบเบฝเบงเบเบฑเบเบเบฑเบเบงเบดเบเบตเบเบฒเบเปเบเบเบเบฒเบเบเบฐเบซเบเบฒเบเบเปเบญเบเบเบตเปเบเบทเบเบชเปเบฒเบเบเบถเปเบ.
เบเบฒเบเบเบดเบเบชเบฐเบเบต
เบฎเบนเบเปเบเบ GIF
GIF (Graphics Interchange Format - เบฎเบนเบเปเบเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฅเบเบเปเบฝเบเบฎเบนเบเบเบฒเบ) เปเบเบฑเบเบฎเบนเบเปเบเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเบฎเบนเบเบเบฒเบเบฎเบนเบเบเบฒเบ, เบชเบฒเบกเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเบเปเปเบกเบนเบเบเบตเปเบเบทเบเบเบตเบเบญเบฑเบเปเบเบเบเปเปเบกเบตเบเบฒเบเบชเบนเบเปเบชเบเบเบธเบเบเบฐเบเบฒเบเปเบเบฎเบนเบเปเบเบเบเบญเบเบชเบตเปเบเบดเบ 256. เบฎเบนเบเปเบเบเบเบตเปเปเบเปเบเบทเบเบเบฑเบเบเบฐเบเบฒเปเบเบเบต 1987 (GIF87a) เปเบเบ CompuServe เบชเปเบฒเบฅเบฑเบเบเบฒเบเบชเบปเปเบเบฎเบนเบเบเบฒเบ raster เบเปเบฒเบเปเบเบทเบญเบเปเบฒเบ. เปเบเบเบต 1989, เบฎเบนเบเปเบเบเปเบเปเบเบทเบเบเบฑเบเปเบเป (GIF89a), เบเบฒเบเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบเบเบงเบฒเบกเปเบเปเบเปเบชเปเบฅเบฐเบเบฒเบเปเบเบทเปเบญเบเปเบซเบงเปเบเปเบเบทเบเปเบเบตเปเบก.
เปเบเบฅเป GIF เบกเบตเปเบเบเบชเปเบฒเบเบเบฅเบฑเบญเบ. เบเบฑเบเปเบซเบผเบปเปเบฒเบเบตเปเบชเบฐเปเบซเบกเบตเบกเบตเบเบงเบฒเบกเบเบฒเบงเบเบปเบเบเบตเป (เบซเบผเบทเบกเบฑเบเบเบถเปเบเบเบฑเบเบเบฒเบเบเบธเบ), เบเบฑเปเบเบเบฑเปเบเบกเบฑเบเปเบเบทเบญเบเปเบเบฑเบเปเบเบเปเปเปเบเปเบเบตเปเบเบฐเปเบฎเบฑเบเบเบดเบเบเบฒเบเบเปเบฝเบงเบเบฑเบเบเปเบญเบเบเบตเปเปเบเปเบฅเบฐเบเบฑเบเบเบฑเปเบเบขเบนเป. เปเบเบเบชเปเบฒเบเบเบญเบเบฎเบนเบเบเบฒเบ GIF เบเบตเปเบเปเปเบกเบตเบเบฒเบเปเบเบทเปเบญเบเปเบซเบงเบเบตเปเบเปเบฒเบเบเบฒเบเบเบตเปเบชเบธเบเปเบเบฎเบนเบเปเบเบ GIF89a:

เบเบญเบเบเปเบญเบเปเบกเปเบเบฑเบเบซเบกเบปเบเบเบญเบเปเบเบเบชเปเบฒเบ, เปเบเบเปเบฅเบฐเบเบตเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฐเบชเบปเบเปเบเบเบฑเบเบเบฑเบ 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 เบฎเบนเบเบเบฒเบ:

เปเบเบทเปเบญเบเปเบฒเบเบปเบเบเบฒเบเบเบฐเบเบปเบเบเบปเบงเบเบญเบเบเปเปเบเบงเบฒเบกเปเบเบฎเบนเบเบเบฒเบ, เบกเบฑเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเบตเปเบกเบฅเปเบฒเบเบฑเบเบเบตเปเปเบเปเบเบญเบเบเบญเบ bits เปเบชเปเบเบธเบเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบเบเปเปเบเบงเบฒเบก, เปเบเบดเปเบเบเบปเบงเบเบญเบเบฅเบฐเบซเบฑเบเบเบฐเบญเปเบฒเบเบเปเบญเบเปเบฅเบฐเบเบงเบเปเบเบดเปเบเบเบงเบฒเบกเบเบทเบเบเปเบญเบ. เบเปเบฒเบกเบฑเบเบเปเปเบเบปเบเบเบฑเบ, เบกเบฑเบเบเบทเบงเปเบฒเบเปเปเบกเบตเบเปเปเบเบงเบฒเบกเบเบตเปเปเบเบทเปเบญเบเปเบงเปเปเบเบฎเบนเบเบเบฒเบ. เบเปเปเปเบ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบเปเบฒเบเบปเบเบเบงเบฒเบกเบเบฒเบงเบเบญเบเบเปเปเบเบงเบฒเบก. เบซเบผเบฑเบเบเบฒเบเบเบฑเปเบ, เบเปเปเบเบงเบฒเบกเบเบญเบเบเปเปเบเบงเบฒเบกเบเบปเบงเบกเบฑเบเปเบญเบ.
เปเบเบเบงเบฒเบเบซเปเบญเบเบฎเบฝเบเบเบญเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบฑเบเปเบปเบ:

เบเบฒเบเบเบฑเบเบเบฑเปเบเบเบฐเบเบดเบเบฑเบเปเบเบเบเบฒเบ
เบเบฒเบเบเบฐเบเบดเบเบฑเบเปเบเบเบเบฒเบเบเบฑเบเบซเบกเบปเบเบชเบฒเบกเบฒเบเปเบเปเบเบญเบญเบเปเบเบฑเบเบชเบญเบเบญเบปเบเบเบฐเบเบญเบ: เบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบเบเบฒเบเปเบเปเบเบญเบเปเบฅเบฐเบเบฒเบเบเบญเบเบฅเบฐเบซเบฑเบ Encryptor, เปเบเบซเปเบญเบเบฎเบฝเบ GIFEncryptorByLSBMethod ะธ GIFEncryptorByPaletteExtensionMethod, เปเบฅเบฐเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเปเบเปเบเบญเบเบเบนเปเปเบเป.
เบเบดเบเบฒเบฅเบฐเบเบฒเบซเปเบญเบเบฎเบฝเบ GIFEncryptorByLSBMethod.

เบเบปเปเบเบเบฒ firstLSBit ะธ secondLSBit เบกเบตเบเปเบฒเบเบงเบเบเบดเบเบเบญเบเปเบเปเบฅเบฐ byte เบเบญเบเบฎเบนเบเบเบฒเบเบเบตเปเบเปเปเบเบงเบฒเบกเบเบงเบเบเบฐเบเบทเบเปเบชเปเปเบฅเบฐเบเบฒเบเบเปเบญเบเบเบตเปเบเปเปเบเบงเบฒเบกเบเบงเบเบญเปเบฒเบ. เบเบฒเบเบชเบฐเบซเบเบฒเบก checkSequence เปเบเบฑเบเบฎเบฑเบเบชเบฒเบฅเปเบฒเบเบฑเบ check bit เปเบเบทเปเบญเบฎเบฑเบเบเบฐเบเบฑเบเบเบฒเบเบฎเบฑเบเบฎเบนเปเบเปเปเบเบงเบฒเบกเบเบตเปเบเบฑเบเปเบงเป. เบงเบดเบเบตเบเบฒเบเบเบปเบเบเบตเป getEncryptingFileParameters เบชเบปเปเบเบเบทเบเบเบฒเบฅเบฒเบกเบดเปเบเบตเบเบญเบเปเบเบฅเปเบเบตเปเบฅเบฐเบเบธเปเบงเปเปเบฅเบฐเบเบธเบเบฅเบฑเบเบชเบฐเบเบฐเบเบญเบเบเปเปเบเบงเบฒเบกเบเบตเปเปเบเบฑเบเปเบเปเบเป.
เบชเบนเบเบงเบดเบเบต encrypt เบซเปเบญเบโเบฎเบฝเบ GIFEncryptorByLSBMethod:

เปเบฅเบฐเบฅเบฐเบซเบฑเบเบเบญเบเบฅเบฒเบง:
@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:

@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
เบชเบปเบกเบกเบธเบเบงเปเบฒเบกเบตเบฎเบนเบเบเบฒเบเปเบเบเบเบตเป:

เปเบเบฎเบนเบเบเบตเป, palette เบเบฐเบเบญเบเบเปเบงเบ 256 เบชเบต (เปเบเบฑเบ Paint saves). เบชเบตเปเบชเบตเบเปเบฒเบญเบดเบเปเบกเปเบ: เบชเบตเบเบฒเบง, เบชเบตเบเปเบฒ, เบชเบตเปเบเบ, เบชเบตเบเบฝเบง. เบชเบตเบญเบทเปเบเปเปเบกเปเบเบชเบตเบเปเบฒ. เบฅเปเบฒเบเบฑเบ bit palette เบเบปเปเบงเปเบฅเบเบเบฐเปเบเบฑเบเบเบฑเปเบเบเปเปเปเบเบเบตเป:
11111111 11111111 11111111 00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111 00000000...

เปเบกเบทเปเบญเบเปเปเบเบงเบฒเบกเบเบทเบเบเบฑเบ, เบเบดเบเบเบตเปเบเบฝเบเปเบงเปเบเบฐเบเบทเบเปเบเบเบเบตเปเบเปเบงเบเบเบดเบเบเบฒเบเบเปเปเบเบงเบฒเบก. เบฎเบนเบเบเบฒเบเบเบปเบเปเบเปเบฎเบฑเบเปเบกเปเบเปเบเบทเบญเบเบเปเปเปเบเบเบเปเบฒเบเบเบฒเบเบเบปเปเบเบชเบฐเบเบฑเบ.
เบเบปเปเบเบชเบฐเบเบฑเบ
เบฎเบนเบเบเบฒเบเบเบตเปเบกเบตเบเปเปเบเบงเบฒเบกเบเบฑเบ

![]()
เบงเบดเบเบตเบเบฒเบเบเบฐเบซเบเบฒเบ Palette
เปเบกเบทเปเบญเบเปเบฒเบเปเบเบตเบเบฎเบนเบเบเบฒเบเบเบตเปเบกเบตเบเปเปเบเบงเบฒเบกเปเบเบเปเบเปเบงเบดเบเบตเบเบตเป, เบเปเบฒเบเบเบฐเปเบซเบฑเบเบฎเบนเบเบเปเปเปเบเบเบตเป:

เบกเบฑเบเปเบเบฑเบเบเบตเปเบเบฑเบเปเบเบเบงเปเบฒเบงเบดเบเบตเบเบฒเบเบเบตเปเบเบฐเบเปเปเปเบฎเบฑเบเบงเบฝเบเบชเปเบฒเบฅเบฑเบเบเบดเบเบเบฐเบเปเบฒ espionage เบขเปเบฒเบเปเบเบฑเบกเบเบตเป, เปเบฅเบฐเบญเบฒเบเบเบฐเบฎเบฝเบเบฎเปเบญเบเปเบซเปเบกเบตเบเบฒเบเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบเปเบเบตเปเบกเปเบเบตเบกเบเบญเบเบเปเปเบเบงเบฒเบก.
เบเบฒเบเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบ/เบเบญเบเบฅเบฐเบซเบฑเบเปเบเบฎเบนเบเบเบฒเบเปเบเบทเปเบญเบเปเบซเบงเปเบฎเบฑเบเบงเบฝเบเบเบทเบเบฑเบเบเบฑเบเบฎเบนเบเบเบฒเบเบชเบฐเบเบดเบเบเบปเบเบเบฐเบเบด, เปเบเปเบเบฒเบเปเบเบทเปเบญเบเปเบซเบงเบเปเปเปเบเปเปเบเบ.
เปเบซเบผเปเบเบเปเปเบกเบนเบเบเบตเปเปเบเป:
เบเบฒเบงเปเบซเบฅเบ:
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com
