Interface Cipher


public interface Cipher

Cipher encapsulates a CipherStrategy and offers methods for:

  • encryption/decryption
  • key-generation
  • key conversion

Its main purpose is to simplify the complexity of the javax.crypto and java.security packages. Their many different free combinable pieces are put together in a few default CipherStrategys for typical use by SAPERION and all methods are centralized in this Cipher. This results in a simple-to-use practical API, on the cost of some method-signatures looking a bit weird and some methods not working well with all CipherStrategys.

A Cipher is created using the CipherFactory and is based on a CipherStrategy and a KeyDerivationAlgorithm.

The CipherStrategy defines the encryption algorithm, block mode, padding type and key size to use and enumerates the few strategies used by SAPERION.

The KeyDerivationAlgorithm defines the algorithm of deriving a Key from a password and salt. This method only works for symmetric encryption algorithms. First create a salt, than get a key from a password and salt and remember the salt, f.e. together with the encrypted text or in a user-database together with the generated key. To decrypt the text or to test the password against the key use the same method again.

Use newKeys() to create a new pair of keys. If the encryption algorithm is asymmetric the first is the public key and the second is the private key. If the encryption algorithm is symmetric both keys are the same instance.

To export or store a Key use Key.getEncoded() and for an asymmetric encryption algorithm remember whether it is the public or private key (well in many circumstances this should be implicitly clear out of the location WHERE the key is stored or exported to/imported from). To restore such a Key again, use getKey(byte[], boolean).

To encrypt/decrypt binary data use encrypt(Key, byte[])/decrypt(Key, byte[]), or the streaming overrides encrypt(Key, InputStream, OutputStream)/decrypt(Key, InputStream, OutputStream).

For ease of use there are convenient methods for String-encryption/decryption (encrypt(Key, String)/ decrypt(Key, String)). The String to encrypt is first converted to a byte[] using a "UTF-8"-encoding, than encrypted and the result is converted to a hexadecimal representation. Decryption works vice versa.

The implementations are not synchronized. If used by different threads concurrently, external synchronization is necessary.

Author:
agz
See Also: