package se.alexanderblom.delicious.util; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import android.util.Base64; public class Crypto { private static final String CIPHER_TRANSFORMATION = "AES/ECB/PKCS7Padding"; private static final String CIPHER_ALGORITHM = "AES"; private SecretKeySpec keySpec; private Cipher cipher; public Crypto(String passphrase) { byte[] key = getKey(passphrase); keySpec = new SecretKeySpec(key, CIPHER_ALGORITHM); try { cipher = Cipher.getInstance(CIPHER_TRANSFORMATION, "BC"); } catch (Exception e) { throw new RuntimeException(e); } } public byte[] encryptAsBase64(byte[] input) { return Base64.encode(encrypt(input), 0); } public byte[] encrypt(byte[] input) { try { cipher.init(Cipher.ENCRYPT_MODE, keySpec); return cipher.doFinal(input); } catch (Exception e) { throw new RuntimeException(e); } } public byte[] decryptAsBase64(byte[] input) { return decrypt(Base64.decode(input, 0)); } public byte[] decrypt(byte[] input) { try { cipher.init(Cipher.DECRYPT_MODE, keySpec); return cipher.doFinal(input); } catch (Exception e) { throw new RuntimeException(e); } } private byte[] getKey(String passphrase) { try { KeyGenerator kgen = KeyGenerator.getInstance(CIPHER_ALGORITHM); SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); sr.setSeed(passphrase.getBytes()); kgen.init(128, sr); SecretKey skey = kgen.generateKey(); return skey.getEncoded(); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } }