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

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


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

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдХреБрдЫ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдпрд╣ рдЫреЛрдЯрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рднрд╛рдЧ


GIF рдкреНрд░рд╛рд░реВрдк

GIF (Engред рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЗрдВрдЯрд░рдЪреЗрдВрдЬ рдлреЙрд░реНрдореЗрдЯ - рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░реВрдк) - рдЧреНрд░рд╛рдлрд┐рдХ рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░реВрдк рдЬреЛ 256 рд░рдВрдЧреЛрдВ рддрдХ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рд╛рд░реВрдк рдХреЛ 1987 рдореЗрдВ (GIF87a) рдХрдореНрдкреБрд╡рд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд░реЗрдЦрд╛рдкреБрдВрдЬ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред 1989 рдореЗрдВ, рдкреНрд░рд╛рд░реВрдк рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ (GIF89a), рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред

рдЬреАрдЖрдИрдПрдл рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдПрдХ рдмреНрд▓реЙрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реЛрддреА рд╣реИред рдЗрди рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд▓рдВрдмрд╛рдИ рд╣реЛрддреА рд╣реИ (рдпрд╛ рдпрд╣ рдХреБрдЫ рдЭрдВрдбреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЧрд▓рддреА рдХрд░рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдмреНрд▓реЙрдХ рд╕реНрдерд┐рдд рд╣реИред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЧреИрд░-рдПрдирд┐рдореЗрдЯреЗрдб GIF- рдЫрд╡рд┐ рдкреНрд░рд╛рд░реВрдк GIF89a рдХреА рд╕рдВрд░рдЪрдирд╛:



рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рднреА рд╕рдВрд░рдЪрдирд╛ рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╕реЗ, рд╣рдо рд╡реИрд╢реНрд╡рд┐рдХ рдкреИрд▓реЗрдЯ рдмреНрд▓реЙрдХ рдФрд░ рдкреИрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реЗрдВрдЧреЗ:

рдЖрдХрд╛рд░рд░рдВрдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛рдкреИрд▓реЗрдЯ рдЖрдХрд╛рд░, рдмрд╛рдЗрдЯреНрд╕
7256768
6128384
564192
43296
31648
2824
1412
026


рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рддрд░реАрдХреЗ

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

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

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

рдЬрд╛рдирдХрд╛рд░реА рдХреА рдорд╛рддреНрд░рд╛ рд╕реАрдзреЗ рдЫрд╡рд┐ рдкреИрд▓реЗрдЯ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧреАред рдЪреВрдВрдХрд┐ рдкреИрд▓реЗрдЯ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ 256 рд░рдВрдЧ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рд░рдВрдЧ рдХреЗ рдШрдЯрдХ рдореЗрдВ рд╕рдВрджреЗрд╢ рдХреЗ рджреЛ рдмрд┐рдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрджреЗрд╢ рдХреА рдЕрдзрд┐рдХрддрдо рд▓рдВрдмрд╛рдИ (рдЫрд╡рд┐ рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдкреИрд▓реЗрдЯ рдХреЗ рд╕рд╛рде) 192 рдмрд╛рдЗрдЯреНрд╕ рд╣реИред рдЫрд╡рд┐ рдореЗрдВ рд╕рдВрджреЗрд╢ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдПрдХ рдкреИрд▓реЗрдЯ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рдЬреЛ рдХреЗрд╡рд▓ GIF рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддреА рд╣реИред рдпрд╣ рдПрдХ рдЫреЛрдЯреЗ рдкреИрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкреИрд▓реЗрдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд░рдВрдЧреЛрдВ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕реНрдерд╛рди рдкрд░ рдЖрд╡рд╢реНрдпрдХ рдмрд╛рдЗрдЯреНрд╕ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдорд┐рд▓рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреИрд▓реЗрдЯ рдХрд╛ рдиреНрдпреВрдирддрдо рдЖрдХрд╛рд░ 2 рд░рдВрдЧ (6 рдмрд╛рдЗрдЯреНрд╕) рд╣реИ, рддреЛ рдПрдореНрдмреЗрдбреЗрдб рд╕рдВрджреЗрд╢ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ 256 ├Ч 3тАУ6 = 762 рдмрд╛рдЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдиреБрдХрд╕рд╛рди рдХрдо рд╕реБрд░рдХреНрд╖рд╛ рд╣реИ, рдЖрдк рдХрд┐рд╕реА рднреА рдкрд╛рда рд╕рдВрдкрд╛рджрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдореНрдмреЗрдбреЗрдб рд╕рдВрджреЗрд╢ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╕рдВрджреЗрд╢ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдЕрдзреАрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣рд┐рд╕реНрд╕рд╛


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

рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЙрдкрдХрд░рдг com.tsarik.steganography рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реЛрдВрдЧреЗред рдЗрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ encrypt рдФрд░ decrypt рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде encrypt рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИ, Binary рдХреНрд▓рд╛рд╕ рдЬреЛ рдмрд┐рдЯ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде UnableToEncryptException рдФрд░ UnableToDecryptException рдЕрдкрд╡рд╛рдж рдХрдХреНрд╖рд╛рдПрдВ рдЬреЛ UnableToDecryptException рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреНрд░рдорд╢рдГ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреИрдХреЗрдЬ com.tsarik.programs.gifed рдореЗрдВ рд╕реНрдерд┐рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд▓рд╛рд╕ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ; рдПрдХ рд╡рд░реНрдЧ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ; рдФрд░ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЬред

рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реНрд╡рдпрдВ com.tsarik.programs.gifed.gif GIFEncryptorByLSBMethod рдФрд░ GIFEncryptorByPaletteExtensionMethod com.tsarik.programs.gifed.gif рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпреЗ рджреЛрдиреЛрдВ рдХрдХреНрд╖рд╛рдПрдВ Encryptor рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреАред

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



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

рдкреВрд░реЗ рдЖрд╡реЗрджрди рдХрд╛ рд╡рд░реНрдЧ рдЖрд░реЗрдЦ:



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

рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЛ рдШрдЯрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: GIFEncryptorByLSBMethod рдФрд░ GIFEncryptorByPaletteExtensionMethod рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдФрд░ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

GIFEncryptorByLSBMethod рд╡рд░реНрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред



firstLSBit рдФрд░ secondLSBit рдореЗрдВ рдЫрд╡рд┐ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯ рдХреА рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрджреЗрд╢ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХрд╣рд╛рдБ рд╕реЗред checkSequence рдлрд╝реАрд▓реНрдб рдмрд┐рдЯреНрд╕ рдХреЗ рдЪреЗрдХ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдПрдореНрдмреЗрдбреЗрдб рд╕рдВрджреЗрд╢ рдХреА рдкрд╣рдЪрд╛рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдЦрддреА рд╣реИред рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ getEncryptingFileParameters рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрджреЗрд╢ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

encrypt рд╡рд░реНрдЧ рдХреЗ encrypt рд╡рд┐рдзрд┐ рдХреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо:



рдФрд░ рдЗрд╕рдХрд╛ рдХреЛрдб:
 @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(); } 


