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 (рдиреНрдпреВрдирддрдо рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ) рд╡рд┐рдзрд┐
  • рдкреНрдпрд╛рд▓реЗрдЯ рдердкреНрдиреЗ рд╡рд┐рдзрд┐

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

рдХрд╛рд░реНрдпрдХреНрд░рдорд▓реЗ рдпрд╕ рд╡рд┐рдзрд┐рдХреЛ рдЕрдВрд╢рдХреЛ рд░реВрдкрдорд╛ рдЧреНрд▓реЛрдмрд▓ рдкреНрдпрд╛рд▓реЗрдЯ рдмрд╛рдЗрдЯрд╣рд░реВрдорд╛ рдЕрдиреНрддрд┐рдо рджреБрдИ рдмрд┐рдЯрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫред рдпрд╕рдХреЛ рдорддрд▓рдм 24-рдмрд┐рдЯ рдЫрд╡рд┐рдХреЛ рд▓рд╛рдЧрд┐, рдЬрд╣рд╛рдБ рдкреНрдпрд╛рд▓реЗрдЯ рд░рдЩ рд░рд╛рддреЛ, рдиреАрд▓реЛ рд░ рд╣рд░рд┐рдпреЛрдХреЛ рд▓рд╛рдЧрд┐ рддреАрди рдмрд╛рдЗрдЯ рд╣реБрдиреНрдЫ, рдпрд╕рдорд╛ рд╕рдиреНрджреЗрд╢ рдЗрдореНрдмреЗрдб рдЧрд░реЗрдкрдЫрд┐, рдкреНрд░рддреНрдпреЗрдХ рд░рдЩ рдШрдЯрдХ рдЕрдзрд┐рдХрддрдо 3/255 рдЧреНрд░реЗрдбреЗрд╢рдирд▓реЗ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдиреЗрдЫред рдпрд╕реНрддреЛ рдкрд░рд┐рд╡рд░реНрддрди, рдкрд╣рд┐рд▓реЛ, рдЕрджреГрд╢реНрдп рд╡рд╛ рдорд╛рдирд╡ рдЖрдБрдЦрд╛рд▓реЗ рджреЗрдЦреНрди рдЧрд╛рд╣реНрд░реЛ рд╣реБрдиреЗрдЫ, рд░ рджреЛрд╕реНрд░реЛ, рдпреЛ рдХрдо рдЧреБрдгрд╕реНрддрд░ рдЬрд╛рдирдХрд╛рд░реА рдЖрдЙрдЯрдкреБрдЯ рдЙрдкрдХрд░рдгрд╣рд░реВрдорд╛ рджреЗрдЦрд┐рдиреЗ рдЫреИрдиред

рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдорд╛рддреНрд░рд╛ рд╕реАрдзрд╛ рдЫрд╡рд┐ рдкреНрдпрд╛рд▓реЗрдЯ рдХреЛ рдЖрдХрд╛рд░ рдорд╛ рдирд┐рд░реНрднрд░ рд╣реБрдиреЗрдЫред рдкреНрдпрд╛рд▓реЗрдЯрдХреЛ рдЕрдзрд┐рдХрддрдо рд╕рд╛рдЗрдЬ реирелрем рд░рдЩ рднрдПрдХреЛ рд╣реБрдирд╛рд▓реЗ, рд░ рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рд░рдЩрдХреЛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрдорд╛ рджреБрдИрд╡рдЯрд╛ рд╕рдиреНрджреЗрд╢ рдмрд┐рдЯ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ рднрдиреЗ, рдЕрдзрд┐рдХрддрдо рд╕рдиреНрджреЗрд╢ рд▓рдореНрдмрд╛рдЗ (рдЫрд╡рд┐рдорд╛ рдЕрдзрд┐рдХрддрдо рдкреНрдпрд╛рд▓реЗрдЯрд╕рд╣рд┐рдд) резрепреи рдмрд╛рдЗрдЯ рд╣реБрдиреНрдЫред рд╕рдиреНрджреЗрд╢ рдЫрд╡рд┐рдорд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рднрдПрдкрдЫрд┐, рдлрд╛рдЗрд▓ рдЖрдХрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рд╣реБрдБрджреИрдиред

