рдЬреАрдЖрдИрдПрдл рдореЗрдВ рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлрд╝реА

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

рдирдорд╕реНрддреЗред
рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдЬрдм рдореИрдВ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рдкрдврд╝ рд░рд╣рд╛ рдерд╛, рддреЛ "рд╕реВрдЪрдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рддрд░реАрдХреЗ" рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдХреЛрд░реНрд╕рд╡рд░реНрдХ рдерд╛ред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдирд╛ рдерд╛ рдЬреЛ 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

рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╡рд┐рдзрд┐рдпрд╛рдБ

рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

  • рдПрд▓рдПрд╕рдмреА (рдиреНрдпреВрдирддрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ) рд╡рд┐рдзрд┐
  • рдкреИрд▓реЗрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╡рд┐рдзрд┐

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

рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реИрд╢реНрд╡рд┐рдХ рдкреИрд▓реЗрдЯ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЕрдВрддрд┐рдо рджреЛ рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ 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.

рдЬреАрдЖрдИрдПрдл рдкреНрд░рд╛рд░реВрдк рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рдЫрд╡рд┐ рдкреИрд▓реЗрдЯ рдореЗрдВ рдПрдХ рд╕рдВрджреЗрд╢ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

рдЬреАрдЖрдИрдПрдл рдореЗрдВ рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлрд╝реА

рдХрд┐рд╕реА рдЫрд╡рд┐ рдореЗрдВ рд╕рдВрджреЗрд╢ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрджреЗрд╢ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдмрд┐рдЯреНрд╕ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрдХреНрд░рдо рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕реЗ рдбрд┐рдХреЛрдбрд░ рдкрд╣рд▓реЗ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рд╢реБрджреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЫрд╡рд┐ рдореЗрдВ рдХреЛрдИ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рд╕рдВрджреЗрд╢ рдХреА рд▓рдВрдмрд╛рдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреА рд╣реЛрдЧреАред рдлрд┐рд░ рд╕рдВрджреЗрд╢ рдХрд╛ рдкрд╛рда рд╣реАред

рд╕рдВрдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╡рд░реНрдЧ рдЖрд░реЗрдЦ:

рдЬреАрдЖрдИрдПрдл рдореЗрдВ рд╕реНрдЯреЗрдЧреНрдиреЛрдЧреНрд░рд╛рдлрд╝реА

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЛ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