1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
|
//******************************************************************************
//
// File: BlockCipher.java
// Package: edu.rit.crypto.blockcipher
// Unit: Class edu.rit.crypto.blockcipher.BlockCipher
//
// This Java source file is copyright (C) 2005 by Alan Kaminsky. All rights
// reserved. For further information, contact the author, Alan Kaminsky, at
// ark@cs.rit.edu.
//
// This Java source file is part of the Parallel Java Library ("PJ"). PJ is free
// software; you can redistribute it and/or modify it under the terms of the GNU
// General Public License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// PJ is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
// A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// Linking this library statically or dynamically with other modules is making a
// combined work based on this library. Thus, the terms and conditions of the
// GNU General Public License cover the whole combination.
//
// As a special exception, the copyright holders of this library give you
// permission to link this library with independent modules to produce an
// executable, regardless of the license terms of these independent modules, and
// to copy and distribute the resulting executable under terms of your choice,
// provided that you also meet, for each linked independent module, the terms
// and conditions of the license of that module. An independent module is a
// module which is not derived from or based on this library. If you modify this
// library, you may extend this exception to your version of the library, but
// you are not obligated to do so. If you do not wish to do so, delete this
// exception statement from your version.
//
// A copy of the GNU General Public License is provided in the file gpl.txt. You
// may also obtain a copy of the GNU General Public License on the World Wide
// Web at http://www.gnu.org/licenses/gpl.html.
//
//******************************************************************************
package edu.rit.crypto.blockcipher;
/**
* Class BlockCipher is the abstract base class for a block cipher. A block
* cipher object can encrypt a block of plaintext, yielding a block of
* ciphertext. (Decryption is defined in another class.) The encryption key is
* specified when the block cipher object is constructed and may also be
* specified by calling the <TT>setKey()</TT> method. A block cipher object can
* report the number of bytes in the block (the block length) and the number of
* bytes in the key (the key length).
* <P>
* The actual encryption algorithm is implemented in a subclass.
*
* @author Alan Kaminsky
* @version 06-Dec-2005
*/
public abstract class BlockCipher
{
// Hidden data members.
/**
* Block length (bytes).
*/
private int myBlockLength;
/**
* Key length (bytes).
*/
private int myKeyLength;
// Exported constructors.
/**
* Construct a new block cipher object.
*
* @param theBlockLength
* Number of bytes in the plaintext or ciphertext block.
* @param theKeyLength
* Number of bytes in the encryption key.
*
* @exception IllegalArgumentException
* (unchecked exception) Thrown if <TT>theBlockLength</TT> <= 0 or
* <TT>theKeyLength</TT> <= 0.
*/
public BlockCipher
(int theBlockLength,
int theKeyLength)
{
if (theBlockLength <= 0 || theKeyLength <= 0)
{
throw new IllegalArgumentException();
}
myBlockLength = theBlockLength;
myKeyLength = theKeyLength;
}
// Exported operations.
/**
* Determine the block length of this block cipher.
*
* @return Number of bytes in the plaintext or ciphertext block.
*/
public int getBlockLength()
{
return myBlockLength;
}
/**
* Determine the key length of this block cipher.
*
* @return Number of bytes in the key.
*/
public int getKeyLength()
{
return myKeyLength;
}
/**
* Set the key to be used for all subsequent encryptions and decryptions.
* After this method returns, <TT>theKey</TT> is no longer needed and may be
* erased (set to all 0s). The length of <TT>theKey</TT> must be at least
* <TT>getKeyLength()</TT>. Only the first <TT>getKeyLength()</TT> bytes are
* used.
* <P>
* A subclass must override this method to implement the key setting
* algorithm.
*
* @param theKey Key (byte array).
*
* @exception NullPointerException
* (unchecked exception) Thrown if <TT>theKey</TT> is null.
* @exception IllegalArgumentException
* (unchecked exception) Thrown if <TT>theKey.length</TT> <
* <TT>getKeyLength()</TT>.
*/
public abstract void setKey
(byte[] theKey);
/**
* Encrypt the given plaintext block in place. On input, <TT>theBlock</TT>
* contains the plaintext. On output, the contents of <TT>theBlock</TT> have
* been replaced by the ciphertext. The length of <TT>theBlock</TT> must be
* at least <TT>getBlockLength()</TT>. Only the first
* <TT>getBlockLength()</TT> bytes are encrypted.
* <P>
* This is a convenience method that simply calls <TT>encrypt (theBlock,
* theBlock)</TT>.
*
* @param theBlock Block to be encrypted.
*
* @exception NullPointerException
* (unchecked exception) Thrown if <TT>theBlock</TT> is null.
* @exception IllegalArgumentException
* (unchecked exception) Thrown if <TT>theBlock.length</TT> <
* <TT>getBlockLength()</TT>.
* @exception IllegalStateException
* (unchecked exception) Thrown if the key has been erased and not
* re-set.
*/
public void encrypt
(byte[] theBlock)
{
encrypt (theBlock, theBlock);
}
/**
* Encrypt the given plaintext block. On input, <TT>thePlaintext</TT>
* contains the plaintext. On output, the contents of <TT>theCiphertext</TT>
* have been replaced by the ciphertext. <TT>thePlaintext</TT> and
* <TT>theCiphertext</TT> may be the same block. The length of
* <TT>thePlaintext</TT> must be at least <TT>getBlockLength()</TT>. Only
* the first <TT>getBlockLength()</TT> bytes are read. The length of
* <TT>theCiphertext</TT> must be at least <TT>getBlockLength()</TT>. Only
* the first <TT>getBlockLength()</TT> bytes are written.
* <P>
* A subclass must override this method to implement the encryption
* algorithm.
*
* @param thePlaintext Input plaintext block to be encrypted.
* @param theCiphertext Output ciphertext block.
*
* @exception NullPointerException
* (unchecked exception) Thrown if <TT>thePlaintext</TT> is null or
* <TT>theCiphertext</TT> is null.
* @exception IllegalArgumentException
* (unchecked exception) Thrown if <TT>thePlaintext.length</TT> <
* <TT>getBlockLength()</TT> or <TT>theCiphertext.length</TT> <
* <TT>getBlockLength()</TT>.
* @exception IllegalStateException
* (unchecked exception) Thrown if the key has been erased and not
* re-set.
*/
public abstract void encrypt
(byte[] thePlaintext,
byte[] theCiphertext);
/**
* Erase this block cipher object's key material.
* <P>
* A subclass must override this method to set all of this block cipher
* object's key material to innocuous values (like 0). It is not acceptable
* merely to null out references to the key material, as that leaves the key
* material still stored in memory.
*/
public abstract void erase();
}
|