ááááŤááşá¸
ááąáášááŹáážááˇáşááźáŹá¸áááŻááşááŤáá
áááźáŹááąá¸ááŽá ááášááááŻááşáá˝ááş áááŹáááşááźáŹá¸ááąá
ááş âááááşá¸áĄááťááşáĄáááş ááŻáśááźáŻáśááąá¸áááŻááşáᏠááąáŹáˇááşáá˛ááşáááşá¸áááşá¸ááťáŹá¸â áá˝ááş áááşáááşá¸áá
áşááŻáážááá˛áˇááŤáááşá ááŹáááşá GIF áááŻááşááťáŹá¸áá˝ááş áááşááąáˇááťáşáááˇáşáááˇáş ááááŻááááşáá
áşááŻááᯠáááşááŽá¸áááş ááťá˝ááşáŻááşáááŻáˇááᯠáááŻáĄááşáááşá Java áážáŹááŻááşáááŻáˇááŻáśá¸ááźááşáááŻááşáááşá
ááŽááąáŹááşá¸ááŤá¸áážáŹ ááŽáĄááŻááŽáááŻááşáᏠáĄááťááşáĄááťááŻáˇáĄááźááş ááŽááááŻááááşááąá¸ááᯠáááşáááŻáááşááŽá¸áá˛áˇááá˛áááŻááŹááᯠááąáŹáşááźááŤáááşá
áĄáááŻááŤááŽáĄááŻááŽáá áşá áááşáá áşáááŻááşá¸
GIF ááąáŹáşáááş
GIF (ááááşáá áşááážááşáážáŻááąáŹáşáááş - ááŻáśááťáŹá¸ááážááşáááˇáşááąáŹáşáááş) áááş áĄááąáŹááş 256 ááąáŹááşáĄáá ááąáŹáşáááşááźááˇáş áĄáááşáĄáá˝áąá¸áááŻáśá¸áážáŻáśá¸áᲠááťáŻáśáˇááŹá¸ááąáŹááąááŹááᯠááááşá¸áááşá¸áááŻááşáááˇáş ááááşáá áşááŻáśááťáŹá¸ááᯠááááşá¸áááşá¸áááşáĄáá˝ááş ááąáŹáşáááşáá áşááŻááźá áşáááşá á¤ááąáŹáşáááşááᯠ1987 (GIF87a) áá˝ááş CompuServe ááž áá˝ááşáááşááťáŹá¸ááąáŤáşáá˝ááş raster ááŻáśááťáŹá¸ááᯠááŻááşáá˝ážááˇáşáááşáĄáá˝ááş ááŽáá˝ááşáá˛áˇáááşá 1989 ááŻáážá áşáá˝ááşá ááąáŹáşáááş (GIF89a) ááᯠáá˝ááşá¸ááśáá˛áˇááźáŽá¸á áá˝ááˇáşáááşá¸ááźááşááŹáážáŻáážááˇáş ááŹáá˝ááşá¸áĄáá˝ááş ááśáˇáááŻá¸áážáŻááᯠáááˇáşáá˝ááşá¸áá˛áˇáááşá
GIF áááŻááşááťáŹá¸áá˝ááş ááááşáááŻáˇáá˝á˛áˇá ááşá¸ááŻáś áážááááşá á¤áááąáŹááşááťáŹá¸áááş ááŻáśááąáĄáážááşáá áşááŻáĄááźá˛áážáááŤáááş (áááŻáˇáááŻááş áĄááťááŻáˇááąáŹáĄááśááťáŹá¸ááąáŤáşáá˝ááşáá°áááşáááş) áááŻáˇááźáąáŹááˇáş áááąáŹááşáá áşááŻá áŽáááşáážááááˇáşááąááŹáážááˇáşáááşáááşá áĄáážáŹá¸ááŻááşáááşáááźá áşáááŻááşááąá GIF89a ááąáŹáşáááşáážá áĄáááŻá¸áážááşá¸ááŻáśá¸ ááŹáá˝ááşá¸áááŻááşááąáŹ GIF ááŻááşááŻáśá áá˝á˛áˇá ááşá¸ááŻáś-

áá˝á˛áˇá
ááşá¸áááşááąáŹááşááŻáśááŻáśá¸ááťáŹá¸áĄáŹá¸ááŻáśá¸á á¤áĄááźáąáĄááąáá˝ááşá ááťá˝ááşáŻááşáááŻáˇáááş ááášááŹááŻáśá¸áááŻááşáᏠááťááşááťááşááŻáśá¸áážááˇáş palette áĄáá˝ááş ááŹáááşáážáááąáŹ ááąáŹááşááťáŹá¸ááᯠá
áááşáááşá
áŹá¸ááŤáááş-
CT- ááášááŹááŻáśá¸áááŻááşáᏠááťááşááťááşáá áşáᯠáážáááąááźááşá¸á á¤áĄááśááᯠáááşáážááşááŤáá ááášááŹááŻáśá¸áááŻááşáᏠpalette áááş ááŻáášáááááşááŹá¸ááźááş áááŻááşáá˝ááşááźáŽá¸ááąáŹááş ááťááşááťááşá¸á áááşáááŤáááşáSize- ááŻáśáá˝ááşááŤáážáááąáŹáĄááąáŹááşááťáŹá¸áážááˇáş palette áĄáá˝ááşáĄá áŹá¸á á¤áááˇáşáááşááťááşáĄáá˝ááş áááşáááŻá¸ááťáŹá¸-
áĄáá˝ááş
áĄááąáŹááşáĄááąáĄáá˝ááş
ááťááşááťááşáĄáá˝ááşáĄá
áŹá¸á áááŻááşááťáŹá¸
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) áááşá¸áááşá¸
- Palette ááąáŤááşá¸áááˇáşáááşá¸
LSB áááşá¸áááşá¸ - ááąáá°ááťááŻáśááąáááşá¸á áááşá¸áá˝ááş áá˝ááşááááşááŹáážá ááąáŹááşááŻáśá¸ááááŹáááşáážáŹá¸ááąáŹ bit ááťáŹá¸ (ááťá˝ááşáŻááşáááŻáˇááá ášá áá˝ááşá ááášááŹááŻáśá¸áááŻááşáᏠpalette bytes) ááᯠáážááşááŹá¸ááąáŹá áŹá bits ááťáŹá¸ááźááˇáş áĄá áŹá¸áááŻá¸ááźááşá¸ ááŤáááşáááşá
ááááŻááááşáááş á¤áááşá¸áááşá¸á áá áşá áááşáá áşáááŻááşá¸áĄááźá áş ááášááŹááŻáśá¸áááŻááşáᏠpalette bytes áĄáá˝ááşá¸áážá ááąáŹááşááŻáśá¸áá áşáážá áşááŻááᯠáĄááŻáśá¸ááźáŻáááşááźá áşáááşá áááŻáááŻáááşáážáŹ 24-bit ááŻááşááŻáśáá áşááŻáśáĄáá˝ááş palette áĄááąáŹááşáááş áĄááŽá áĄááźáŹáážááˇáş áĄá áááşá¸áĄáá˝ááş ááŻáśá¸áááŻááşáážáááŹá áááşá¸áá˝ááş áááşááąáˇááťáşáá áşááŻááᯠáááˇáşáá˝ááşá¸ááźáŽá¸ááąáŹááşá áĄááąáŹááşáĄá áááşáĄáááŻááşá¸áá áşááŻá áŽáááş áĄááťáŹá¸ááŻáśá¸ 3/255 áĄáááˇáşáĄáá ááźáąáŹááşá¸áá˛áá˝áŹá¸áááşááźá áşáááşá áááŻáááŻáˇááąáŹááźáąáŹááşá¸áá˛áážáŻááᯠááááŚá¸á á˝áŹ áá°ááŹá¸ááťááşá áááźááˇáş áááźááşáááŻááşááąáŹ áááŻáˇáááŻááş áááááźáŻáááááş áááşáá˛áááşááźá áşááźáŽá¸á ááŻááááĄááťááşáážáŹ áĄáááşáĄáá˝áąá¸ááááˇáşááąáŹ ááááşá¸áá˝ááşáážáááááááŹááťáŹá¸áá˝ááş áááşá¸ááᯠááźááşáááŻááşáááşáááŻááşááąá
áĄááťááşáĄáááşáááŹááááş ááŻáś palette á áĄáá˝ááşáĄá áŹá¸ááąáŤáşáá˝ááş áááŻááşáááŻááşáá°áááşááŤáááşá ááťááşááťááşá áĄááźááˇáşááŻáśá¸áĄáá˝ááşáĄá áŹá¸áážáŹ áĄááąáŹááş 256 ááąáŹááşááźá áşááźáŽá¸ áĄááąáŹááşáá áşááŻá áŽá áĄá áááşáĄáááŻááşá¸áá áşááŻá áŽáá˝ááş áááşááąáˇááťáşáážá áşááŻááᯠááąá¸ááŹá¸ááŤáá áĄááźááˇáşááŻáśá¸áááşááąáˇááşáťáĄáážááş (ááŻáśáá˝ááş áĄááťáŹá¸ááŻáśá¸ palette ááŤáážáááąáŹ) áááş 192 bytes ááźá áşáááşá áááşááąáˇááťáşááᯠááŻáśáá˝ááş áááˇáşáá˝ááşá¸ááźáŽá¸áááşáážááˇáşá áááŻááşáĄáá˝ááşáĄá áŹá¸ áááźáąáŹááşá¸áá˛ááŤá
Palette ááťá˛áˇáááşá¸GIF áá˝á˛áˇá ááşá¸ááŻáśáĄáá˝ááşáᏠáĄááŻááşááŻááşáááşá ááąá¸áááşáá˛áˇ palette ááŤáá˛áˇ ááŻáśáá˝áąááąáŤáşáážáŹ áĄááááąáŹááşááŻáśá¸ááźá áşááŤááááˇáşáááşá áááşá¸á áĄáážá áşááŹááážáŹ áááşá¸áááş palette á áĄáá˝ááşáĄá áŹá¸ááᯠáááŻá¸á áąááźáŽá¸ ááąáŹááşá áŻáśáááŻááşááťáŹá¸áĄá áŹá¸ áááŻáĄááşááąáŹ áááŻááşááťáŹá¸ááᯠááąá¸ááŹá¸áááş áááşááąáŹááşá¸ááąáᏠááąá¸ááąáŹááşáááźááşá¸ ááźá áşáááşá ááťááşááťááşá áĄááááˇáşááŻáśá¸áĄáá˝ááşáĄá áŹá¸áááş áĄááąáŹááş 2 ááąáŹááş (6 bytes) áᯠáá°áááŤáá áááˇáşáá˝ááşá¸ááŹá¸ááąáŹ áááşááąáˇááťáşá áĄááťáŹá¸ááŻáśá¸áĄáá˝ááşáĄá áŹá¸áážáŹ 256 Ă 3â6 = 762 bytes ááźá áşáááŻááşááŤáááşá áĄáŹá¸áááşá¸ááťááşáážáŹ ááŻááşáážááşá áá áş ááŻáśááźáŻáśáážáŻ áááşá¸ááŤá¸áááşá áááşááąáˇááťáşááᯠáááşááąáŹááşá¸ ááŻááşáážááşááźááşá¸ áááźáŻááŤá áááşáááˇáş á áŹááŹá¸áááşá¸ááźááşáážáŻáááᯠáĄááŻáśá¸ááźáŻá áááˇáşáá˝ááşá¸ááŹá¸ááąáŹ áááşááąáˇááťáşááᯠáááşáááŻááşááŤáááşá
áááşáá˝áąáˇáá áşá áááşáá áşááąá
áĄá áŽáĄá ááşááŽáááŻááşá¸
ááŻááşáážááşááźááşá¸áážááˇáş ááŻááşáážááşááźááşá¸áááŻááşáᏠáĄááşááááŻááŽáááşááťáŹá¸ááᯠáĄááąáŹááşáĄáááşááąáŹáşáááşáĄáá˝ááş áááŻáĄááşááąáŹááááááŹááťáŹá¸áĄáŹá¸ááŻáśá¸ááᯠáááşááąáˇááťáşáá˝ááş áááˇáşáá˝ááşá¸ááŤáááşá com.tsarik.steganography. á¤áĄááŻááşáá˝ááş áĄááşááŹááąáˇá
áşááŤáááşáááşá Encryptor áááşá¸áááşá¸ááťáŹá¸ááźááˇáş encrypt и decryptááĄáááşá¸ Binarybit arrays ááťáŹá¸áĄááźááş exception classes ááťáŹá¸ááźááˇáş áĄááŻááşááŻááşáááŻááşá
á˝ááşá¸ááᯠááśáˇáááŻá¸ááąá¸ááąáŹá UnableToEncryptException и UnableToDecryptExceptionáĄááşááŹááąáˇá
áşáááşá¸áááşá¸ááťáŹá¸áá˝ááş áĄááŻáśá¸ááźáŻáááˇáşáááşá Encryptor encoding áážááˇáş decoding error áĄááŽá¸ááŽá¸áážáááťážááşá
áááşááĄá
áŽáĄá
ááşáĄááŻááş com.tsarik.programs.gifed static method ááźááˇáş runnable program class áá
áşáᯠááŤáááşáááşá mainááááŻááááşááᯠrun áááşáá˝ááˇáşááźáŻáááşá ááááŻááááşááąáŹááşááťáŹá¸ááᯠááááşá¸áááşá¸áááˇáş áĄáááşá¸áĄá
áŹá¸á áĄááźáŹá¸áĄáááşá¸ááťáŹá¸áážááˇáşáĄáá° packages ááťáŹá¸á
áĄááşááááŻááŽáááşááťáŹá¸ áĄááąáŹááşáĄáááşááąáŹáşáážáŻááᯠáĄááŻááşáá˝ááş áááşááźááŤáááşá com.tsarik.programs.gifed.gif áĄáááşá¸ááťáŹá¸ GIFEncryptorByLSBMethod и GIFEncryptorByPaletteExtensionMethod. á¤áĄáááşá¸áážá
áşááŻá
ááŻáśá¸áááş interface áááŻáĄááąáŹááşáĄáááşááąáŹáşááááˇáşáááşá Encryptor.
GIF ááąáŹáşáááşá áááşááąáŹááşááŻáśáĄááąáŤáş áĄááźáąááśá áááşáááş ááŻááşááŻáś palette áááŻáˇ áááşááąáˇááťáşáá áşááŻááᯠááááşáááşáááşáĄáá˝ááş ááąáá°ááť áĄááşááááŻááŽáááşáá áşááŻááᯠáááşááŽá¸áááŻááşáááş-

