āĻā§āĻŽāĻŋāĻāĻž
ĐŅивĐĩŅŅŅвŅŅ
āĻā§āĻŦ āĻŦā§āĻļāĻŋ āĻĻāĻŋāύ āĻāĻā§, āϝāĻāύ āĻāĻŽāĻŋ āĻŦāĻŋāĻļā§āĻŦāĻŦāĻŋāĻĻā§āϝāĻžāϞāϝāĻŧā§ āĻ
āϧā§āϝāϝāĻŧāύ āĻāϰāϤāĻžāĻŽ, āϤāĻāύ "āϤāĻĨā§āϝ āϏā§āϰāĻā§āώāĻžāϰ āϏāĻĢā§āĻāĻāϝāĻŧā§āϝāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋ" āĻŦāĻŋāώāϝāĻŧā§ āĻāĻāĻāĻŋ āĻā§āϰā§āϏāĻāϝāĻŧāĻžāϰā§āĻ āĻāĻŋāϞāĨ¤ āĻ
ā§āϝāĻžāϏāĻžāĻāύāĻŽā§āύā§āĻā§āϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻŽāύ āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻšāĻŦā§ āϝāĻž GIF āĻĢāĻžāĻāϞāĻā§āϞāĻŋāϤ⧠āĻāĻāĻāĻŋ āĻŦāĻžāϰā§āϤāĻž āĻāĻŽā§āĻŦā§āĻĄ āĻāϰā§āĨ¤ āĻāĻŽāĻŋ āĻāĻžāĻāĻžāϤ⧠āĻāĻāĻŋ āĻāϰāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύāĻŋāϝāĻŧā§āĻāĻŋāĨ¤
āĻāĻ āύāĻŋāĻŦāύā§āϧ⧠āĻāĻŽāĻŋ āĻāĻŋāĻā§ āϤāĻžāϤā§āϤā§āĻŦāĻŋāĻ āĻĒāϝāĻŧā§āύā§āĻ āĻŦāϰā§āĻŖāύāĻž āĻāϰāĻŦ, āϏā§āĻāϏāĻžāĻĨā§ āĻā§āĻāĻžāĻŦā§ āĻāĻ āĻā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻāĻŋ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤
āϤāĻžāϤā§āϤā§āĻŦāĻŋāĻ āĻ āĻāĻļ
GIF āĻŦāĻŋāύā§āϝāĻžāϏ
GIF (āĻā§āϰāĻžāĻĢāĻŋāĻā§āϏ āĻāύā§āĻāĻžāϰāĻā§āĻā§āĻ āĻĢāϰāĻŽā§āϝāĻžāĻ - āĻāĻŦāĻŋ āĻāĻĻāĻžāύ-āĻĒā§āϰāĻĻāĻžāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻŦāĻŋāύā§āϝāĻžāϏ) āĻšāϞ āĻā§āϰāĻžāĻĢāĻŋāĻ āĻāĻŦāĻŋ āϏāĻāϰāĻā§āώāĻŖā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻŦāĻŋāύā§āϝāĻžāϏ, āϝāĻž 256āĻāĻŋ āϰāĻā§āϰ āĻŦāĻŋāύā§āϝāĻžāϏ⧠āĻā§āĻŖāĻŽāĻžāύā§āϰ āĻā§āώāϤāĻŋ āĻāĻžāĻĄāĻŧāĻžāĻ āϏāĻāĻā§āĻāĻŋāϤ āĻĄā§āĻāĻž āϏāĻāϰāĻā§āώāĻŖ āĻāϰāϤ⧠āϏāĻā§āώāĻŽāĨ¤ āĻāĻ āĻŦāĻŋāύā§āϝāĻžāϏāĻāĻŋ 1987 āϏāĻžāϞ⧠(GIF87a) CompuServe āĻĻā§āĻŦāĻžāϰāĻž āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻāĻā§āϞāĻŋāϤ⧠āϰāĻžāϏā§āĻāĻžāϰ āĻāĻŋāϤā§āϰāĻā§āϞāĻŋ āĻĒā§āϰā§āϰāĻŖā§āϰ āĻāύā§āϝ āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤ 1989 āϏāĻžāϞā§, āĻŦāĻŋāύā§āϝāĻžāϏāĻāĻŋ āĻĒāϰāĻŋāĻŦāϰā§āϤāύ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ (GIF89a), āϏā§āĻŦāĻā§āĻāϤāĻž āĻāĻŦāĻ āĻ ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύā§āϰ āĻāύā§āϝ āϏāĻŽāϰā§āĻĨāύ āϝā§āĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞāĨ¤
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 āĻĢāϰā§āĻŽā§āϝāĻžāĻā§āϰ āĻāĻžāĻ āĻžāĻŽā§āϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰā§, āĻāĻĒāύāĻŋ āĻāĻŋāϤā§āϰ āĻĒā§āϝāĻžāϞā§āĻā§ āĻāĻāĻāĻŋ āĻŦāĻžāϰā§āϤāĻž āĻĒā§āϰāĻŦāϰā§āϤāύā§āϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻ ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:

