- 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