GIFEncryptorByLSBMethod рд╡рд░реНрдЧ рдХреА decrypt рд╡рд┐рдзрд┐ рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб:



 @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) рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ: encryptImage(Encryptor encryptor) рдФрд░ decryptImage(Encryptor encryptor) , рдЬреЛ Encryptor рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдлрд╝рд╛рдЗрд▓ рдЪрдпрди рд╕рдВрд╡рд╛рдж рдЦреЛрд▓реЗрдВ, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдПрдВ, рдЖрджрд┐ред ; рд╕рд╛рде рд╣реА рдЕрдиреНрдп рддрд░реАрдХреЗ: openImage() , рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдЫрд╡рд┐, exit() рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рдореЗрдиреВ рдЖрдЗрдЯрдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ, рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: createComponents() - рдлрд╝реЙрд░реНрдо рдШрдЯрдХ рдмрдирд╛рдирд╛, loadImageFile(File f) - рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдШрдЯрдХ рдореЗрдВ рдПрдХ рдЫрд╡рд┐ рд▓реЛрдб рдХрд░рдирд╛ред GIFEncryptorByPaletteExtensionMethod рд╡рд░реНрдЧ GIFEncryptorByPaletteExtensionMethod рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди GIFEncryptorByPaletteExtensionMethod рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рдорд╛рди рд╣реИ, рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдмрд╛рдЗрдЯреНрд╕ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреИрд▓реЗрдЯ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

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


рдПрд▓рдмреАрдПрд╕ рд╡рд┐рдзрд┐

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдРрд╕реА рдХреЛрдИ рдЫрд╡рд┐ рд╣реИ:



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

111111 11 111111 11 111111 11 000 000 00 00 000 000 000 00 001111 11 000 000 00 000 000 000 00 00 001111 11 000 000 00 ...



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

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


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

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



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

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

рдкреНрд░рдпреБрдХреНрдд рд╕реНрд░реЛрдд:


рдбрд╛рдЙрдирд▓реЛрдб:

Source: https://habr.com/ru/post/In128327/


All Articles