CFBBlockCipherpublic class CFBBlockCipher extends Object implements org.bouncycastle.crypto.BlockCipherimplements a Cipher-FeedBack (CFB) mode on top of a simple cipher. |
Fields Summary |
---|
private byte[] | IV | private byte[] | cfbV | private byte[] | cfbOutV | private int | blockSize | private org.bouncycastle.crypto.BlockCipher | cipher | private boolean | encrypting |
Constructors Summary |
---|
public CFBBlockCipher(org.bouncycastle.crypto.BlockCipher cipher, int bitBlockSize)Basic constructor.
this.cipher = cipher;
this.blockSize = bitBlockSize / 8;
this.IV = new byte[cipher.getBlockSize()];
this.cfbV = new byte[cipher.getBlockSize()];
this.cfbOutV = new byte[cipher.getBlockSize()];
|
Methods Summary |
---|
public int | decryptBlock(byte[] in, int inOff, byte[] out, int outOff)Do the appropriate processing for CFB mode decryption.
if ((inOff + blockSize) > in.length)
{
throw new DataLengthException("input buffer too short");
}
if ((outOff + blockSize) > out.length)
{
throw new DataLengthException("output buffer too short");
}
cipher.processBlock(cfbV, 0, cfbOutV, 0);
//
// change over the input block.
//
System.arraycopy(cfbV, blockSize, cfbV, 0, cfbV.length - blockSize);
System.arraycopy(in, inOff, cfbV, cfbV.length - blockSize, blockSize);
//
// XOR the cfbV with the plaintext producing the plain text
//
for (int i = 0; i < blockSize; i++)
{
out[outOff + i] = (byte)(cfbOutV[i] ^ in[inOff + i]);
}
return blockSize;
| public int | encryptBlock(byte[] in, int inOff, byte[] out, int outOff)Do the appropriate processing for CFB mode encryption.
if ((inOff + blockSize) > in.length)
{
throw new DataLengthException("input buffer too short");
}
if ((outOff + blockSize) > out.length)
{
throw new DataLengthException("output buffer too short");
}
cipher.processBlock(cfbV, 0, cfbOutV, 0);
//
// XOR the cfbV with the plaintext producing the cipher text
//
for (int i = 0; i < blockSize; i++)
{
out[outOff + i] = (byte)(cfbOutV[i] ^ in[inOff + i]);
}
//
// change over the input block.
//
System.arraycopy(cfbV, blockSize, cfbV, 0, cfbV.length - blockSize);
System.arraycopy(out, outOff, cfbV, cfbV.length - blockSize, blockSize);
return blockSize;
| public java.lang.String | getAlgorithmName()return the algorithm name and mode.
return cipher.getAlgorithmName() + "/CFB" + (blockSize * 8);
| public int | getBlockSize()return the block size we are operating at.
return blockSize;
| public org.bouncycastle.crypto.BlockCipher | getUnderlyingCipher()return the underlying block cipher that we are wrapping.
return cipher;
| public void | init(boolean encrypting, org.bouncycastle.crypto.CipherParameters params)Initialise the cipher and, possibly, the initialisation vector (IV).
If an IV isn't passed as part of the parameter, the IV will be all zeros.
An IV which is too short is handled in FIPS compliant fashion.
this.encrypting = encrypting;
if (params instanceof ParametersWithIV)
{
ParametersWithIV ivParam = (ParametersWithIV)params;
byte[] iv = ivParam.getIV();
if (iv.length < IV.length)
{
// prepend the supplied IV with zeros (per FIPS PUB 81)
System.arraycopy(iv, 0, IV, IV.length - iv.length, iv.length);
for (int i = 0; i < IV.length - iv.length; i++)
{
IV[i] = 0;
}
}
else
{
System.arraycopy(iv, 0, IV, 0, IV.length);
}
reset();
cipher.init(true, ivParam.getParameters());
}
else
{
reset();
cipher.init(true, params);
}
| public int | processBlock(byte[] in, int inOff, byte[] out, int outOff)Process one block of input from the array in and write it to
the out array.
return (encrypting) ? encryptBlock(in, inOff, out, outOff) : decryptBlock(in, inOff, out, outOff);
| public void | reset()reset the chaining vector back to the IV and reset the underlying
cipher.
System.arraycopy(IV, 0, cfbV, 0, IV.length);
cipher.reset();
|
|