ááŻáśáá
áşááŻáśáá˝ááş áááşááąáˇááťáşáá
áşáᯠáážáááąááźááşá¸ááᯠááŻáśá¸ááźááşáááşá ááŻááşááŤáááş áŚá¸á
á˝áŹáááşááźáŽá¸ áážááşáááşáážáŻ áážáááážá á
á
áşááąá¸ááąá¸áááˇáş áááşááąáˇááťáşá áĄá
áá˝ááş áĄááťááŻáˇááąáŹ áĄá
áŽáĄá
áĽáşáá
áşááŻááᯠááąáŤááşá¸áááˇáşáááş áááŻáĄááşááŤáááşá ááááŻááşááŽááŤá ááŻáśáá˝ááş áážááşááŹá¸ááąáŹ áááşááąáˇááťáşááážááᯠáá°áááŤáááşá ááąáŹááşáá
áşááŻáááąáŹáˇ áááşááąáˇááşáťáá˛áˇ áĄáážááşááᯠáááşáážááşáááŤáááşá áĄá˛ááŽáĄááŤáážáŹ áááşááąáˇááşáťáá˛áˇ á
áŹááŹá¸á áá°áˇááŹáá°á
áĄáááŽááąá¸áážááşá¸áá áşááŻááŻáśá¸á Class diagram-

áĄá áŽáĄá ááşááᯠáĄááąáŹááşáĄáááşááąáŹáşááźááşá¸á
ááááŻááááşáá
áşááŻááŻáśá¸ááĄááąáŹááşáĄáááşááąáŹáşáážáŻááᯠáĄá
áááşáĄáááŻááşá¸áážá
áşááŻáĄááźá
áş áááŻááşá¸ááźáŹá¸áááŻááşáááş- áĄááşááŹááąáˇá
áşááŻááşáážááşááźááşá¸áážááˇáş á
áŹáážááşááźááşá¸áááşá¸áááşá¸ááťáŹá¸ááᯠáĄááąáŹááşáĄáááşááąáŹáşááźááşá¸á EncryptoráĄáááşá¸áá˛áá˝ááşá GIFEncryptorByLSBMethod и GIFEncryptorByPaletteExtensionMethodáážááˇáş user interface ááĄááąáŹááşáĄáááşááąáŹáşáážáŻá
áĄáááşá¸ááᯠáááşááźááşááŤá GIFEncryptorByLSBMethod.

Fields firstLSBit и secondLSBit ááŻáśáá
áşááŻáśááťááşá¸á
áŽá byte áá
áşááŻá
áŽá bits ááśááŤááşááťáŹá¸ááŤáážáááźáŽá¸ áááşááąáˇááťáşáááˇáşáááˇáşáááˇáşááąááŹááž áááşááąáˇááťáşááᯠáááşáááˇáşáááşá áááşáá˝ááşá¸ checkSequence áááˇáşáá˝ááşá¸ááŹá¸ááąáŹ áááşááąáˇááťáşááᯠáĄáááĄáážááşááźáŻááźáąáŹááşá¸ ááąááťáŹá
áąáááş check bit sequence ááᯠááááşá¸áááşá¸ááŤá áĄááźáááşáááşá¸áááşá¸ getEncryptingFileParameters áááşáážááşááŹá¸ááąáŹáááŻááşá áááˇáşáááşááťááşááťáŹá¸áážááˇáş ááźá
áşáááŻááşááťáąáážáááąáŹ áááşááąáˇááťáşá ááááąáááášáááŹááťáŹá¸ááᯠááźááşááąá¸áááşá
áááşá¸áááşá¸ algorithm 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();
}
áááşá¸áááşá¸á áĄááşááááŻááŽáááşáážááˇáş áĄáááşá¸áĄááźá
áşááŻááş 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 wrapper áááşá¸áááşá¸ááťáŹá¸ááᯠááąáŹáşááźááŹá¸ááŤáááşá encryptImage(Encryptor encryptor) и decryptImage(Encryptor encryptor)ááźáŹá¸ááśáááşá¸áááşá¸ááťáŹá¸á ááááşááťáŹá¸ááᯠááŻááşááąáŹááşááźááşá¸á Encryptor áĄááŻáśá¸ááźáŻáá°áážááˇáş áĄááźááşáĄáážááş áááşááśááźááşá¸á áááŻáááŻáááşáážáŹ áááŻááşáá˝áąá¸ááťááşáážáŻ áááŻááşááŹááąáŹáˇááşááᯠáá˝ááˇáşááźááşá¸á áĄáážáŹá¸áĄáá˝ááşá¸ áááşááąáˇááťáşááťáŹá¸ ááźáááźááşá¸ á
áááşááźááˇáşá áĄááźáŹá¸áááşá¸áááşá¸ááťáŹá¸áĄááźááş openImage()áĄááŻáśá¸ááźáŻáá°ááᯠááŻáśáá
áşááŻáśáá˝áąá¸ááťááşáá˝ááˇáşááąá¸ááźááşá¸á exit()áĄáááŽááąá¸áážááşá¸ááž áá˝ááşááąáŹá á¤áááşá¸ááťáŹá¸ááᯠáážááˇáşááąáŤáşáááşá ActionáááşáááŻááşááąáŹ ááŽáá°á¸ áá
ášá
ááşá¸ááťáŹá¸á á¤áĄáááşá¸áááş áĄáááşáááşá¸áááşá¸ááťáŹá¸ááᯠáááşááąáŹááşá¸ááŻááşááąáŹááşáááş- createComponents() - ááŻáśá
áś áĄá
áááşáĄáááŻááşá¸ááťáŹá¸ áááşááŽá¸ááźááşá¸á loadImageFile(File f) â áááŻááşáá
áşááŻááž áĄáá°á¸áĄá
áááşáĄáááŻááşá¸áá
áşááŻáááŻáˇ ááŻáśáá
áşááŻááᯠáááşááźááşá¸á áĄáááşá¸ááĄááąáŹááşáĄáááşááąáŹáşáážáŻ GIFEncryptorByPaletteExtensionMethod class implementation áá˛áˇ áááşáá°ááŤáááşá GIFEncryptorByLSBMethodáĄááááá˝áŹááźáŹá¸ááťááşáážáŹ palette ááž message bytes ááťáŹá¸ááᯠááąá¸ááŹá¸ááźááşá¸áážááˇáş áááşááźááşá¸áá˝ááşááźá
áşáááşá
ááááŻááááşáááşáááşáážáŻ
LBS áááşá¸áááşá¸
ááŽáááŻááŻáśááąá¸áážááááşáááŻááŤá ááŻáˇá

