1 29 package Acme.Crypto; 30 31 import java.io.*; 32 33 59 public class CbcBlockCipher extends BlockCipher 60 { 61 62 private BlockCipher blockCipher; 63 private byte[] iv; 64 private byte[] temp; 65 66 public CbcBlockCipher( BlockCipher blockCipher ) 68 { 69 super( blockCipher.keySize(), blockCipher.blockSize() ); 70 this.blockCipher = blockCipher; 71 iv = new byte[blockSize()]; 72 zeroBlock( iv ); 73 temp = new byte[blockSize()]; 74 } 75 76 77 79 public void setKey( byte[] key ) 81 { 82 blockCipher.setKey( key ); 83 } 84 85 86 88 public void setIv( byte[] iv ) 90 { 91 copyBlock( iv, this.iv ); 92 } 93 94 public byte[] setRandomIv() 99 { 100 byte[] riv = new byte[blockSize()]; 101 randomBlock( riv ); 102 setIv( riv ); 103 return riv; 104 } 105 106 107 109 public void encrypt( byte[] clearText, int clearOff, byte[] cipherText, int cipherOff ) 111 { 112 xorBlock( clearText, clearOff, iv, 0, temp, 0, blockSize ); 113 blockCipher.encrypt( temp, 0, cipherText, cipherOff ); 114 copyBlock( cipherText, cipherOff, iv, 0, blockSize ); 115 } 116 117 public void decrypt( byte[] cipherText, int cipherOff, byte[] clearText, int clearOff ) 119 { 120 blockCipher.decrypt( cipherText, cipherOff, temp, 0 ); 121 xorBlock( temp, 0, iv, 0, clearText, clearOff, blockSize ); 122 copyBlock( cipherText, cipherOff, iv, 0, blockSize ); 123 } 124 125 } 126 | Popular Tags |