рдЗрддрдирд╛ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ, XTS-AES


рдЕрднрд┐рд╡рд╛рджрди,% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо%!


рдЖрдЬ рдХрд╛ рд▓реЗрдЦ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ рдПрдирд╛рд▓реЙрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕реЗрдХреНрдЯрд░-рдмрд╛рдп-рд╕реЗрдХреНрдЯрд░ рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЛрдб рдХрд╛ рдПрдХ рдкрд╣рд▓реВ (рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рди рдкрд░ / рд╕реЗ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП)
рд╣рдо рд╕рднреА рд▓реЛрдХрдкреНрд░рд┐рдп рдбрд┐рд╕реНрдХ рдПрдирдХреНрд░рд┐рдкреНрдЯрд░реНрд╕ (рдЯреНрд░реВ рдХреНрд░рд┐рдкреНрдЯрд╛рдЗрдХ, рдбрд┐рд╕реНрдХ рдХреНрд░рд┐рдкреНрдЯреЛ) рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрдХреНрд╕рдЯреАрдПрд╕-рдПрдИрдПрд╕ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдпрд╣ IEEE P1619 тДв / D16 (рдмреНрд▓реЙрдХ-рдУрд░рд┐рдПрдВрдЯреЗрдб рд╕реНрдЯреЛрд░реЗрдЬ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ) рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рд╕реЗрдХреНрдЯрд░-рдмрд╛рдп-рд╕реЗрдХреНрдЯрд░ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ:
  1. 256/512 рдХреБрдВрдЬреА рдмрд┐рдЯреНрд╕ (рд╢рд╛рдпрдж SHA-256/512 (рдирдордХ + рдкрд╛рд╕рд╡рд░реНрдб) рдпрд╛ рдХреЗрдбреАрдПрдл рдЬреИрд╕рд╛ рдХреБрдЫ)
  2. рд╕реЗрдХреНрдЯрд░ рдХрд╛ рдкрддрд╛ (рд╕рдВрдЦреНрдпрд╛)
  3. 128 рдмрд┐рдЯреНрд╕ рдХреА рдбреЗрдЯрд╛ рд▓рдВрдмрд╛рдИ рдХрдИ рдХреЗ Sobsno рдмреНрд▓реЙрдХ (рдмреНрд▓реЙрдХ рдЖрдХрд╛рд░ рдПрдИрдПрд╕)


рд╕рд░рд▓реАрдХреГрдд, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
  1. рджреЛ рдореЗрдВ рдПрдХ рдХреБрдВрдЬреА рдХрд╛ рдЯреВрдЯрдирд╛ред рдкрд╣рд▓рд╛ рднрд╛рдЧ рдбреЗрдЯрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреБрдВрдЬреА ( k1 ), рджреВрд╕рд░рд╛ - рдЯреНрд╡рд┐рди рд╡реИрд▓реНрдпреВ ( k2 ) рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдХреБрдВрдЬреА рдмрди рдЬрд╛рддрд╛ рд╣реИред
    рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рд╣рдо 512-рдмрд┐рдЯ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдордиреЗ рдЗрд╕реЗ 2x256 рдкрд░ рджреЗрдЦрд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдИрдПрд╕ -256 рдореЗрдВ рдХрд┐рдпрд╛
  2. рд╣рдо рд╕реЗрдХреНрдЯрд░ рдирдВрдмрд░ рдХреЛ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ k2 рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣рдорд╛рд░рд╛ рдЯреНрд╡рд┐рд╕реНрдЯ рд╡реИрд▓реНрдпреВ рд╣реИ
  3. рд╣рдо рдЖрдХрд╛рд░ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП 16 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдбреЗрдЯрд╛ рдРрд░реЗ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ:
  4. 1. рдЗрд╕реЗ рдЯреНрд╡рд┐рдХ рдорд╛рди рдХреЗ рд╕рд╛рде рд░рдЦреЗрдВ
  5. 2. рд╣рдо рдЗрд╕реЗ рдХреБрдВрдЬреА k1 рдХреЗ рд╕рд╛рде рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ / рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░рддреЗ рд╣реИрдВ
  6. 3. рдлрд┐рд░ рд╕реЗ Xorim рдкрд╣рд▓реЗ рд╕реЗ рд╣реА (рджреМрдбрд╝) рдПрдХ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдЬрд┐рд╕рдореЗрдВ рдЯреНрд╡рд┐рдХ рд╡реИрд▓реНрдпреВ рд╣реИ ред рд╣рдо рдЗрд╕реЗ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ, рдпрд╣ рдЙрд╕ рд╕реЗрдХреНрдЯрд░ рдХрд╛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдмреНрд▓реЙрдХ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд░реВрд░рдд рд╣реИ (for / ras)
  7. 4. рдмрд╣реБрдкрдж ╬▒ = x 128 + x 7 + x 2 + x + 1 рджреНрд╡рд╛рд░рд╛ рдЯреНрд╡рд┐рдХ рдорд╛рди рдХреЛ рдЧреБрдгрд╛ рдХрд░реЗрдВ


рдпрд╣рд╛рдБ (рдореЗрд░реЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ) рдмрд╣реБрдЙрджреНрджреЗрд╢реНрдпреАрдп рдмрд╣реБрдкрдж рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ, рдпрд╣ рдЕрдВрддрд┐рдо рдЪрд░рдг рдореЗрдВ 1 рдмрд┐рдЯ + xor рджреНрд╡рд╛рд░рд╛ рдкреВрд░реЗ рд╕рд░рдгреА рдХреА рдПрдХ рдкрд╛рд░реА рд╣реИред
  1. рдирд┐рдЬреА рдХрд╛рд╕реНрдЯ int GF_128_FDBK = 0x87 ;
  2. рдирд┐рдЬреА рдХреЙрдиреНрд╕реНрдЯреЗрдВрд╕ int AES_BLK_BYTES = 16 ;
  3. ...
  4. // ╬▒ рд╕реЗ T (рдХрдордЬреЛрд░ рдорд╛рди) рдХреЛ рдЧреБрдгрд╛ рдХрд░реЗрдВ
  5. рд╕рд┐рди = 0 ; // рдХреИрд░реА рдмрд┐рдЯ
  6. рдХреЗ рд▓рд┐рдП ( j = 0 ; j < AES_BLK_BYTES ; j ++ )
  7. {
  8. Cout = ( T [ j ] >> 7 ) & 1 ;
  9. T [ j ] = ( рдмрд╛рдЗрдЯ ) ( ( ( T [ j ] << 1 ) + Cin ) & 0xFF ) ;
  10. рд╕рд┐рди = cout ;
  11. }
  12. рдЕрдЧрд░ ( Cout ! = 0 )
  13. {
  14. рдЯреА [ 0 ] ^ = GF_128_FDBK ;
  15. }



рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЛрдИ рдЕрдкрд░рд╛рдз рдирд╣реАрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕реЗрдХреНрдЯрд░ рдХреЗ рднреАрддрд░ рдкреНрд░рддреНрдпреЗрдХ рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рдЯреНрд╡реАрдХ рд╡реИрд▓реНрдпреВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛред
рдЧрдгрд┐рддреАрдп рд░реВрдк рд╕реЗ рд╕рдордЭ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рджрд░реНрд╢рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрди : рдЗрд╕реЗ GF (2) modulo x 128 + x 7 + x 2 + x + 1 рдореЗрдВ рдмрд╣реБрдкрдж рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХреНрдпреЛрдВ рдЪреБрдирд╛ рдЧрдпрд╛? рдореЗрд░рд╛ (рдЧреИрд░) рдЬреНрдЮрд╛рди рдХреЗрд╡рд▓ рдпрд╣ рдорд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдЪрдХреНрд░реАрдп рд╕рдореВрд╣ рдпрд╣рд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдм рдЪрдХреНрд░реАрдп рдмрджрд▓рд╛рд╡ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдирд╛рд▓реЙрдЧ рд╣реИред

