1 package ch.ethz.ssh2.crypto.cipher; 2 3 9 public class CBCMode implements BlockCipher 10 { 11 BlockCipher tc; 12 int blockSize; 13 boolean doEncrypt; 14 15 byte[] cbc_vector; 16 byte[] tmp_vector; 17 18 public void init(boolean forEncryption, byte[] key) 19 { 20 } 21 22 public CBCMode(BlockCipher tc, byte[] iv, boolean doEncrypt) 23 throws IllegalArgumentException 24 { 25 this.tc = tc; 26 this.blockSize = tc.getBlockSize(); 27 this.doEncrypt = doEncrypt; 28 29 if (this.blockSize != iv.length) 30 throw new IllegalArgumentException ("IV must be " + blockSize 31 + " bytes long! (currently " + iv.length + ")"); 32 33 this.cbc_vector = new byte[blockSize]; 34 this.tmp_vector = new byte[blockSize]; 35 System.arraycopy(iv, 0, cbc_vector, 0, blockSize); 36 } 37 38 public int getBlockSize() 39 { 40 return blockSize; 41 } 42 43 private void encryptBlock(byte[] src, int srcoff, byte[] dst, int dstoff) 44 { 45 for (int i = 0; i < blockSize; i++) 46 cbc_vector[i] ^= src[srcoff + i]; 47 48 tc.transformBlock(cbc_vector, 0, dst, dstoff); 49 50 System.arraycopy(dst, dstoff, cbc_vector, 0, blockSize); 51 } 52 53 private void decryptBlock(byte[] src, int srcoff, byte[] dst, int dstoff) 54 { 55 56 57 System.arraycopy(src, srcoff, tmp_vector, 0, blockSize); 58 59 tc.transformBlock(src, srcoff, dst, dstoff); 60 61 for (int i = 0; i < blockSize; i++) 62 dst[dstoff + i] ^= cbc_vector[i]; 63 64 65 66 byte[] swap = cbc_vector; 67 cbc_vector = tmp_vector; 68 tmp_vector = swap; 69 } 70 71 public void transformBlock(byte[] src, int srcoff, byte[] dst, int dstoff) 72 { 73 if (doEncrypt) 74 encryptBlock(src, srcoff, dst, dstoff); 75 else 76 decryptBlock(src, srcoff, dst, dstoff); 77 } 78 } 79 | Popular Tags |