GIF рдордзреНрдпреЗ рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлреА

рдкрд░рд┐рдЪрдп

рдЕрднрд┐рд╡рд╛рджрди.
рдлрд╛рд░ рдкреВрд░реНрд╡реА рдирд╛рд╣реА, рдЬреЗрд╡реНрд╣рд╛ рдореА рд╡рд┐рджреНрдпрд╛рдкреАрдард╛рдд рд╢рд┐рдХрдд рд╣реЛрддреЛ, рддреЗрд╡реНрд╣рд╛ тАЬрдорд╛рд╣рд┐рддреА рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрдЪреНрдпрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдкрджреНрдзрддреАтАЭ рдпрд╛ рд╡рд┐рд╖рдпрд╛рдд рдПрдХ рдЕрднреНрдпрд╛рд╕рдХреНрд░рдо рд╣реЛрддрд╛. рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯрд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ GIF рдлрд╛рдпрд▓реАрдВрдордзреНрдпреЗ рд╕рдВрджреЗрд╢ рдПрдореНрдмреЗрдб рдХрд░рдгрд╛рд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдпрд╛рд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддреЗ. рдореА рдЬрд╛рд╡рд╛ рдордзреНрдпреЗ рдХрд░рд╛рдпрдЪреЗ рдард░рд╡рд▓реЗ.

рдпрд╛ рд▓реЗрдЦрд╛рдд рдореА рдХрд╛рд╣реА рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдореБрджреНрджреНрдпрд╛рдВрдЪреЗ рд╡рд░реНрдгрди рдХрд░реЗрди, рддрд╕реЗрдЪ рд╣рд╛ рдЫреЛрдЯрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╕рд╛ рддрдпрд╛рд░ рдХреЗрд▓рд╛ рдЧреЗрд▓рд╛.

рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рднрд╛рдЧ

GIF рд╕реНрд╡рд░реВрдк

GIF (рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЗрдВрдЯрд░рдЪреЗрдВрдЬ рдлреЙрд░рдореЕрдЯ - рдкреНрд░рддрд┐рдорд╛рдВрдЪреА рджреЗрд╡рд╛рдгрдШреЗрд╡рд╛рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареАрдЪреЗ рд╕реНрд╡рд░реВрдк) рд╣реЗ рдЧреНрд░рд╛рдлрд┐рдХ рдкреНрд░рддрд┐рдорд╛ рд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареАрдЪреЗ рд╕реНрд╡рд░реВрдк рдЖрд╣реЗ, рдЬреЗ 256 рд░рдВрдЧрд╛рдВрдкрд░реНрдпрдВрддрдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдЧреБрдгрд╡рддреНрддрд╛ рди рдЧрдорд╛рд╡рддрд╛ рд╕рдВрдХреБрдЪрд┐рдд рдбреЗрдЯрд╛ рд╕рдВрдЪрдпрд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдЖрд╣реЗ. рд╣реЗ рд╕реНрд╡рд░реВрдк 1987 рдордзреНрдпреЗ (GIF87a) CompuServe рдиреЗ рдиреЗрдЯрд╡рд░реНрдХрд╡рд░ рд░рд╛рд╕реНрдЯрд░ рдкреНрд░рддрд┐рдорд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реЗ рд╣реЛрддреЗ. 1989 рдордзреНрдпреЗ, рд╕реНрд╡рд░реВрдк рд╕реБрдзрд╛рд░рд┐рдд рдХрд░рдгреНрдпрд╛рдд рдЖрд▓реЗ (GIF89a), рдкрд╛рд░рджрд░реНрд╢рдХрддреЗрд╕рд╛рдареА рд╕рдорд░реНрдерди рдЖрдгрд┐ ре▓рдирд┐рдореЗрд╢рди рдЬреЛрдбрд▓реЗ рдЧреЗрд▓реЗ.

GIF рдлрд╛рдЗрд▓реНрд╕рдордзреНрдпреЗ рдмреНрд▓реЙрдХ рд░рдЪрдирд╛ рдЕрд╕рддреЗ. рдпрд╛ рдмреНрд▓реЙрдХреНрд╕рдЪреА рдиреЗрд╣рдореАрдЪ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓рд╛рдВрдмреА рдЕрд╕рддреЗ (рдХрд┐рдВрд╡рд╛ рддреЗ рдХрд╛рд╣реА рдзреНрд╡рдЬрд╛рдВрд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЗ), рддреНрдпрд╛рдореБрд│реЗ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреБрдареЗ рдЖрд╣реЗ рдпрд╛рдмрджреНрджрд▓ рдЪреВрдХ рдХрд░рдгреЗ рдЬрд╡рд│рдЬрд╡рд│ рдЕрд╢рдХреНрдп рдЖрд╣реЗ. GIF89a рдлреЙрд░рдореЕрдЯрдордзреАрд▓ рд╕рд░реНрд╡рд╛рдд рд╕реЛрдкреНрдпрд╛ рдиреЙрди-ре▓рдирд┐рдореЗрдЯреЗрдб GIF рдЗрдореЗрдЬрдЪреА рд░рдЪрдирд╛:

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) рдкрджреНрдзрдд
  • рдкреЕрд▓реЗрдЯ рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдкрджреНрдзрдд

рдПрд▓рдПрд╕рдмреА рдкрджреНрдзрдд - рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлреАрдЪреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрджреНрдзрдд. рдпрд╛рдд рдХрдВрдЯреЗрдирд░рдордзреАрд▓ рд╢реЗрд╡рдЯрдЪреЗ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ (рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдЬрд╛рдЧрддрд┐рдХ рдкреЕрд▓реЗрдЯ рдмрд╛рдЗрдЯреНрд╕) рд▓рдкрд╡рд┐рд▓реЗрд▓реНрдпрд╛ рд╕рдВрджреЗрд╢рд╛рдЪреНрдпрд╛ рдмрд┐рдЯреНрд╕рд╕рд╣ рдмрджрд▓рдгреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ.

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпрд╛ рдкрджреНрдзрддреАрдЪрд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди рдЧреНрд▓реЛрдмрд▓ рдкреЕрд▓реЗрдЯ рдмрд╛рдЗрдЯреНрд╕рдордзреАрд▓ рд╢реЗрд╡рдЯрдЪреЗ рджреЛрди рдмрд┐рдЯ рд╡рд╛рдкрд░реЗрд▓. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА 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, рдореБрдЦреНрдп рдлрд░рдХ рдкреЕрд▓реЗрдЯрдордзреВрди рд╕рдВрджреЗрд╢ рдмрд╛рдЗрдЯреНрд╕ рд▓рд┐рд╣рд┐рд▓реНрдпрд╛ рдЖрдгрд┐ рд╡рд╛рдЪрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд.

рдХрд╛рд░реНрдпрдХреНрд░рдо рдСрдкрд░реЗрд╢рди

рдПрд▓рдмреАрдПрд╕ рдкрджреНрдзрдд

рдЕрд╕реЗ рдореНрд╣рдгреВрдпрд╛ рдХреА рдЕрд╢реА рдкреНрд░рддрд┐рдорд╛ рдЖрд╣реЗ:

GIF рдордзреНрдпреЗ рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлреА

рдпрд╛ рдкреНрд░рддрд┐рдореЗрдордзреНрдпреЗ, рдкреЕрд▓реЗрдЯрдордзреНрдпреЗ 256 рд░рдВрдЧ рдЕрд╕рддрд╛рдд (рдЬрд╕реЗ рдкреЗрдВрдЯ рд╕реЗрд╡реНрд╣ рдХрд░рддреЗ). рдкрд╣рд┐рд▓реЗ рдЪрд╛рд░ рд░рдВрдЧ рдЖрд╣реЗрдд: рдкрд╛рдВрдврд░рд╛, рдХрд╛рд│рд╛, рд▓рд╛рд▓, рд╣рд┐рд░рд╡рд╛. рдЗрддрд░ рд░рдВрдЧ рдХрд╛рд│рд╛ рдЖрд╣реЗрдд. рдЬрд╛рдЧрддрд┐рдХ рдкреЕрд▓реЗрдЯ рдмрд┐рдЯ рдХреНрд░рдо рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдЕрд╕реЗрд▓:

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

GIF рдордзреНрдпреЗ рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлреА

рд╕рдВрджреЗрд╢ рдПрдореНрдмреЗрдб рдХреЗрд▓реНрдпрд╛рд╡рд░, рдЕрдзреЛрд░реЗрдЦрд┐рдд рдмрд┐рдЯреНрд╕ рд╕рдВрджреЗрд╢рд╛рддреАрд▓ рдмрд┐рдЯреНрд╕рд╕рд╣ рдмрджрд▓рд▓реЗ рдЬрд╛рддреАрд▓. рдкрд░рд┐рдгрд╛рдореА рдкреНрд░рддрд┐рдорд╛ рдореВрд│рдкреЗрдХреНрд╖рд╛ рдЬрд╡рд│рдЬрд╡рд│ рд╡реЗрдЧрд│реА рдирд╛рд╣реА.

рдореВрд│
рдПрдореНрдмреЗрдбреЗрдб рд╕рдВрджреЗрд╢рд╛рд╕рд╣ рдкреНрд░рддрд┐рдорд╛

GIF рдордзреНрдпреЗ рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлреА
GIF рдордзреНрдпреЗ рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлреА

рдкреЕрд▓реЗрдЯ рд╡рд┐рд╕реНрддрд╛рд░ рдкрджреНрдзрдд

рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рд╣реА рдкрджреНрдзрдд рд╡рд╛рдкрд░реВрди рд╕рдВрджреЗрд╢ рдЕрд╕рд▓реЗрд▓реА рдкреНрд░рддрд┐рдорд╛ рдЙрдШрдбрддрд╛ рддреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдЦрд╛рд▓реАрд▓ рдЪрд┐рддреНрд░ рджрд┐рд╕реЗрд▓:

GIF рдордзреНрдпреЗ рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлреА

рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЖрд╣реЗ рдХреА рд╣реА рдкрджреНрдзрдд рд╕рдВрдкреВрд░реНрдг рд╣реЗрд░рдЧрд┐рд░реА рдХреНрд░рд┐рдпрд╛рдХрд▓рд╛рдкрд╛рдВрд╕рд╛рдареА рдХрд╛рд░реНрдп рдХрд░рдгрд╛рд░ рдирд╛рд╣реА рдЖрдгрд┐ рд╕рдВрджреЗрд╢рд╛рдЪреНрдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рдирдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЕрд╕реВ рд╢рдХрддреЗ.

ре▓рдирд┐рдореЗрдЯреЗрдб рдкреНрд░рддрд┐рдорд╛рдВрдордзреНрдпреЗ рдХреВрдЯрдмрджреНрдзреАрдХрд░рдг/рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдирд┐рдпрдорд┐рдд рд╕реНрдерд┐рд░ рдкреНрд░рддрд┐рдорд╛рдВрдкреНрд░рдорд╛рдгреЗрдЪ рдХрд╛рд░реНрдп рдХрд░рддреЗ, рдкрд░рдВрддреБ ре▓рдирд┐рдореЗрд╢рди рдЦрдВрдбрд┐рдд рд╣реЛрдд рдирд╛рд╣реА.

рд╡рд╛рдкрд░рд▓реЗрд▓реЗ рд╕реНрддреНрд░реЛрдд:

рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рд╛:

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