
- private const int GF_128_FDBK = 0x87 ;
 - private const int AES_BLK_BYTES = 16 ;
 - ...
 - // multiply T (weak value) by α
 - Cin = 0 ; // carry bit
 - for ( j = 0 ; j < AES_BLK_BYTES ; j ++ )
 - {
 - Cout = ( T [ j ] >> 7 ) & 1 ;
 - T [ j ] = ( byte ) ( ( ( T [ j ] << 1 ) + Cin ) & 0xFF ) ;
 - Cin = Cout ;
 - }
 - if ( cout ! = 0 )
 - {
 - T [ 0 ] ^ = GF_128_FDBK ;
 - }
 
- class XTS
 - {
 - private const int GF_128_FDBK = 0x87 ;
 - private const int AES_BLK_BYTES = 16 ;
 - public static byte [ ] encryptSector ( byte [ ] inData, byte [ ] dataEncryptionKey, byte [ ] tweakEncryptionKey, UInt64 sectorNumber, bool encrypt )
 - {
 - byte [ ] outData = new byte [ inData. Length ] ; // there will be a result. The inData size must be a multiple of 32!
 - uint i, j ; // local counters
 - var T = new byte [ AES_BLK_BYTES ] ; // tweak value
 - var x = new byte [ AES_BLK_BYTES ] ; // buffer for (for / ra) encrypted data block
 - // convert sector number to byte array
 - Array. Copy ( BitConverter. GetBytes ( sectorNumber ) , T, 8 ) ;
 - // after encryption in T we have tweak value. true means encrypt
 - processAES ( tweakEncryptionKey, T, true ) ;
 - // Process by AES_BLK_BYTES bytes at a time
 - for ( i = 0 ; i < inData. Length ; i + = AES_BLK_BYTES )
 - {
 - // Xorim tweak value with a piece of data
 - for ( j = 0 ; j < AES_BLK_BYTES ; j ++ )
 - {
 - x [ j ] = ( byte ) ( inData [ i + j ] ^ T [ j ] ) ;
 - }
 - // encrypt / decrypt block
 - processAES ( dataEncryptionKey, x, encrypt ) ;
 - // xorim tweak value with processed data block
 - for ( j = 0 ; j < AES_BLK_BYTES ; j ++ )
 - {
 - outData [ i + j ] = ( byte ) ( x [ j ] ^ T [ j ] ) ;
 - }
 - // Multiply tweak value by α
 - j = AES_BLK_BYTES ;
 - int t = T [ AES_BLK_BYTES - 1 ] ;
 - while ( - j ! = 0 )
 - T [ j ] = ( byte ) ( ( T [ j ] << 1 ) | ( ( T [ j - 1 ] & 0x80 ) ! = 0 ? 1 : 0 ) ) ;
 - T [ 0 ] = ( byte ) ( ( T [ 0 ] << 1 ) ^ ( ( t & 0x80 ) ! = 0 ? 0x87 : 0x00 ) ) ;
 - }
 - return outData ;
 - }
 - private static void processAES ( byte [ ] k, byte [ ] T, bool encrypt )
 - {
 - / * AesFastEngine is taken from BouncyCastle. You can replace with standard
 - * implementation, or even use a different algorithm, just consider
 - * block size encryption.
 - * /
 - var engine = new AesFastEngine ( ) ;
 - engine. Init ( encrypt, new KeyParameter ( k ) ) ;
 - engine. ProcessBlock ( T, 0 , T, 0 ) ;
 - }
 - }
 
Source: https://habr.com/ru/post/120096/
All Articles