á¤ááŻáśáá˝ááşá palette áá˝ááş áĄááąáŹááş 256 ááąáŹááş (Paint save as) ááŤáááşááŤáááşá ááááĄááąáŹááşááąá¸ááťááŻá¸áááąáŹáˇ áĄááźá°á áĄáááşá áĄááŽá áĄá
áááşá¸á áĄááźáŹá¸áĄááąáŹááşááťáŹá¸áážáŹ áĄáááşááąáŹááşááźá
áşáááşá global palette bit sequence áááş áĄáąáŹááşááŤáĄáááŻááşá¸ ááźá
áşááááˇáşáááş á
11111111 11111111 11111111 00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111 00000000...

áááşááąáˇááťáşááᯠáááˇáşáá˝ááşá¸ááźáŽá¸áááşáážááˇáşá ááťááşá¸ááŹá¸ááŹá¸ááąáŹ áá
áşááťáŹá¸ááᯠáááşááąáˇááťáşááž áá
áşááťáŹá¸ááźááˇáş áĄá
áŹá¸áááŻá¸áááşááźá
áşáááşá áááŹáá˛áˇááŻáśá áá°áááşá¸ááŻáśáá˛áˇ ááŻáśá¸áááá°ááŤáá°á¸á
áá°áááşá¸
áááˇáşáá˝ááşá¸ááŹá¸ááąáŹ áááşááąáˇááťáşáážááˇáşáĄáá° ááŻáś

![]()
Palette ááťá˛áˇáááşá¸
á¤áááşá¸áááşá¸ááᯠáĄááŻáśá¸ááźáŻá áááşááąáˇááťáşááŤáážáááąáŹ ááŻáśáá áşááŻáśááᯠáááşáá˝ááˇáşááąáŹáĄááŤáá˝ááş áĄáąáŹááşááŤááŻáśááᯠáááşáá˝áąáˇááźááşáááááˇáşáááş-

á¤áááşá¸áááşá¸áááş ááźáŽá¸ááźááˇáşá
áŻáśááąáŹ áá°ááťážááŻáážáŻááşáážáŹá¸áážáŻááťáŹá¸áĄáá˝ááş áĄááŻááşáááźá
áşáááŻááşááźáąáŹááşá¸áážááˇáş áááşááąáˇááťáşá áááşááąáŹááşá¸ááŻááşáážááşááźááşá¸ áááŻáĄááşáááŻááşáááş áááşáážáŹá¸ááŤáááşá
ááŹáá˝ááşá¸ááŻááşááŻáśááťáŹá¸áá˝ááş ááŻááşáážááşááźááşá¸/á áŹáážááşááźááşá¸ áááş ááŻáśáážááş ááŻáśááášááŹááşááŻáśááťáŹá¸áá˛áˇáááŻáˇ áĄááŻááşááŻááşááąáŹáşáááşá¸ ááŹáá˝ááşá¸ááŻááşááŻáśááťáŹá¸áááş ááťááşááá˝áŹá¸ááŤá
áĄááŻáśá¸ááźáŻááŹá¸ááąáŹ áĄáááşá¸áĄááźá áşááťáŹá¸-
ááąáŤááşá¸ááŻááş:
source: www.habr.com
