рдкрд░рд┐рдЪрдп
рдЕрднрд┐рд╡рд╛рджрди.
рдлрд╛рд░ рдкреВрд░реНрд╡реА рдирд╛рд╣реА, рдЬреЗрд╡реНрд╣рд╛ рдореА рд╡рд┐рджреНрдпрд╛рдкреАрдард╛рдд рд╢рд┐рдХрдд рд╣реЛрддреЛ, рддреЗрд╡реНрд╣рд╛ тАЬрдорд╛рд╣рд┐рддреА рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрдЪреНрдпрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдкрджреНрдзрддреАтАЭ рдпрд╛ рд╡рд┐рд╖рдпрд╛рдд рдПрдХ рдЕрднреНрдпрд╛рд╕рдХреНрд░рдо рд╣реЛрддрд╛. рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯрд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ 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 (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 рд╕реНрд╡рд░реВрдкрд╛рдЪреНрдпрд╛ рд╕рдВрд░рдЪрдиреЗрд╡рд░ рдЖрдзрд╛рд░рд┐рдд, рдЖрдкрдг рдкреНрд░рддрд┐рдорд╛ рдкреЕрд▓реЗрдЯрдордзреНрдпреЗ рд╕рдВрджреЗрд╢ рд╕рд╛рджрд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рддрдпрд╛рд░ рдХрд░реВ рд╢рдХрддрд╛:
рдкреНрд░рддрд┐рдореЗрддреАрд▓ рд╕рдВрджреЗрд╢рд╛рдЪреА рдЙрдкрд╕реНрдерд┐рддреА рдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рд╕рдВрджреЗрд╢рд╛рдЪреНрдпрд╛ рд╕реБрд░реВрд╡рд╛рддреАрд╕ рдмрд┐рдЯреНрд╕рдЪрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд░рдо рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдЬреЗ рдбреАрдХреЛрдбрд░ рдкреНрд░рдердо рд╡рд╛рдЪрддреЛ рдЖрдгрд┐ рдЕрдЪреВрдХрддрд╛ рддрдкрд╛рд╕рддреЛ. рдЬрд░ рддреЗ рдЬреБрд│рдд рдирд╕реЗрд▓, рддрд░ рдЕрд╕реЗ рдорд╛рдирд▓реЗ рдЬрд╛рддреЗ рдХреА рдкреНрд░рддрд┐рдореЗрдордзреНрдпреЗ рдХреЛрдгрддрд╛рд╣реА рд▓рдкрд▓реЗрд▓рд╛ рд╕рдВрджреЗрд╢ рдирд╛рд╣реА. рдкреБрдвреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рд╕рдВрджреЗрд╢рд╛рдЪреА рд▓рд╛рдВрдмреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ. рдордЧ рдореЗрд╕реЗрдЬрдЪрд╛рдЪ рдордЬрдХреВрд░.
рд╕рдВрдкреВрд░реНрдг рдЕрд░реНрдЬрд╛рдЪрд╛ рд╡рд░реНрдЧ рдЖрдХреГрддреА:
рдХрд╛рд░реНрдпрдХреНрд░рдорд╛рдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА
рд╕рдВрдкреВрд░реНрдг рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рджреЛрди рдШрдЯрдХрд╛рдВрдордзреНрдпреЗ рд╡рд┐рднрд╛рдЧрд▓реА рдЬрд╛рдК рд╢рдХрддреЗ: рдЗрдВрдЯрд░рдлреЗрд╕ рдПрдирдХреНрд░рд┐рдкреНрд╢рди рдЖрдгрд┐ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдкрджреНрдзрддреАрдВрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА 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