рдкрд░рд┐рдЪрдп
рдирдорд╕реНрддреЗред
рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдЬрдм рдореИрдВ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдореЗрдВ рдкрдврд╝ рд░рд╣рд╛ рдерд╛, рддреЛ "рд╕реВрдЪрдирд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рддрд░реАрдХреЗ" рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдХреЛрд░реНрд╕рд╡рд░реНрдХ рдерд╛ред рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдирд╛ рдерд╛ рдЬреЛ 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...
рдПрдХ рдмрд╛рд░ рд╕рдВрджреЗрд╢ рдПрдореНрдмреЗрдб рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, рд░реЗрдЦрд╛рдВрдХрд┐рдд рдмрд┐рдЯреНрд╕ рдХреЛ рд╕рдВрджреЗрд╢ рдХреЗ рдмрд┐рдЯреНрд╕ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдореВрд▓ рд╕реЗ рд▓рдЧрднрдЧ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред
рдореВрд▓
рдПрдореНрдмреЗрдбреЗрдб рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐
рдкреИрд▓реЗрдЯ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐
рдЬрдм рдЖрдк рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рд╕рдВрджреЗрд╢ рд╡рд╛рд▓реА рдЫрд╡рд┐ рдХреЛ рдЦреЛрд▓реЗрдВрдЧреЗ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрди рдЪрд┐рддреНрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдкреВрд░реНрдг рдЬрд╛рд╕реВрд╕реА рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА, рдФрд░ рд╕рдВрджреЗрд╢ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдПрдирд┐рдореЗрдЯреЗрдб рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди/рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдирд┐рдпрдорд┐рдд рд╕реНрдерд┐рд░ рдЫрд╡рд┐рдпреЛрдВ рдХреА рддрд░рд╣ рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдиреАрдореЗрд╢рди рдЯреВрдЯрд╛ рдирд╣реАрдВ рд╣реИред
рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рд╕реНрд░реЛрдд:
http://ru.wikipedia.org/wiki/Gif http://ru.wikipedia.org/wiki/╨б╤В╨╡╨│╨░╨╜╨╛╨│╤А╨░╤Д╨╕╤П http://home.onego.ru/~chiezo/gif.htm
рдбрд╛рдЙрдирд▓реЛрдб:
рд╕реНрд░реЛрдд: www.habr.com