org.protempa.dest.deid.CipherEncryption Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of protempa-framework Show documentation
Show all versions of protempa-framework Show documentation
Protempa Framework is the core of Protempa.
package org.protempa.dest.deid;
/*
* #%L
* Protempa Framework
* %%
* Copyright (C) 2012 - 2015 Emory University
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import org.apache.commons.codec.binary.Base64;
/**
* Utility class for encrypting and decrypting strings. Uses the
* DES/ECB/PKCS5Padding cipher transformation, which supports a key size of up
* to 56 bytes.
*
* @author Andrew Post
*/
public class CipherEncryption implements Encryption {
private Cipher encryptCipher;
private Cipher decryptCipher;
private final CipherDeidConfig deidConfig;
private final KeyGenerator keygen;
public CipherEncryption(CipherDeidConfig deidConfig) throws EncryptionInitException {
if (deidConfig == null) {
throw new IllegalArgumentException("deidConfig cannot be null");
}
this.deidConfig = deidConfig;
try {
this.keygen = KeyGenerator.getInstance(this.deidConfig.getKeyAlgorithm());
} catch (NoSuchAlgorithmException ex) {
throw new EncryptionInitException(ex);
}
;
}
private void initCiphers() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
synchronized (this.keygen) {
if (this.encryptCipher == null) {
Key key = this.keygen.generateKey();
this.encryptCipher = Cipher.getInstance(this.deidConfig.getCipherAlgorithm());
this.encryptCipher.init(Cipher.ENCRYPT_MODE, key);
this.decryptCipher = Cipher.getInstance(this.deidConfig.getCipherAlgorithm());
this.decryptCipher.init(Cipher.DECRYPT_MODE, key);
}
}
}
/**
* Encrypts the provided string. This method applies the
* DES/ECB/PKCS5Padding cipher and outputs the encrypted data as a hex
* string. If an exception is thrown, this instance may no longer be usable.
*
* @param str the string to encrypt.
* @return the encrypted data as a hex string, or null
if the
* provided string is null
.
*
* @throws IllegalBlockSizeException if the provided string cannot be
* encrypted.
*/
@Override
public String encrypt(String keyId, String str) throws EncryptException {
if (str == null) {
return null;
}
try {
initCiphers();
byte[] cleartext = str.getBytes("UTF-8");
byte[] ciphertext = this.encryptCipher.doFinal(cleartext);
return Base64.encodeBase64String(ciphertext);
} catch (InvalidKeyException ex) {
throw new AssertionError(ex);
} catch (BadPaddingException | NoSuchPaddingException | IllegalBlockSizeException | NoSuchAlgorithmException ex) {
throw new EncryptException("Could not encrypt string", ex);
} catch (UnsupportedEncodingException ex) {
throw new AssertionError("UTF-8 should be supported but is not");
}
}
/**
* Decrypts the provided hex string. This method converts a hex string to a
* byte array and passes the array to a decryption cipher. If an exception
* is thrown, this instance may no longer be usable.
*
* @param str the hex string to encrypt.
* @return the encrypted version of the string, or null
if the
* provided string is null
.
*
* @throws BadPaddingException if the provided string lacks padding.
* @throws IllegalBlockSizeException if the provided string otherwise cannot
* be decrypted.
*/
String decrypt(String str) throws DecryptException {
if (str == null) {
return null;
}
try {
initCiphers();
byte[] ciphertext = Base64.decodeBase64(str);
byte[] cleartext = this.decryptCipher.doFinal(ciphertext);
return new String(cleartext);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException ex) {
throw new DecryptException(ex);
} catch (InvalidKeyException ex) {
throw new AssertionError(ex);
}
}
}