C # рдХрд╛рд░реНрдп рдХреЛрдб рдЬреЛ рдорд╛рдирдХ рдкрд░реАрдХреНрд╖рдг рднреА рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ:
  1. рдХрдХреНрд╖рд╛ XTS
  2. {
  3. рдирд┐рдЬреА рдХрд╛рд╕реНрдЯ int GF_128_FDBK = 0x87 ;
  4. рдирд┐рдЬреА рдХреЙрдиреНрд╕реНрдЯреЗрдВрд╕ int AES_BLK_BYTES = 16 ;
  5. рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рдмрд╛рдЗрдЯ [ ] рдПрдиреНрдХреНрд░рд┐рдкреНрдЯрд╕реЗрдХреНрдЯрд░ ( рдмрд╛рдЗрдЯ [ ] рдЗрдирдбрд╛рдЯрд╛, рдмрд╛рдЗрдЯ [ ] dataEnc рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рдиKey, рдмрд╛рдЗрдЯ [ ] tweakEnc рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рдиKey, UInt64 рд╕реЗрдХреНрдЯрд░рдирдВрдмрд░, рдмреВрд▓ рдПрдирдХреНрд░рд┐рдкреНрдЯ )
  6. {
  7. рдмрд╛рдЗрдЯ [ ] рдЖрдЙрдЯрдбреЗрдЯрд╛ = рдирдпрд╛ рдмрд╛рдЗрдЯ [ рдЗрдирдбрд╛рдЯрд╛ред рд▓рдВрдмрд╛рдИ ] ; // рдПрдХ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ред InData рдХрд╛ рдЖрдХрд╛рд░ 32 рдХрд╛ рдЧреБрдгрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!
  8. рдпреВрдВрдЯ рдЖрдИ, рдЬреЗ ; // рд╕реНрдерд╛рдиреАрдп рдХрд╛рдЙрдВрдЯрд░
  9. var T = рдирдИ рдмрд╛рдЗрдЯ [ AES_BLK_BYTES ] ; // tweak рдореВрд▓реНрдп
  10. var x = рдирдпрд╛ рдмрд╛рдЗрдЯ [ AES_BLK_BYTES ] ; / (рдПрдиреНрдХреНрд░рд┐рдкреНрдЯреЗрдб рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рдкреАрдЫреЗ / рд░рд╛рд╕) рдХреЗ рд▓рд┐рдП рдмрдлрд░
  11. // рд╕реЗрдХреНрдЯрд░ рдирдВрдмрд░ рдХреЛ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓реЗрдВ
  12. рд╕рд░рдгреАред рдХреЙрдкреА ( BitConverterред GetBytes ( рд╕реЗрдХреНрдЯрд░рдирдВрдмрд░ ) , рдЯреА, 8 ) ;
  13. // T рдореЗрдВ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯреНрд╡рд┐рди рд╡реИрд▓реНрдпреВ рд╣реИред рд╕рдЪреНрдЪрд╛ рдорддрд▓рдм рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ
  14. processAES ( tweakEncryptionKey, T, true ) ;
  15. // рдкреНрд░рдХреНрд░рд┐рдпрд╛ AES_BLK_BYTES рдПрдХ рдмрд╛рд░ рдореЗрдВ рдмрд╛рдЗрдЯ рдХрд░рддреА рд╣реИ
  16. рдХреЗ рд▓рд┐рдП ( i = 0 ; i < inDataред рд▓рдВрдмрд╛рдИ ; i + = AES_BLK_BYTES )
  17. {
  18. // Xorim рдбреЗрдЯрд╛ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд╕рд╛рде рдЯреНрд╡рд┐рдХ рдореВрд▓реНрдп
  19. рдХреЗ рд▓рд┐рдП ( j = 0 ; j < AES_BLK_BYTES ; j ++ )
  20. {
  21. x [ j ] = ( рдмрд╛рдЗрдЯ ) ( inData [ i + j ] ^ T [ j ] ) ;
  22. }
  23. // рдмреНрд▓реЙрдХ рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ / рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд░реЗрдВ
  24. processAES ( dataEnc рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рдиKey, x, рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ ) ;
  25. // рд╕рдВрд╕рд╛рдзрд┐рдд рдбреЗрдЯрд╛ рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдЬрд╝реЛрд░рд┐рдо рдЯреНрд╡рд┐рдХ рдореВрд▓реНрдп
  26. рдХреЗ рд▓рд┐рдП ( j = 0 ; j < AES_BLK_BYTES ; j ++ )
  27. {
  28. outData [ i + j ] = ( рдмрд╛рдЗрдЯ ) ( x [ j ] ^ T [ j ] ) ;
  29. }
  30. // ╬▒ рд╕реЗ рдЧреБрдгрд╛ рдореВрд▓реНрдп
  31. j = AES_BLK_BYTES ;
  32. int t = T [ AES_BLK_BYTES - 1 ] ;
  33. рдЬрдмрдХрд┐ ( - j ! = 0 )
  34. T [ j ] = ( рдмрд╛рдЗрдЯ ) ( ( T [ j ] << 1 ) | ( ( T [ j - 1 ] & xx80 ) = = 0 ; 1 : 0 ) ) ;
  35. рдЯреА [ 0 ] = ( рдмрд╛рдЗрдЯ ) ( ( рдЯреА [ 0 ] << 1 ) ^ ( ( рдЯреА рдПрдВрдб 0x80 ) ! = 0 ; 0x87 : 0x00 ) ) ;
  36. }
  37. рд╡рд╛рдкрд╕реА рд╕реЗ рдмрд╛рд╣рд░ ;
  38. }
  39. рдирд┐рдЬреА рд╕реНрдерд┐рд░ рд╢реВрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдРрд╕реЗ ( рдмрд╛рдЗрдЯ [ ] рдХреЗ, рдмрд╛рдЗрдЯ [ ] рдЯреА, рдмреВрд▓ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди )
  40. {
  41. / * рдПрдиреНрд╕рдлреИрд╕реНрдЯрдЧрд╛рдЗрди рдмреМрдВрд╕реАрдХрд╕реНрдЯрд▓ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдЖрдк рдорд╛рдирдХ рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ
  42. * рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЕрд▓рдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдмрд╕ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
  43. * рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдмреНрд▓реЙрдХ рдЖрдХрд╛рд░ред
  44. * /
  45. var рдЗрдВрдЬрди = рдирдпрд╛ AesFastEngine ( ) ;
  46. рдЗрдВрдЬрдиред Init ( рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ, рдирдпрд╛ KeyParameter ( k ) ) ;
  47. рдЗрдВрдЬрдиред рдкреНрд░реЛрд╕реЗрд╕рдмреНрд▓реЙрдХ ( рдЯреА, 0 , рдЯреА, 0 ) ;
  48. }
  49. }



______________________
рдПрдИрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рд╕рдЪ рд╣реИ, рдорд╛рдирдХ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред

рд╣реЛрдорд╡рд░реНрдХ 32 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реЗрдХреНрдЯрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдФрд░ рдореИрдВ рдбреНрд░реЙрдкрдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛)

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


All Articles