рдПрдИрдПрд╕ 128ред рдЕрдЬрдЧрд░ рдореЗрдВ рд╡рд┐рд╡рд░рдг рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЕрдкрдиреЗ рд▓рд┐рдП рдХреБрдЫ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдкреИрджрд╛ рд╣реБрдЖ рдерд╛ - рдореБрдЭреЗ рдПрдХ рдФрд░ рдбреЗрдмрд┐рдЯ рдХрд╛рд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдерд╛ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдПрдХ рдФрд░ рдкрд┐рди рдХреЛрдб рд░рдЦреЗрдВред рд╡реНрдпрд╛рдореЛрд╣ рдЗрд╕ рддрд░рд╣ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЦреБрд▓реЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреА рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдЦреЛрдЬреЛрдВ рдХреЗ рдмрд╛рдж рдореИрдВ рдПрдИрдПрд╕ рдорд╛рдирдХ рдкрд░ рдмрд╕ рдЧрдпрд╛ред рдореИрдВ рддреБрд░рдВрдд рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЛ рд╕рдордЭрдирд╛ рдФрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдШрдЯрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдКрдВрдЧрд╛, рдЪрдЯрд╛рдИ рд╡рд╛рд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдЕрдЬрдЧрд░ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рд╡рд┐рдХрд╛рд╕ рдореЗрдВ, рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдХреЗрд╡рд▓ рд╡рд╣реА рддрдХ рд╕реАрдорд┐рдд рдХрд┐рдпрд╛ рдЬреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдереЛрдбрд╝рд╛ рд╕рд╛ рдкрд░рд┐рдЪрдп


рдПрдбрд╡рд╛рдВрд╕реНрдб рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд╕реНрдЯреИрдВрдбрд░реНрдб рд░рд┐рдЬреЗрдВрдбреЗрд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо ([r Standardinda╦Рl]) рдХрд╛ рдЬрд╛рдирд╛-рдорд╛рдирд╛ рдирд╛рдо рд╣реИ, рдЬрд┐рд╕реЗ рдмреЗрд▓реНрдЬрд┐рдпрдо рдХреЗ рджреЛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд░ рдЬреЛрди рдбрд┐рдорди рдФрд░ рд╡рд┐рдВрд╕реЗрдВрдЯ рд░реЗрдореИрди рдиреЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЕрд╡рд░реБрджреНрдз рдФрд░ рд╕рдордорд┐рдд рд╣реИред рдЕрдореЗрд░рд┐рдХреА рд╕рд░рдХрд╛рд░реА рдПрдЬреЗрдВрд╕рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдорд╛рдирдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ред рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдкреНрд░рд╢рдВрд╕рд┐рдд рд░рд╛рд╖реНрдЯреНрд░реАрдп рд╕реБрд░рдХреНрд╖рд╛ рдПрдЬреЗрдВрд╕реА рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ: SECRET рд╕реНрддрд░ рддрдХ, 128 рдмрд┐рдЯреНрд╕ рдХреА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, TOP SECRET рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП 192 рдпрд╛ 256 рдмрд┐рдЯреНрд╕ рдХреА рдХреБрдВрдЬреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрдЪреНрдЪ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рддрд╛рдХрдд рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рдЧрдгрд┐рдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реИред

рдвреЗрд░ рд╕рд╛рд░рд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди


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