рдкреНрдпрд╛рд▓реЗрдЯ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐, рдЬрд╕рд▓реЗ GIF рд╕рдВрд░рдЪрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рдХрд╛рдо рдЧрд░реНрдЫред рдпреЛ рд╕рд╛рдиреЛ рдкреНрдпрд╛рд▓реЗрдЯрдХреЛ рд╕рд╛рде рдЫрд╡рд┐рд╣рд░реВрдорд╛ рд╕рдмреИрднрдиреНрджрд╛ рдкреНрд░рднрд╛рд╡рдХрд╛рд░реА рд╣реБрдиреЗрдЫред рдпрд╕рдХреЛ рд╕рд╛рд░ рдпреЛ рд╣реЛ рдХрд┐ рдпрд╕рд▓реЗ рдкреНрдпрд╛рд▓реЗрдЯрдХреЛ рд╕рд╛рдЗрдЬ рдмрдврд╛рдЙрдБрдЫ, рдЬрд╕рд▓реЗ рдЧрд░реНрджрд╛ рд░рдЩ рдмрд╛рдЗрдЯрдХреЛ рд╕реНрдерд╛рдирдорд╛ рдЖрд╡рд╢реНрдпрдХ рдмрд╛рдЗрдЯрд╣рд░реВ рд▓реЗрдЦреНрдирдХреЛ рд▓рд╛рдЧрд┐ рдердк рдард╛рдЙрдБ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫред рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдкреНрдпрд╛рд▓реЗрдЯрдХреЛ рдиреНрдпреВрдирддрдо рд╕рд╛рдЗрдЬ реи рд░рдЩ (рем рдмрд╛рдЗрдЯреНрд╕) рд╣реЛ рднрдиреЗрд░ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрдЫреМрдВ рднрдиреЗ рдЗрдореНрдмреЗрдбреЗрдб рд╕рдиреНрджреЗрд╢рдХреЛ рдЕрдзрд┐рдХрддрдо рд╕рд╛рдЗрдЬ реирелрем ├Ч рейтАУрем = ренремреи рдмрд╛рдЗрдЯ рд╣реБрди рд╕рдХреНрдЫред рдмреЗрдлрд╛рдЗрджрд╛ рдХрдо рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рд╕реБрд░рдХреНрд╖рд╛ рд╣реЛ; рдЗрдореНрдмреЗрдбреЗрдб рд╕рдиреНрджреЗрд╢ рдХреБрдиреИ рдкрдирд┐ рдкрд╛рда рд╕рдореНрдкрд╛рджрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкрдвреНрди рд╕рдХрд┐рдиреНрдЫ рдпрджрд┐ рд╕рдиреНрджреЗрд╢ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреБрдкреНрддрд┐рдХрд░рдгрдХреЛ рдЕрдзреАрдирдорд╛ рдЫреИрдиред

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рднрд╛рдЧ

рдХрд╛рд░реНрдпрдХреНрд░рдо рдбрд┐рдЬрд╛рдЗрди

рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд░ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдорд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдгрд╣рд░реВ рдкреНрдпрд╛рдХреЗрдЬрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░рд┐рдиреЗрдЫред 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, рдореБрдЦреНрдп рднрд┐рдиреНрдирддрд╛ рд╕рдиреНрджреЗрд╢ рдмрд╛рдЗрдЯрд╣рд░реВ рд▓реЗрдЦреНрдиреЗ рд░ рдкреНрдпрд╛рд▓реЗрдЯрдмрд╛рдЯ рдкрдвреНрдиреЗ рддрд░рд┐рдХрд╛рдорд╛ рдЫред

рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдЮреНрдЪрд╛рд▓рди

LBS рд╡рд┐рдзрд┐

рдорд╛рдиреМрдВ рддреНрдпрд╣рд╛рдБ рдпрд╕реНрддреЛ рдЫрд╡рд┐ рдЫ:

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

рдпрд╕ рдЫрд╡рд┐рдорд╛, рдкреНрдпрд╛рд▓реЗрдЯрдорд╛ 256 рд░рдЩрд╣рд░реВ рдЫрдиреН (рдЬрд╕реНрддреИ рд░рдВрдЧрд▓реЗ рдпрд╕рд▓рд╛рдИ рдмрдЪрдд рдЧрд░реНрдЫ)ред рдкрд╣рд┐рд▓реЛ рдЪрд╛рд░ рд░рдВрдЧрд╣рд░реВ: рд╕реЗрддреЛ, рдХрд╛рд▓реЛ, рд░рд╛рддреЛ, рд╣рд░рд┐рдпреЛред рдЕрдиреНрдп рд░рдВрдЧрд╣рд░реВ рдХрд╛рд▓реЛ рдЫрдиреНред рд╡рд┐рд╢реНрд╡рд╡реНрдпрд╛рдкреА рдкреНрдпрд╛рд▓реЗрдЯ рдмрд┐рдЯ рдЕрдиреБрдХреНрд░рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реБрдиреЗрдЫ:

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

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

рд╕рдиреНрджреЗрд╢ рд╕рдореНрдорд┐рд▓рд┐рдд рднрдПрдкрдЫрд┐, рдЕрдзреЛрд░реЗрдЦрд┐рдд рдмрд┐рдЯреНрд╕ рд╕рдиреНрджреЗрд╢рдмрд╛рдЯ рдмрд┐рдЯреНрд╕ рд╕рдВрдЧ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реБрдиреЗрдЫред рдирддрд┐рдЬрд╛ рдЫрд╡рд┐ рд▓рдЧрднрдЧ рдореВрд▓ рднрдиреНрджрд╛ рдлрд░рдХ рдЫреИрдиред

рдореВрд▓
рдЗрдореНрдмреЗрдбреЗрдб рд╕рдиреНрджреЗрд╢рдХреЛ рд╕рд╛рде рдЫрд╡рд┐

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

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

рдЬрдм рддрдкрд╛рдЗрдБ рдпреЛ рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рдиреНрджреЗрд╢ рд╕рд╣рд┐рддрдХреЛ рдЫрд╡рд┐ рдЦреЛрд▓реНрдиреБрд╣реБрдиреНрдЫ, рддрдкрд╛рдЗрдБ рдирд┐рдореНрди рдЪрд┐рддреНрд░ рджреЗрдЦреНрдиреБрд╣реБрдиреЗрдЫ:

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

рдпреЛ рд╕реНрдкрд╖реНрдЯ рдЫ рдХрд┐ рдпреЛ рд╡рд┐рдзрд┐ рдкреВрд░реНрдг рдЬрд╛рд╕реБрд╕реА рдЧрддрд┐рд╡рд┐рдзрд┐рд╣рд░реБ рдХреЛ рд▓рд╛рдЧреА рдХрд╛рдо рдЧрд░реНрджреИрди, рд░ рд╕рдиреНрджреЗрд╢ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдИрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдЖрд╡рд╢реНрдпрдХ рд╣реБрди рд╕рдХреНрдЫред

рдПрдирд┐рдореЗрдЯреЗрдб рдЫрд╡рд┐рд╣рд░реВрдорд╛ рдЗрдиреНрдХреНрд░рд┐рдкреНрд╢рди/рдбрд┐рдХреНрд░рд┐рдкреНрд╢рдирд▓реЗ рдирд┐рдпрдорд┐рдд рд╕реНрдерд┐рд░ рдЫрд╡рд┐рд╣рд░реВрдорд╛ рдЬрд╕реНрддреИ рдХрд╛рдо рдЧрд░реНрджрдЫ, рддрд░ рдПрдирд┐рдореЗрд╕рди рддреЛрдбрд┐рдПрдХреЛ рдЫреИрдиред

рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХрд╛ рд╕реНрд░реЛрддрд╣рд░реВ:

рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реН:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди