рдкрд░рд┐рдЪрдп
рдЕрднрд┐рд╡рд╛рджрдиред
рдзреЗрд░реИ рд╕рдордп рдЕрдШрд┐, рдЬрдм рдо рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдпрдорд╛ рдкрдвреНрджреИ рдерд┐рдПрдБ, рддреНрдпрд╣рд╛рдБ "рд╕реВрдЪрдирд╛ рд╕реБрд░рдХреНрд╖рд╛рдХреЛ рд╕рдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдзрд┐рд╣рд░реВ" рдЕрдиреБрд╢рд╛рд╕рдирдорд╛ рдкрд╛рдареНрдпрдХреНрд░рдо рдерд┐рдпреЛред рдЕрд╕рд╛рдЗрдирдореЗрдиреНрдЯрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ 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 (рдиреНрдпреВрдирддрдо рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ) рд╡рд┐рдзрд┐
- рдкреНрдпрд╛рд▓реЗрдЯ рдердкреНрдиреЗ рд╡рд┐рдзрд┐
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 рдврд╛рдБрдЪрд╛рдХреЛ рд╕рдВрд░рдЪрдирд╛рдорд╛ рдЖрдзрд╛рд░рд┐рдд, рддрдкрд╛рдЗрдБ рдЫрд╡рд┐ рдкреНрдпрд╛рд▓реЗрдЯрдорд╛ рд╕рдиреНрджреЗрд╢ рдкрд░рд┐рдЪрдп рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдорд╛рдиреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ:
рдЫрд╡рд┐рдорд╛ рд╕рдиреНрджреЗрд╢рдХреЛ рдЙрдкрд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрди, рд╕рдиреНрджреЗрд╢рдХреЛ рд╕реБрд░реБрдорд╛ рдмрд┐рдЯрд╣рд░реВрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрдХреНрд░рдо рдердкреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЬреБрди рдбрд┐рдХреЛрдбрд░рд▓реЗ рдкрд╣рд┐рд▓реЗ рдкрдвреНрдЫ рд░ рд╢реБрджреНрдзрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫред рдпрджрд┐ рдпреЛ рдореЗрд▓ рдЦрд╛рдБрджреИрди рднрдиреЗ, рдпреЛ рдЫрд╡рд┐рдорд╛ рдХреБрдиреИ рд▓реБрдХреЗрдХреЛ рд╕рдиреНрджреЗрд╢ рдЫреИрди рднрдиреЗрд░ рдорд╛рдирд┐рдиреНрдЫред рдЕрд░реНрдХреЛ рддрдкрд╛рдИрдВрд▓реЗ рд╕рдиреНрджреЗрд╢рдХреЛ рд▓рдореНрдмрд╛рдЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рддреНрдпрд╕рдкрдЫрд┐ рд╕рдиреНрджреЗрд╢рдХреЛ рдкрд╛рдаред
рд╕рдореНрдкреВрд░реНрдг рдЖрд╡реЗрджрдирдХреЛ рдХрдХреНрд╖рд╛ рд░реЗрдЦрд╛рдЪрд┐рддреНрд░:
рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕рдореНрдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд▓рд╛рдИ рджреБрдИ рднрд╛рдЧрдорд╛ рд╡рд┐рднрд╛рдЬрди рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ: рдЗрдиреНрдЯрд░рдлреЗрд╕ рдЗрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд░ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рд╡рд┐рдзрд┐рд╣рд░реВрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди 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
, рдореБрдЦреНрдп рднрд┐рдиреНрдирддрд╛ рд╕рдиреНрджреЗрд╢ рдмрд╛рдЗрдЯрд╣рд░реВ рд▓реЗрдЦреНрдиреЗ рд░ рдкреНрдпрд╛рд▓реЗрдЯрдмрд╛рдЯ рдкрдвреНрдиреЗ рддрд░рд┐рдХрд╛рдорд╛ рдЫред
рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдЮреНрдЪрд╛рд▓рди
LBS рд╡рд┐рдзрд┐
рдорд╛рдиреМрдВ рддреНрдпрд╣рд╛рдБ рдпрд╕реНрддреЛ рдЫрд╡рд┐ рдЫ:
рдпрд╕ рдЫрд╡рд┐рдорд╛, рдкреНрдпрд╛рд▓реЗрдЯрдорд╛ 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