рд╣рдо рдХреБрдЫ рд╕рдВрдХреЗрддрди рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ:

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдЪрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд░рд╛рдЬреНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрддрдГ рдкрд░рд┐рдгрд╛рдо рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ: рд╕рдмрдмрд╛рдЗрдЯреНрд╕ (), ShiftRows (), рдорд┐рдХреНрд╕рдХреЙрд▓реАрдореЗрдВрдЯреНрд╕ () рдФрд░ AddRoundKey () ред рд╕рд╛рдорд╛рдиреНрдп рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдпреЛрдЬрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдЫрд╡рд┐
рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд░рд╛рдЬреНрдп рд╕рд░рдгреА рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЗрдирдкреБрдЯ рдорд╛рди рд╕реЗ рднрд░ рдЬрд╛рддреА рд╣реИ рд░рд╛рдЬреНрдп [r] [c] = рдЗрдирдкреБрдЯ [r + 4c], r = 0.1 ... 4; c = 0.1..Nb ред рд╡рд╣ рд╣реИ, рдХреЙрд▓рдо рдореЗрдВред рдПрдХ рдмрд╛рд░ рдореЗрдВ 16-рдмрд╛рдЗрдЯ рдмреНрд▓реЙрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЫрд╡рд┐

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкрд░рд┐рдорд┐рдд рдХреНрд╖реЗрддреНрд░ рдпрд╛ рдЧреИрд▓реЛрдЬрд╝ рдлреАрд▓реНрдб рдЬреАрдПрдл (2 8 ) рдХреЗ рддрддреНрд╡ рдорд╛рдирддреЗ рд╣реИрдВред рдХреЛрд╖реНрдардХ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдХреНрд╖реЗрддреНрд░ рддрддреНрд╡реЛрдВ рдпрд╛ рдЙрд╕рдХреА рд╢рдХреНрддрд┐ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдлрд╝реАрд▓реНрдб GF (2 8 ) рдХреЗ рддрддреНрд╡ рдЕрдзрд┐рдХрд╛рдВрд╢ 7 рдкрд░ рдбрд┐рдЧреНрд░реА рдХреЗ рдмрд╣реБрдкрдж рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЙрдирдХреЗ рдЧреБрдгрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмрд╣реБрдкрдж рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд╛рдЗрдЯ {1,1,1,0,0,1,1,1} рдПрдХ рдлрд╝реАрд▓реНрдб рддрддреНрд╡ 1x 7 + 1x 6 + 1x 5 + 0x 4 + 0x 3 + 0x 2 + 1x 1 + 1x 0 + 1x 7 + рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ 1x 6 + 1x 5 + x +1ред рдпрд╣ рддрдереНрдп рдХрд┐ рд╣рдо рдлреАрд▓реНрдб рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЬреЛрдбрд╝ рдФрд░ рдЧреБрдгрд╛ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рдЕрдЧрд▓рд╛, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

SybButes ()

рдПрдХ рд░реВрдкрд╛рдВрддрд░рдг Sbox рд╕реНрдерд┐рд░ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдХ рдХреЗ рд╕рд╛рде рд░рд╛рдЬреНрдп рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИред рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдиреЛрдЯреЗрд╢рди рдореЗрдВ Sbox рддрддреНрд╡ рдорд╛рдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЬреНрдЮрд╛рдд рдлрд╝реАрд▓реНрдб GF (2 8 ) рдХреЛ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ рддрд╛рд▓рд┐рдХрд╛ рд╕реНрд╡рдпрдВ рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ рдереА
рдЫрд╡рд┐
рд░рд╛рдЬреНрдп рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯ рдХреЛ рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рдиреЛрдЯреЗрд╢рди рдореЗрдВ {xy} рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрдВрдХреНрддрд┐ x рдФрд░ рдХреЙрд▓рдо y рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдкрд░ рдПрдХ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, {6e} рдХреЛ {9f}, рдФрд░ {15} рдХреЛ {59} рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

ShiftRows ()

рд╕рд░рд▓ рдкрд░рд┐рд╡рд░реНрддрдиред рдпрд╣ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП 1 рддрддреНрд╡, рджреВрд╕рд░реА рдХреЗ рд▓рд┐рдП 2 рдФрд░ рддреАрд╕рд░реЗ рдХреЗ рд▓рд┐рдП 3 рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЪрдХреНрд░реАрдп рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдкрд╛рд░реА рдХрд░рддрд╛ рд╣реИред рд╢реВрдиреНрдп рд░реЗрдЦрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдорд┐рдХреНрд╕рдХреЙрд▓реНрдпреВрдордиреНрд╕ ()

рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕реНрдЯреЗрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдХреЛ рдПрдХ рдмрд╣реБрдкрдж рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ GF (2 8 ) рдлрд╝реАрд▓реНрдб modulo x 4 + 1 рдореЗрдВ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд╣реБрдкрдж 3x 3 + x 2 + x + 2. рдХреЗ рд╕рд╛рде рдпрд╣ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИред ред рдпрджрд┐ рдЖрдк рдорд╛рдирдХ рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рджреА рдЧрдИ рд╕рдордХрдХреНрд╖ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рддреЛ рдЪрд┐рддреНрд░ рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

рдореИрдЯреНрд░рд┐рд╕реЗрд╕ рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╕рдордп, Ij рдХрд╛ рдорд╛рди рдкрд╣рд▓реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ i-th рд░реЛ рдХреЗ рд╕рдВрдЧрдд рддрддреНрд╡реЛрдВ рдФрд░ рджреВрд╕рд░реЗ рдХреЗ j-th рдХреЙрд▓рдо рдХреЗ рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред

рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдЬреЛрдбрд╝ рдФрд░ рдЧреБрдгрд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдореЛрдВ рдХреА рдЕрдХреНрд╖рдорддрд╛ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдирдП рдирд┐рдпрдо:

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдпреЗ рдЕрдВрддрд┐рдо рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП рддреАрди рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП рдЪрд╛рд░ рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдРрд╕реЗ рд╕реНрдерд╛рдиреАрдп рдЬреАрд╡рди рд╣реИрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдВрдЧреЗред
MixRolumns () ShiftRows () рдХреЗ рд╕рд╛рде рд╕рд┐рдлрд░ рдореЗрдВ рдкреНрд░рд╕рд╛рд░ рдЬреЛрдбрд╝реЗрдВред

AddRoundKey ()

рдкрд░рд┐рд╡рд░реНрддрди RoundKey рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рддрддреНрд╡ рдХреЗ рд╕рд╛рде рд░рд╛рдЬреНрдп рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХрд╛ рдПрдХ рдмрд┐рдЯрд╡реЗрдЕрд░ XOR рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред RoundKey рд╕реНрдЯреЗрдЯ рдХреЗ рд╕рдорд╛рди рдЖрдХрд╛рд░ рдХрд╛ рдПрдХ рд╕рд░рдгреА рд╣реИ, рдЬрд┐рд╕реЗ KeyExpansion () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЧреБрдкреНрдд рдХреБрдВрдЬреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рджреМрд░ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рдж рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред

KeyExpansion ()

рдпрд╣ рд╕рд╣рд╛рдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдЧреЛрд▓ рдХреБрдВрдЬреА рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдмрдирд╛рддрд╛ рд╣реИ - KeyScheduleред KeySchedule Nb * (Nr + 1) рдХреЙрд▓рдо рдпрд╛ (Nr + 1) рдмреНрд▓реЙрдХ рд╕реЗ рдорд┐рд▓рдХрд░ рдПрдХ рд▓рдВрдмреА рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЖрдк рдЬрд┐рд╕ рдЧреБрдкреНрдд рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд╣рд▓реЗ рд░рд╛рдЙрдВрдб рдХреА рдХреЛ рднрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ
KeySchedule [r] [c] = SecretKey [r + 4c], r = 0.1 ... 4; c = 0,1..Nkред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ KeySchedule рдореЗрдВ рд╣рдореЗрдВ рдмрд╛рдЗрдЯ рджрд░реНрдЬ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЖрдЧреЗ рд╕рдВрдЪрд╛рд▓рди рд╕рдВрднрд╡ рд╣реЛред рдпрджрд┐ рдЖрдк рдЗрд╕ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрдо рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рд╕рд┐рд░ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ KeyExpansion () рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рджрд╛ рдЗрдирдкреБрдЯ рд▓реЗрдЧрд╛ рдФрд░ ord() рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдкрд░рд┐рдгрд╛рдо Key Keychedule рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕реАрдорд╛рдПрдБ: 16 рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрдгреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдФрд░, рдЬрдм рд╕реЗ рд╣рдо рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ ord() рд╡рд░реНрдг рдХреЗ ord() рдмрд╛рдЗрдирд░реА рдореЗрдВ 255 рдпрд╛ 11111111 рд╕реЗ рдЕрдзрд┐рдХ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╣рдо рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдЧрд▓рдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд░реВрд╕реА рдореЗрдВ рдПрдХ рдХреБрдВрдЬреА рдХреА рдорджрдж рд╕реЗ, рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред



рдпрд╣ рдЖрдВрдХрдбрд╝рд╛ рдПрдИрдПрд╕ -128: 4 рдХреЙрд▓рдо рдХреЗ 11 рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреАрд╕реНрдХреБрд▓реЗрдб рд▓реЗрдЖрдЙрдЯ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрдиреНрдп рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреНрд░рдорд╢рдГ Nb рдХреЙрд▓рдо рдХреЗ (Nr + 1) рдмреНрд▓реЙрдХ рд╣реЛрдВрдЧреЗред рдЕрдм рд╣рдореЗрдВ рдЦрд╛рд▓реА рдЬрдЧрд╣реЛрдВ рдХреЛ рднрд░рдирд╛ рд╣реЛрдЧрд╛ред рд░реВрдкрд╛рдВрддрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рд░рдВрддрд░ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - Rcon - рдЬрд┐рд╕рдХрд╛ рдорд╛рди рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╣реИред



KeySchedule рд░реАрдлрд┐рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо:

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдорд┐рдХреНрд╕рдХреЙрд▓реНрдпреВрдорд┐рдиреЗрд╢рди () рдореЗрдВ рдЧрдгрд┐рдд рдХреА рдорд╛рдиреНрдпрддрд╛ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕рд╣рд╛рдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рд▓реЗрдЦрди рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЪрдордХрджрд╛рд░ рд╣реИ рдФрд░, рд╢рд╛рдпрдж, рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИред рдПрдХ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдХреБрдВрдЬреА рдореЗрдВ 4 * рдПрдирдХреЗ рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ 16)ред рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рд╣рдо рдпрд╣ рд╕рдм рдШрд░реЗрд▓реВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ 16-рдЪрд░рд┐рддреНрд░ рдХреА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЖрдПрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдпрд╛рдж рд░рдЦреЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЗрдирдкреБрдЯ рдкрд░ 16 рд╕реЗ рдХрдо рдХреА рд▓рдВрдмрд╛рдИ рд╡рд╛рд▓реА рдПрдХ рдкрдВрдХреНрддрд┐, рдореИрдВ KeySchedule рдореЗрдВ рдорд╛рди {01} рдХреЛ рдЖрджрд░реНрд╢ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
KeyExpansion () рдХреЛрдб
 def key_expansion(key): key_symbols = [ord(symbol) for symbol in key] # ChipherKey shoul contain 16 symbols to fill 4*Nk table. If it's less # complement the key with "0x01" if len(key_symbols) < 4*nk: for i in range(4*nk - len(key_symbols)): key_symbols.append(0x01) # make ChipherKey(which is base of KeySchedule) key_schedule = [[] for i in range(4)] for r in range(4): for c in range(nk): key_schedule[r].append(key_symbols[r + 4*c]) # Comtinue to fill KeySchedule for col in range(nk, nb*(nr + 1)): # col - column number if col % nk == 0: # take shifted (col - 1)th column... tmp = [key_schedule[row][col-1] for row in range(1, 4)] tmp.append(key_schedule[0][col-1]) # change its elements using Sbox-table like in SubBytes... for j in range(len(tmp)): sbox_row = tmp[j] // 0x10 sbox_col = tmp[j] % 0x10 sbox_elem = sbox[16*sbox_row + sbox_col] tmp[j] = sbox_elem # and finally make XOR of 3 columns for row in range(4): s = key_schedule[row][col - 4]^tmp[row]^rcon[row][col/nk - 1] key_schedule[row].append(s) else: # just make XOR of 2 columns for row in range(4): s = key_schedule[row][col - 4]^key_schedule[row][col - 1] key_schedule[row].append(s) return key_schedule 

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, AddSoundKey () рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдореЗрдВ KeySchedule рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢реБрд░реБрдЖрддреА рджреМрд░ рдореЗрдВ, рдЧреЛрд▓ рдХреБрдВрдЬреА рд╕рдВрдЦреНрдпрд╛ 0, .., 3 рдХреЗ рд╕рд╛рде рдХреЙрд▓рдо рд╣реЛрдЧреА, рдкрд╣рд▓реЗ рдореЗрдВ - рд╕рдВрдЦреНрдпрд╛ 4, .., 7, рдЖрджрд┐ рдХреЗ рд╕рд╛рдеред AddRoundKey () рдХрд╛ рд╕рдВрдкреВрд░реНрдг рдмрд┐рдВрджреБ рдПрдХ XOR рд╕реНрдЯреЗрдЯ рдФрд░ рдПрдХ рдЧреЛрд▓ рдХреБрдВрдЬреА рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдирд╛ рд╣реИред

