
рдЕрднрд┐рд╡рд╛рджрди,% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо%!
рдЖрдЬ рдХрд╛ рд▓реЗрдЦ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ рдПрдирд╛рд▓реЙрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕реЗрдХреНрдЯрд░-рдмрд╛рдп-рд╕реЗрдХреНрдЯрд░ рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЛрдб рдХрд╛ рдПрдХ рдкрд╣рд▓реВ (рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рдкрд░ / рд╕реЗ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП)
рд╣рдо рд╕рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рдбрд┐рд╕реНрдХ рдПрдирдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ (рдЯреНрд░реВ рдХреНрд░рд┐рдкреНрдЯрд╛рдЗрдХ, рдбрд┐рд╕реНрдХ рдХреНрд░рд┐рдкреНрдЯреЛ) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрдХреНрд╕рдЯреАрдПрд╕-рдПрдИрдПрд╕ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдпрд╣ IEEE P1619 тДв / D16 (рдмреНрд▓реЙрдХ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд╕реНрдЯреЛрд░реЗрдЬ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ) рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдХреНрдЯрд░-рдмрд╛рдп-рд╕реЗрдХреНрдЯрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ:
- 256/512 рдХреБрдВрдЬреА рдмрд┐рдЯреНрд╕ (рд╢рд╛рдпрдж SHA-256/512 (рдирдордХ + рдкрд╛рд╕рд╡рд░реНрдб) рдпрд╛ рдХреЗрдбреАрдПрдл рдЬреИрд╕рд╛ рдХреБрдЫ)
- рд╕реЗрдХреНрдЯрд░ рдХрд╛ рдкрддрд╛ (рд╕рдВрдЦреНрдпрд╛)
- 128 рдмрд┐рдЯреНрд╕ рдХреА рдбреЗрдЯрд╛ рд▓рдВрдмрд╛рдИ рдХрдИ рдХреЗ Sobsno рдмреНрд▓реЙрдХ (рдмреНрд▓реЙрдХ рдЖрдХрд╛рд░ рдПрдИрдПрд╕)
рд╕рд░рд▓реАрдХреГрдд, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рджреЛ рдореЗрдВ рдПрдХ рдХреБрдВрдЬреА рдХрд╛ рдЯреВрдЯрдирд╛ред рдкрд╣рд▓рд╛ рднрд╛рдЧ рдбреЗрдЯрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреБрдВрдЬреА ( k1 ), рджреВрд╕рд░рд╛ - рдЯреНрд╡рд┐рди рд╡реИрд▓реНрдпреВ ( k2 ) рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдХреБрдВрдЬреА рдмрди рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рд╣рдо 512-рдмрд┐рдЯ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдордиреЗ рдЗрд╕реЗ 2x256 рдкрд░ рджреЗрдЦрд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдИрдПрд╕ -256 рдореЗрдВ рдХрд┐рдпрд╛ - рд╣рдо рд╕реЗрдХреНрдЯрд░ рдирдВрдмрд░ рдХреЛ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ k2 рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░рд╛ рдЯреНрд╡рд┐рд╕реНрдЯ рд╡реИрд▓реНрдпреВ рд╣реИ
- рд╣рдо рдЖрдХрд╛рд░ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП 16 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдбреЗрдЯрд╛ рдРрд░реЗ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ:
- 1. рдЗрд╕реЗ рдЯреНрд╡рд┐рдХ рдорд╛рди рдХреЗ рд╕рд╛рде рд░рдЦреЗрдВ
- 2. рд╣рдо рдЗрд╕реЗ рдХреБрдВрдЬреА k1 рдХреЗ рд╕рд╛рде рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ / рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рддреЗ рд╣реИрдВ
- 3. рдлрд┐рд░ рд╕реЗ Xorim рдкрд╣рд▓реЗ рд╕реЗ рд╣реА (рджреМрдбрд╝) рдПрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдЬрд┐рд╕рдореЗрдВ рдЯреНрд╡рд┐рдХ рд╡реИрд▓реНрдпреВ рд╣реИ ред рд╣рдо рдЗрд╕реЗ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдпрд╣ рдЙрд╕ рд╕реЗрдХреНрдЯрд░ рдХрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдмреНрд▓реЙрдХ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд░реВрд░рдд рд╣реИ (for / ras)
- 4. рдмрд╣реБрдкрдж ╬▒ = x 128 + x 7 + x 2 + x + 1 рджреНрд╡рд╛рд░рд╛ рдЯреНрд╡рд┐рдХ рдорд╛рди рдХреЛ рдЧреБрдгрд╛ рдХрд░реЗрдВ
рдпрд╣рд╛рдБ (рдореЗрд░реЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ) рдмрд╣реБрдЙрджреНрджреЗрд╢реНрдпреАрдп рдмрд╣реБрдкрдж рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ, рдпрд╣ рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ 1 рдмрд┐рдЯ + xor рджреНрд╡рд╛рд░рд╛ рдкреВрд░реЗ рд╕рд░рдгреА рдХреА рдПрдХ рдкрд╛рд░реА рд╣реИред
- рдирд┐рдЬреА рдХрд╛рд╕реНрдЯ int GF_128_FDBK = 0x87 ;
- рдирд┐рдЬреА рдХреЙрдиреНрд╕реНрдЯреЗрдВрд╕ int AES_BLK_BYTES = 16 ;
- ...
- // ╬▒ рд╕реЗ T (рдХрдордЬреЛрд░ рдорд╛рди) рдХреЛ рдЧреБрдгрд╛ рдХрд░реЗрдВ
- рд╕рд┐рди = 0 ; // рдХреИрд░реА рдмрд┐рдЯ
- рдХреЗ рд▓рд┐рдП ( j = 0 ; j < AES_BLK_BYTES ; j ++ )
- {
- Cout = ( T [ j ] >> 7 ) & 1 ;
- T [ j ] = ( рдмрд╛рдЗрдЯ ) ( ( ( T [ j ] << 1 ) + Cin ) & 0xFF ) ;
- рд╕рд┐рди = cout ;
- }
- рдЕрдЧрд░ ( Cout ! = 0 )
- {
- рдЯреА [ 0 ] ^ = GF_128_FDBK ;
- }
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЛрдИ рдЕрдкрд░рд╛рдз рдирд╣реАрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕реЗрдХреНрдЯрд░ рдХреЗ рднреАрддрд░ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдЯреНрд╡реАрдХ рд╡реИрд▓реНрдпреВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛред
рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ рд╕рдордЭ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрди : рдЗрд╕реЗ GF (2) modulo x
128 + x
7 + x
2 + x + 1 рдореЗрдВ рдмрд╣реБрдкрдж рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХреНрдпреЛрдВ рдЪреБрдирд╛ рдЧрдпрд╛? рдореЗрд░рд╛ (рдЧреИрд░) рдЬреНрдЮрд╛рди рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЪрдХреНрд░реАрдп рд╕рдореВрд╣ рдпрд╣рд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдм рдЪрдХреНрд░реАрдп рдмрджрд▓рд╛рд╡ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рд╣реИред
C # рдХрд╛рд░реНрдп рдХреЛрдб рдЬреЛ рдорд╛рдирдХ рдкрд░реАрдХреНрд╖рдг рднреА рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ:
- рдХрдХреНрд╖рд╛ XTS
- {
- рдирд┐рдЬреА рдХрд╛рд╕реНрдЯ int GF_128_FDBK = 0x87 ;
- рдирд┐рдЬреА рдХреЙрдиреНрд╕реНрдЯреЗрдВрд╕ int AES_BLK_BYTES = 16 ;
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рдмрд╛рдЗрдЯ [ ] рдПрдиреНрдХреНрд░рд┐рдкреНрдЯрд╕реЗрдХреНрдЯрд░ ( рдмрд╛рдЗрдЯ [ ] рдЗрдирдбрд╛рдЯрд╛, рдмрд╛рдЗрдЯ [ ] dataEnc рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рдиKey, рдмрд╛рдЗрдЯ [ ] tweakEnc рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рдиKey, UInt64 рд╕реЗрдХреНрдЯрд░рдирдВрдмрд░, рдмреВрд▓ рдПрдирдХреНрд░рд┐рдкреНрдЯ )
- {
- рдмрд╛рдЗрдЯ [ ] рдЖрдЙрдЯрдбреЗрдЯрд╛ = рдирдпрд╛ рдмрд╛рдЗрдЯ [ рдЗрдирдбрд╛рдЯрд╛ред рд▓рдВрдмрд╛рдИ ] ; // рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ред InData рдХрд╛ рдЖрдХрд╛рд░ 32 рдХрд╛ рдЧреБрдгрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!
- рдпреВрдВрдЯ рдЖрдИ, рдЬреЗ ; // рд╕реНрдерд╛рдиреАрдп рдХрд╛рдЙрдВрдЯрд░
- var T = рдирдИ рдмрд╛рдЗрдЯ [ AES_BLK_BYTES ] ; // tweak рдореВрд▓реНрдп
- var x = рдирдпрд╛ рдмрд╛рдЗрдЯ [ AES_BLK_BYTES ] ; / (рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рдкреАрдЫреЗ / рд░рд╛рд╕) рдХреЗ рд▓рд┐рдП рдмрдлрд░
- // рд╕реЗрдХреНрдЯрд░ рдирдВрдмрд░ рдХреЛ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓реЗрдВ
- рд╕рд░рдгреАред рдХреЙрдкреА ( BitConverterред GetBytes ( рд╕реЗрдХреНрдЯрд░рдирдВрдмрд░ ) , рдЯреА, 8 ) ;
- // T рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯреНрд╡рд┐рди рд╡реИрд▓реНрдпреВ рд╣реИред рд╕рдЪреНрдЪрд╛ рдорддрд▓рдм рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ
- processAES ( tweakEncryptionKey, T, true ) ;
- // рдкреНрд░рдХреНрд░рд┐рдпрд╛ AES_BLK_BYTES рдПрдХ рдмрд╛рд░ рдореЗрдВ рдмрд╛рдЗрдЯ рдХрд░рддреА рд╣реИ
- рдХреЗ рд▓рд┐рдП ( i = 0 ; i < inDataред рд▓рдВрдмрд╛рдИ ; i + = AES_BLK_BYTES )
- {
- // Xorim рдбреЗрдЯрд╛ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдЯреНрд╡рд┐рдХ рдореВрд▓реНрдп
- рдХреЗ рд▓рд┐рдП ( j = 0 ; j < AES_BLK_BYTES ; j ++ )
- {
- x [ j ] = ( рдмрд╛рдЗрдЯ ) ( inData [ i + j ] ^ T [ j ] ) ;
- }
- // рдмреНрд▓реЙрдХ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ / рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ
- processAES ( dataEnc рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рдиKey, x, рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ ) ;
- // рд╕рдВрд╕рд╛рдзрд┐рдд рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдЬрд╝реЛрд░рд┐рдо рдЯреНрд╡рд┐рдХ рдореВрд▓реНрдп
- рдХреЗ рд▓рд┐рдП ( j = 0 ; j < AES_BLK_BYTES ; j ++ )
- {
- outData [ i + j ] = ( рдмрд╛рдЗрдЯ ) ( x [ j ] ^ T [ j ] ) ;
- }
- // ╬▒ рд╕реЗ рдЧреБрдгрд╛ рдореВрд▓реНрдп
- j = AES_BLK_BYTES ;
- int t = T [ AES_BLK_BYTES - 1 ] ;
- рдЬрдмрдХрд┐ ( - j ! = 0 )
- T [ j ] = ( рдмрд╛рдЗрдЯ ) ( ( T [ j ] << 1 ) | ( ( T [ j - 1 ] & xx80 ) = = 0 ; 1 : 0 ) ) ;
- рдЯреА [ 0 ] = ( рдмрд╛рдЗрдЯ ) ( ( рдЯреА [ 0 ] << 1 ) ^ ( ( рдЯреА рдПрдВрдб 0x80 ) ! = 0 ; 0x87 : 0x00 ) ) ;
- }
- рд╡рд╛рдкрд╕реА рд╕реЗ рдмрд╛рд╣рд░ ;
- }
- рдирд┐рдЬреА рд╕реНрдерд┐рд░ рд╢реВрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдРрд╕реЗ ( рдмрд╛рдЗрдЯ [ ] рдХреЗ, рдмрд╛рдЗрдЯ [ ] рдЯреА, рдмреВрд▓ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди )
- {
- / * рдПрдиреНрд╕рдлреИрд╕реНрдЯрдЧрд╛рдЗрди рдмреМрдВрд╕реАрдХрд╕реНрдЯрд▓ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдЖрдк рдорд╛рдирдХ рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ
- * рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЕрд▓рдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдмрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
- * рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдмреНрд▓реЙрдХ рдЖрдХрд╛рд░ред
- * /
- var рдЗрдВрдЬрди = рдирдпрд╛ AesFastEngine ( ) ;
- рдЗрдВрдЬрдиред Init ( рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ, рдирдпрд╛ KeyParameter ( k ) ) ;
- рдЗрдВрдЬрдиред рдкреНрд░реЛрд╕реЗрд╕рдмреНрд▓реЙрдХ ( рдЯреА, 0 , рдЯреА, 0 ) ;
- }
- }
______________________
рдПрдИрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд╕рдЪ рд╣реИ, рдорд╛рдирдХ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред
рд╣реЛрдорд╡рд░реНрдХ 32 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реЗрдХреНрдЯрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдФрд░ рдореИрдВ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛)