01: // StreamCipher - a stream encryption template
02: //
03: // Copyright (C) 1996 by Jef Poskanzer <jef@acme.com>. All rights reserved.
04: //
05: // Redistribution and use in source and binary forms, with or without
06: // modification, are permitted provided that the following conditions
07: // are met:
08: // 1. Redistributions of source code must retain the above copyright
09: // notice, this list of conditions and the following disclaimer.
10: // 2. Redistributions in binary form must reproduce the above copyright
11: // notice, this list of conditions and the following disclaimer in the
12: // documentation and/or other materials provided with the distribution.
13: //
14: // THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15: // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16: // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17: // ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18: // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19: // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20: // OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21: // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22: // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23: // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24: // SUCH DAMAGE.
25: //
26: // Visit the ACME Labs Java page for up-to-date versions of this and other
27: // fine Java utilities: http://www.acme.com/java/
28:
29: package Acme.Crypto;
30:
31: import java.io.*;
32:
33: /// A stream encryption template.
34: // <P>
35: // <A HREF="/resources/classes/Acme/Crypto/StreamCipher.java">Fetch the software.</A><BR>
36: // <A HREF="/resources/classes/Acme.tar.gz">Fetch the entire Acme package.</A>
37: // <P>
38: // @see Cipher
39: // @see BlockCipher
40: // @see EncryptedOutputStream
41: // @see EncryptedInputStream
42: // @see Rc4Cipher
43:
44: public abstract class StreamCipher extends Cipher {
45:
46: /// Constructor.
47: public StreamCipher(int keySize) {
48: super (keySize);
49: }
50:
51: /// Encrypt a byte.
52: public abstract byte encrypt(byte clearText);
53:
54: /// Decrypt a byte.
55: public abstract byte decrypt(byte cipherText);
56:
57: /// Encrypt an array of bytes.
58: public void encrypt(byte[] clearText, byte[] cipherText) {
59: encrypt(clearText, 0, cipherText, 0, clearText.length);
60: }
61:
62: /// Decrypt an array of bytes.
63: public void decrypt(byte[] cipherText, byte[] clearText) {
64: decrypt(cipherText, 0, clearText, 0, cipherText.length);
65: }
66:
67: /// Encrypt some bytes.
68: // The default implementation just calls encrypt(byte) repeatedly.
69: // This can be overridden for speed.
70: public void encrypt(byte[] clearText, int clearOff,
71: byte[] cipherText, int cipherOff, int len) {
72: for (int i = 0; i < len; ++i)
73: cipherText[cipherOff + i] = encrypt(clearText[clearOff + i]);
74: }
75:
76: /// Decrypt some bytes.
77: // The default implementation just calls decrypt(byte) repeatedly.
78: // This can be overridden for speed.
79: public void decrypt(byte[] cipherText, int cipherOff,
80: byte[] clearText, int clearOff, int len) {
81: for (int i = 0; i < len; ++i)
82: clearText[clearOff + i] = decrypt(cipherText[cipherOff + i]);
83: }
84:
85: }
|