1 2 package ch.ethz.ssh2.crypto.cipher; 3 4 10 public class CTRMode implements BlockCipher 11 { 12 byte[] X; 13 byte[] Xenc; 14 15 BlockCipher bc; 16 int blockSize; 17 boolean doEncrypt; 18 19 int count = 0; 20 21 public void init(boolean forEncryption, byte[] key) 22 { 23 } 24 25 public CTRMode(BlockCipher tc, byte[] iv, boolean doEnc) throws IllegalArgumentException 26 { 27 bc = tc; 28 blockSize = bc.getBlockSize(); 29 doEncrypt = doEnc; 30 31 if (blockSize != iv.length) 32 throw new IllegalArgumentException ("IV must be " + blockSize + " bytes long! (currently " + iv.length + ")"); 33 34 X = new byte[blockSize]; 35 Xenc = new byte[blockSize]; 36 37 System.arraycopy(iv, 0, X, 0, blockSize); 38 } 39 40 public final int getBlockSize() 41 { 42 return blockSize; 43 } 44 45 public final void transformBlock(byte[] src, int srcoff, byte[] dst, int dstoff) 46 { 47 bc.transformBlock(X, 0, Xenc, 0); 48 49 for (int i = 0; i < blockSize; i++) 50 { 51 dst[dstoff + i] = (byte) (src[srcoff + i] ^ Xenc[i]); 52 } 53 54 for (int i = (blockSize - 1); i >= 0; i--) 55 { 56 X[i]++; 57 if (X[i] != 0) 58 break; 59 60 } 61 } 62 } 63 | Popular Tags |