āĻāĻāĻāĻŋ āĻāĻŦāĻŋāϤ⧠āĻāĻāĻāĻŋ āĻŦāĻžāϰā§āϤāĻžāϰ āĻāĻĒāϏā§āĻĨāĻŋāϤāĻŋ āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰāϤā§, āĻŦāĻžāϰā§āϤāĻžāϰ āĻļā§āϰā§āϤ⧠āĻŦāĻŋāĻā§āϰ āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻā§āϰāĻŽ āϝā§āĻā§āϤ āĻāϰāĻž āĻĒā§āϰāϝāĻŧā§āĻāύ, āϝāĻž āĻĄāĻŋāĻā§āĻĄāĻžāϰ āĻĒā§āϰāĻĨāĻŽā§ āĻĒāĻĄāĻŧā§ āĻāĻŦāĻ āϏāĻ āĻŋāĻāϤāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰā§āĨ¤ āϝāĻĻāĻŋ āĻāĻāĻŋ āĻŽā§āϞ⧠āύāĻž, āϤāĻŦā§ āĻāĻāĻŋ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰāĻž āĻšāϝāĻŧ āϝ⧠āĻāĻŦāĻŋāϤ⧠āĻā§āύāĻ āϞā§āĻāĻžāύ⧠āĻŦāĻžāϰā§āϤāĻž āύā§āĻāĨ¤ āĻĒāϰāĻŦāϰā§āϤā§āϤ⧠āĻāĻĒāύāĻžāĻā§ āĻŦāĻžāϰā§āϤāĻžāĻāĻŋāϰ āĻĻā§āϰā§āĻā§āϝ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āϤāĻžāϰāĻĒāϰ āύāĻŋāĻā§āĻ āĻŽā§āϏā§āĻā§āϰ āĻā§āĻā§āϏāĻāĨ¤
āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύā§āϰ āĻā§āϞāĻžāϏ āĻĄāĻžāϝāĻŧāĻžāĻā§āϰāĻžāĻŽ:

āĻāϰā§āĻŽāϏā§āĻāĻŋāϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ
āĻĒā§āϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύāĻā§ āĻĻā§āĻāĻŋ āĻāĻĒāĻžāĻĻāĻžāύ⧠āĻāĻžāĻ āĻāϰāĻž āϝāĻžāϝāĻŧ: āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻāύāĻā§āϰāĻŋāĻĒāĻļāύ āĻāĻŦāĻ āĻĄāĻŋāĻā§āϰāĻŋāĻĒāĻļāύ āĻĒāĻĻā§āϧāϤāĻŋāϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ Encryptor, āĻā§āϞāĻžāϏ⧠GIFEncryptorByLSBMethod и GIFEncryptorByPaletteExtensionMethod, āĻāĻŦāĻ āĻāĻāĻāĻžāϰ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύāĨ¤
āĻā§āϞāĻžāϏ āĻŦāĻŋāĻŦā§āĻāύāĻž āĻāϰā§āύ GIFEncryptorByLSBMethod.

āĻā§āώā§āϤā§āϰ firstLSBit и secondLSBit āĻāĻŽā§āĻā§āϰ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻŦāĻžāĻāĻā§āϰ āĻŦāĻŋāĻā§āϰ āϏāĻāĻā§āϝāĻž āϰāϝāĻŧā§āĻā§ āϝā§āĻāĻžāύ⧠āĻŦāĻžāϰā§āϤāĻžāĻāĻŋ āĻĒā§āϰāĻŦā§āĻļ āĻāϰāĻž āĻāĻāĻŋāϤ āĻāĻŦāĻ āϝā§āĻāĻžāύ āĻĨā§āĻā§ āĻŦāĻžāϰā§āϤāĻžāĻāĻŋ āĻĒāĻĄāĻŧāĻž āĻāĻāĻŋāϤāĨ¤ āĻŽāĻžāĻ checkSequence āĻāĻŽāĻŦā§āĻĄā§āĻĄ āĻŦāĻžāϰā§āϤāĻžāϰ āϏā§āĻŦā§āĻā§āϤāĻŋ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āĻāĻāĻāĻŋ āĻā§āĻ āĻŦāĻŋāĻ āĻā§āϰāĻŽ āϏāĻā§āĻāϝāĻŧ āĻāϰā§āĨ¤ āϏā§āĻā§āϝāĻžāĻāĻŋāĻ āĻĒāĻĻā§āϧāϤāĻŋ 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();
}
āĻĒāĻĻā§āϧāϤāĻŋāϰ āĻ
ā§āϝāĻžāϞāĻāϰāĻŋāĻĻāĻŽ āĻāĻŦāĻ āϏā§āϰā§āϏ āĻā§āĻĄ 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 āĻāĻŦāĻ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻ
ā§āϝāĻžāĻā§āĻ āĻāϰāĻž, āϝā§āĻŽāύ āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻĄāĻžāϝāĻŧāĻžāϞāĻ āĻā§āϞāĻž, āϤā§āϰā§āĻāĻŋ āĻŦāĻžāϰā§āϤāĻž āĻĻā§āĻāĻžāύ⧠āĻāϤā§āϝāĻžāĻĻāĻŋ; āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻ
āύā§āϝāĻžāύā§āϝ āĻĒāĻĻā§āϧāϤāĻŋ: openImage(), āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āĻāĻāĻāĻŋ āĻāĻŦāĻŋ āύāĻŋāϰā§āĻŦāĻžāĻāύ āĻāϰāĻžāϰ āĻ
āύā§āĻŽāϤāĻŋ āĻĻā§āϝāĻŧ, exit(), āϝāĻž āĻ
ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻĨā§āĻā§ āĻĒā§āϰāϏā§āĻĨāĻžāύ āĻāϰā§āĨ¤ āĻāĻ āĻĒāĻĻā§āϧāϤāĻŋ āĻĨā§āĻā§ āĻŦāϞāĻž āĻšāϝāĻŧ ActionāĻāϰ āϏāĻāĻļā§āϞāĻŋāώā§āĻ āĻŽā§āύ⧠āĻāĻāĻā§āĻŽāĨ¤ āĻāĻ āĻļā§āϰā§āĻŖā§āĻāĻŋ āĻ
āϤāĻŋāϰāĻŋāĻā§āϤāĻāĻžāĻŦā§ āϏāĻšāĻžāϝāĻŧāĻ āĻĒāĻĻā§āϧāϤāĻŋ āĻĒā§āϰāϝāĻŧā§āĻ āĻāϰā§: createComponents() - āĻĢāϰā§āĻŽ āĻāĻĒāĻžāĻĻāĻžāύ āϤā§āϰāĻŋ, loadImageFile(File f) â āĻāĻāĻāĻŋ āĻĢāĻžāĻāϞ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āώ āĻāĻĒāĻžāĻĻāĻžāύ⧠āĻāĻāĻāĻŋ āĻāĻŦāĻŋ āϞā§āĻĄ āĻāϰāĻž āĻšāĻā§āĻā§āĨ¤ āĻā§āϞāĻžāϏā§āϰ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύ GIFEncryptorByPaletteExtensionMethod āĻā§āϞāĻžāϏ āĻŦāĻžāϏā§āϤāĻŦāĻžāϝāĻŧāύā§āϰ āĻ
āύā§āϰā§āĻĒ GIFEncryptorByLSBMethod, āĻĒā§āϰāϧāĻžāύ āĻĒāĻžāϰā§āĻĨāĻā§āϝ āĻšāϞ āĻĒā§āϝāĻžāϞā§āĻ āĻĨā§āĻā§ āĻŦāĻžāϰā§āϤāĻž āĻŦāĻžāĻāĻ āϞā§āĻāĻž āĻ āĻĒāĻĄāĻŧāĻž āĻĒāĻĻā§āϧāϤāĻŋāϤā§āĨ¤
āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻ āĻĒāĻžāϰā§āĻļāύ
āĻāϞāĻŦāĻŋāĻāϏ āĻĒāĻĻā§āϧāϤāĻŋ
āϧāϰāĻž āϝāĻžāĻ āĻāĻāϰāĻāĻŽ āĻāĻāĻāĻŋ āĻāĻŦāĻŋ āĻāĻā§:

āĻāĻ āĻāĻŋāϤā§āϰāĻāĻŋāϤā§, āĻĒā§āϝāĻžāϞā§āĻāĻāĻŋāϤ⧠256āĻāĻŋ āϰāĻ āϰāϝāĻŧā§āĻā§ (āϝā§āĻŽāύ āĻĒā§āĻāύā§āĻ āϏāĻāϰāĻā§āώāĻŖ āĻāϰā§)āĨ¤ āĻĒā§āϰāĻĨāĻŽ āĻāĻžāϰāĻāĻŋ āϰāĻ āĻšāϞ: āϏāĻžāĻĻāĻž, āĻāĻžāϞā§, āϞāĻžāϞ, āϏāĻŦā§āĻāĨ¤ āĻ
āύā§āϝāĻžāύā§āϝ āϰāĻ āĻāĻžāϞā§āĨ¤ āĻā§āϞā§āĻŦāĻžāϞ āĻĒā§āϝāĻžāϞā§āĻ āĻŦāĻŋāĻ āĻā§āϰāĻŽ āύāĻŋāĻŽā§āύāϰā§āĻĒ āĻšāĻŦā§:
11111111 11111111 11111111 00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111 00000000...

āĻŦāĻžāϰā§āϤāĻžāĻāĻŋ āĻāĻŽā§āĻŦā§āĻĄ āĻšāϝāĻŧā§ āĻā§āϞā§, āĻāύā§āĻĄāĻžāϰāϞāĻžāĻāύ āĻāϰāĻž āĻŦāĻŋāĻāĻā§āϞāĻŋ āĻŦāĻžāϰā§āϤāĻžāϰ āĻŦāĻŋāĻāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻĒā§āϰāϤāĻŋāϏā§āĻĨāĻžāĻĒāĻŋāϤ āĻšāĻŦā§āĨ¤ āĻĢāϞāϏā§āĻŦāϰā§āĻĒ āĻāĻŋāϤā§āϰāĻāĻŋ āĻŽā§āϞ āĻĨā§āĻā§ āĻĒā§āϰāĻžāϝāĻŧ āĻāϞāĻžāĻĻāĻž āύāϝāĻŧāĨ¤
āĻŽā§āϞ
āĻāĻŽāĻŦā§āĻĄā§āĻĄ āĻŦāĻžāϰā§āϤāĻž āϏāĻš āĻāĻŋāϤā§āϰ

![]()
āĻĒā§āϝāĻžāϞā§āĻ āϏāĻŽā§āĻĒā§āϰāϏāĻžāϰāĻŖ āĻĒāĻĻā§āϧāϤāĻŋ
āĻāĻĒāύāĻŋ āϝāĻāύ āĻāĻ āĻĒāĻĻā§āϧāϤāĻŋāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻāĻŋ āĻŦāĻžāϰā§āϤāĻž āϏāĻŽā§āĻŦāϞāĻŋāϤ āĻāĻāĻāĻŋ āĻāĻŋāϤā§āϰ āĻā§āϞāĻŦā§āύ, āϤāĻāύ āĻāĻĒāύāĻŋ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻāĻŦāĻŋāĻāĻŋ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āύ:

āĻāĻāĻž āϏā§āĻĒāώā§āĻ āϝ⧠āĻāĻ āĻĒāĻĻā§āϧāϤāĻŋāĻāĻŋ āĻĒā§āϰā§āĻŖāĻžāĻā§āĻ āĻā§āĻĒā§āϤāĻāϰāĻŦā§āϤā§āϤāĻŋāϰ āĻāĻžāϰā§āϝāĻāϞāĻžāĻĒā§āϰ āĻāύā§āϝ āĻāĻžāĻ āĻāϰāĻŦā§ āύāĻž āĻāĻŦāĻ āĻŦāĻžāϰā§āϤāĻžāϰ āĻ
āϤāĻŋāϰāĻŋāĻā§āϤ āĻāύāĻā§āϰāĻŋāĻĒāĻļāύā§āϰ āĻĒā§āϰāϝāĻŧā§āĻāύ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻ ā§āϝāĻžāύāĻŋāĻŽā§āĻā§āĻĄ āĻāĻŋāϤā§āϰāĻā§āϞāĻŋāϤ⧠āĻāύāĻā§āϰāĻŋāĻĒāĻļāύ/āĻĄāĻŋāĻā§āϰāĻŋāĻĒāĻļāύ āύāĻŋāϝāĻŧāĻŽāĻŋāϤ āϏā§āĻā§āϝāĻžāĻāĻŋāĻ āĻāĻŋāϤā§āϰāĻā§āϞāĻŋāϰ āĻŽāϤā§āĻ āĻāĻžāĻ āĻāϰā§, āϤāĻŦā§ āĻ ā§āϝāĻžāύāĻŋāĻŽā§āĻļāύāĻāĻŋ āĻā§āĻā§ āϝāĻžāϝāĻŧ āύāĻžāĨ¤
āĻāϤā§āϏ āĻŦā§āϝāĻŦāĻšā§āϤ:
āĻĄāĻžāĻāύāϞā§āĻĄ āĻāϰā§āύ:
āĻāϤā§āϏ: www.habr.com