рдпрд╣, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рднреА рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдмрд╛рдЗрдЯреНрд╕ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╕рд░рдгреА рдлреЙрд░реНрдореВрд▓рд╛ рдЖрдЙрдЯрдкреБрдЯ [r + 4c] = рд╕реНрдЯреЗрдЯ [r] [c], r = 0.1 ... 4 рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕реНрдЯреЗрдЯ рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ; c = 0.1..Nb ред рдЗрд╕ рдмреАрдЪ, рд▓реЗрдЦ рдореЗрдВ рджреЗрд░реА рд╣реЛ рд░рд╣реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдо рдЬрд▓реНрджреА рд╕реЗ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗред

рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд▓реНрджреА


рдпрд╣рд╛рдВ рд╡рд┐рдЪрд╛рд░ рд╕рд░рд▓ рд╣реИ: рдпрджрд┐ рдЖрдк рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╣реА рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдореВрд▓ рд╕рдВрджреЗрд╢ рдорд┐рд▓рддрд╛ рд╣реИред рдРрд╕реЗ рдкреНрд░рддрд┐рд▓реЛрдо рдкрд░рд┐рд╡рд░реНрддрди InvSubBytes (), InvShiftRows (), InvMixColumns (), рдФрд░ AddRoundKey () рд╣реИрдВ ред рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рд╕рд╛рдорд╛рдиреНрдп рдпреЛрдЬрдирд╛:

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ AddRoundKey () рдХреЗ рд▓рд┐рдП рдЧреЛрд▓ рдХреБрдВрдЬреА рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреНрд░рдо рд░рд┐рд╡рд░реНрд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП: Nr + 1 рд╕реЗ 0. рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд╕рд╛рде, рд╕реНрдЯреЗрдЯ рдЯреЗрдмрд▓ рдЗрдирдкреБрдЯ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рд╕рд░рдгреА рд╕реЗ рдмрдирддрд╛ рд╣реИред рдлрд┐рд░, рдЗрд╕рдХреЗ рдКрдкрд░, рдкреНрд░рддреНрдпреЗрдХ рджреМрд░ рдореЗрдВ, рд░реВрдкрд╛рдВрддрд░рдг рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдбрд┐рдХреНрд░рд┐рдкреНрдЯреЗрдб рдлрд╝рд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдХреНрд░рдо рдереЛрдбрд╝рд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рд╣реЛрдЧрд╛, рдЗрдирд╡рд╕рдмрд╛рдЗрдЯреНрд╕ () рдпрд╛ рдЗрдирд╡рд╛рдЗрдЯрдлреНрд░рд╛рдЗрдЯреНрд╕ (), рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдмрд╛рдЗрдЯ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛, рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рдирдХ рдЫрджреНрдордХреЛрд╢ рдореЗрдВ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред

InvSubBytes ()

рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ SubBytes () рдХреЗ рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ InvSbox рдирд┐рд░рдВрддрд░ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рд╢реЗрд╖ рд░рд┐рд╡рд░реНрд╕ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди рднреА рдЙрдирдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдордХрдХреНрд╖реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдореЗрдВ рд╣рдо рдЙрдирдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдЪрд░ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдпрд╣ False , рддреЛ рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдорд╛рдиреНрдп рдпрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдореЛрдб (рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди) рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдпрджрд┐ True - рдЙрд▓рдЯрд╛ рдореЛрдб (рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди) рдореЗрдВред
рдХреЛрдб
 def sub_bytes(state, inv=False): if inv == False: # encrypt box = sbox else: # decrypt box = inv_sbox for i in range(len(state)): for j in range(len(state[i])): row = state[i][j] // 0x10 col = state[i][j] % 0x10 # Our Sbox is a flat array, not a bable. So, we use this trich to find elem: box_elem = box[16*row + col] state[i][j] = box_elem return state 


InvShiftRows ()

рд░рд╛рдЬреНрдп рдХреЗ рдкрд╣рд▓реЗ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП 1 рддрддреНрд╡ рджреНрд╡рд╛рд░рд╛ рджрд╛рдИрдВ рдУрд░ рдкрд░рд┐рд╡рд░реНрддрди рдЪрдХреНрд░, рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП 2 рдФрд░ рддреАрд╕рд░реЗ рдХреЗ рд▓рд┐рдП 3ред рд╢реВрдиреНрдп рд░реЗрдЦрд╛ рдШреВрдорддреА рдирд╣реАрдВ рд╣реИред

рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг: left_shift/right_shift(array, count) рдЗрдирдкреБрдЯ array рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рджрд┐рд╢рд╛ рдореЗрдВ left_shift/right_shift(array, count) рдШреБрдорд╛рдПрдВ
рдХреЛрдб
 def shift_rows(state, inv=False): count = 1 if inv == False: # encrypting for i in range(1, nb): state[i] = left_shift(state[i], count) count += 1 else: # decryption for i in range(1, nb): state[i] = right_shift(state[i], count) count += 1 return state 


InvMixColumns ()

рд╕рдВрдЪрд╛рд▓рди рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рд╕реНрддрдВрдн рдПрдХ рдЕрд▓рдЧ рдмрд╣реБрдкрдж {0b} x 3 + {0d} x 2 + {09} x + {0e} рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдпрд╛ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕реВрддреНрд░ред рд╕рднреА рдореВрд▓реНрдп, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╣реЗрдХреНрд╕рд╛рдбреЗрд╕рд┐рдорд▓ рд╕рдВрдХреЗрддрди рдореЗрдВ рд╣реИрдВред

рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдЧрдгрд┐рдд рдХреА рдУрд░ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдмрддрд╛рдПрдВ рдХрд┐ {02} рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рд╡реЗ рдЗрдиреНрд╣реЗрдВ {01} рдФрд░ {02} рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдШрдЯрд┐рдд рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН:
рд░реВрдкрд╛рдВрддрд░рдг
n * {03} = n * ({02} + {01}) = n * {02} + n * {01}
n * {09} = n * ({08} + {01}) = n * {02} * {02} * {02} + n * {01}
n * {0b} = n * ({08} + {02} + {01}) = b * {02} * {02} * {02} + n * {02} + n * {01}
n * {0d} = n * ({08} + {04} + {01}) = n * {08} + n * {04} + n * {01} = n * {02} * {02} * {02} + n * {02} * {02} + n * {01}
n * {0} = n * ({08} + {04} + {02} = n * {08} + n * {04} + n * {02} = n * {02} * {02} * { 02} + n * {02} * {02} + b * {02}

рдмреЗрд╢рдХ, рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рдШрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдкрдШрдЯрди
n * {09} = n * {03} + n * {03} + n * {03}
рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗрдЧрд╛ (рд╕рдВрджрд░реНрдн рддрд╛рд▓рд┐рдХрд╛ рд╕реНрд░реЛрдд рд╕реВрдЪреА рдореЗрдВ рд▓рд┐рдВрдХ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╣реИрдВ)ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЧрдгрдирд╛рдУрдВ рдХреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ (рдЯрд┐рдкреНрдкрдгреА) рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп, рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╡реЗ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╣рд╛рдпрдХ рдЧреБрдгрди рдХрд╛рд░реНрдп
 def mul_by_02(num): if num < 0x80: res = (num << 1) else: res = (num << 1)^0x1b return res % 0x100 def mul_by_03(num): return mul_by_02(num)^num def mul_by_09(num): #return mul_by_03(num)^mul_by_03(num)^mul_by_03(num) - works wrong, I don't know why return mul_by_02(mul_by_02(mul_by_02(num)))^num def mul_by_0b(num): #return mul_by_09(num)^mul_by_02(num) return mul_by_02(mul_by_02(mul_by_02(num)))^mul_by_02(num)^num def mul_by_0d(num): #return mul_by_0b(num)^mul_by_02(num) return mul_by_02(mul_by_02(mul_by_02(num)))^mul_by_02(mul_by_02(num))^num def mul_by_0e(num): #return mul_by_0d(num)^num return mul_by_02(mul_by_02(mul_by_02(num)))^mul_by_02(mul_by_02(num))^mul_by_02(num) 

рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг: рдлрд╝рдВрдХреНрд╢рди mul_by_<> GF (2 8 ) рдореЗрдВ рд╕рдВрдЧрдд mul_by_<> рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдорд┐рдХреНрд╕рдХреЙрд▓реНрдпреВрдордиреНрд╕ () рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдерд╛ред
рдХреЛрдб
  def mix_columns(state, inv=False): for i in range(nb): if inv == False: # encryption s0 = mul_by_02(state[0][i])^mul_by_03(state[1][i])^state[2][i]^state[3][i] s1 = state[0][i]^mul_by_02(state[1][i])^mul_by_03(state[2][i])^state[3][i] s2 = state[0][i]^state[1][i]^mul_by_02(state[2][i])^mul_by_03(state[3][i]) s3 = mul_by_03(state[0][i])^state[1][i]^state[2][i]^mul_by_02(state[3][i]) else: # decryption s0 = mul_by_0e(state[0][i])^mul_by_0b(state[1][i])^mul_by_0d(state[2][i])^mul_by_09(state[3][i]) s1 = mul_by_09(state[0][i])^mul_by_0e(state[1][i])^mul_by_0b(state[2][i])^mul_by_0d(state[3][i]) s2 = mul_by_0d(state[0][i])^mul_by_09(state[1][i])^mul_by_0e(state[2][i])^mul_by_0b(state[3][i]) s3 = mul_by_0b(state[0][i])^mul_by_0d(state[1][i])^mul_by_09(state[2][i])^mul_by_0e(state[3][i]) state[0][i] = s0 state[1][i] = s1 state[2][i] = s2 state[3][i] = s3 return state 


AddRoundKey ()

рдПрдХреНрд╕рдУрдЖрд░ рдСрдкрд░реЗрд╢рди рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдЙрд▓рдЯрд╛ рд╣реИ:
(рдПрдХ рдПрдХреНрд╕рдУрдЖрд░ рдмреА) рдПрдХреНрд╕рдУрдЖрд░ рдмреА = рдП

рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдЧреЛрд▓ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЙрд╕реА рддрд░рд╣ рдмрдирддрд╛ рд╣реИ рдЬреИрд╕реЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд▓рд┐рдП KeyExpansion () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдЧреЛрд▓ рдХреБрдВрдЬреА рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреЛрдб
 def add_round_key(state, key_schedule, round=0): for col in range(nk): # nb*round is a shift which indicates start of a part of the KeySchedule s0 = state[0][col]^key_schedule[0][nb*round + col] s1 = state[1][col]^key_schedule[1][nb*round + col] s2 = state[2][col]^key_schedule[2][nb*round + col] s3 = state[3][col]^key_schedule[3][nb*round + col] state[0][col] = s0 state[1][col] = s1 state[2][col] = s2 state[3][col] = s3 return state 

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╕реЗрдЯ рд╣реИ
рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдлрд╝рдВрдХреНрд╢рди
 def encrypt(input_bytes, key): # let's prepare our input data: State array and KeySchedule state = [[] for j in range(4)] for r in range(4): for c in range(nb): state[r].append(input_bytes[r + 4*c]) key_schedule = key_expansion(key) state = add_round_key(state, key_schedule) for rnd in range(1, nr): state = sub_bytes(state) state = shift_rows(state) state = mix_columns(state) state = add_round_key(state, key_schedule, rnd) state = sub_bytes(state) state = shift_rows(state) state = add_round_key(state, key_schedule, rnd + 1) output = [None for i in range(4*nb)] for r in range(4): for c in range(nb): output[r + 4*c] = state[r][c] return output 

рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдлрд╝рдВрдХреНрд╢рди
 def decrypt(cipher, key): # let's prepare our algorithm enter data: State array and KeySchedule state = [[] for i in range(nb)] for r in range(4): for c in range(nb): state[r].append(cipher[r + 4*c]) key_schedule = key_expansion(key) state = add_round_key(state, key_schedule, nr) rnd = nr - 1 while rnd >= 1: state = shift_rows(state, inv=True) state = sub_bytes(state, inv=True) state = add_round_key(state, key_schedule, rnd) state = mix_columns(state, inv=True) rnd -= 1 state = shift_rows(state, inv=True) state = sub_bytes(state, inv=True) state = add_round_key(state, key_schedule, rnd) output = [None for i in range(4*nb)] for r in range(4): for c in range(nb): output[r + 4*c] = state[r][c] return output 

рдпреЗ рджреЛ рдлрд╝рдВрдХреНрд╢рди рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдПрдХ рдЧреБрдкреНрдд рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд▓реЗрдирдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧред

рдирд┐рд╖реНрдХрд░реНрд╖, рджрд┐рд▓рдЪрд╕реНрдк рд▓рд┐рдВрдХ


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

рдФрд░ рдЕрдВрдд рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдкреИрдбрд┐рдВрдЧ рдпрд╛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ред рдПрдИрдПрд╕ рдПрдХ рдмреНрд▓реЙрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ, encrypt()/decrypt() рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдмреНрд▓реЙрдХ рд▓реЗрддреЗ рд╣реИрдВ (128-рдмрд┐рдЯ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ 16 рдмрд╛рдЗрдЯреНрд╕ рд╣реИ)ред рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ, 1 рд╕реЗ 15 рдмрд╛рдЗрдЯреНрд╕ рд░рд╣ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рднреА рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред рдЖрдк рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдмрд┐рдирд╛ рдЧрдВрддрд╡реНрдп рдлрд╝рд╛рдЗрд▓ рдкрд░ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рд╣рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдореБрдЭреЗ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд▓реЗрдЦ рджреНрд╡рд╛рд░рд╛ рдмреНрд▓реЙрдХ рд╕рд┐рдлрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛
рд╢реВрдиреНрдп рдмрд┐рдЯ рдХрд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬреЛрдбрд╝ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдкреЗрд▓реЛрдб рдХрд╛ рдЕрдВрдд рдирд╣реАрдВ рдкрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╡рд┐рдХрд▓реНрдк Oracle рдРрдб-рдСрди рджреНрд╡рд╛рд░рд╛ рд╣рдорд▓реЛрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЖрдИрдПрд╕рдУ / IEC 9797-1 рдореЗрдВ "рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзрд┐ 2" рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдХреАрдХреГрдд рд╕рдорд╛рдзрд╛рди рд▓рд╛рдЧреВ рд╣реИ, рд╕рдВрджреЗрд╢ рдХреЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рд╕рд╛ рдЬреЛрдбрд╝рдХрд░ рдФрд░ рд╢реЗрд╖ рд╕реНрдерд╛рди рдХреЛ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рднрд░рдирд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдРрд╕реЗ рд╣рдорд▓реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рд░реЛрдз рд╕рд╛рдмрд┐рдд рд╣реБрдЖ рдерд╛ред

рддреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд╣рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛ рд░рд╣рд╛, рд╕рд┐рд░реНрдл рдЯрд┐рдкреНрдкрдгреА рдХреАред рдЕрдЪрд╛рдирдХ, рдФрд░ рдХрд╛рдо рдореЗрдВ рдЖрдирд╛)ред

рд╕реНрд░реЛрдд рдЪрдпрди:

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


All Articles