package codeine.jsons.auth; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import codeine.utils.ExceptionUtils; import com.google.common.base.Charsets; public class EncryptionUtils{ private static byte[] encrypt(String key, String value) { byte[] raw = key.getBytes(Charsets.US_ASCII); if (raw.length != 16) { throw ExceptionUtils.asUnchecked(new IllegalArgumentException("Invalid key size.")); } SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16])); return cipher.doFinal(value.getBytes(Charsets.US_ASCII)); } catch (Exception e) { throw ExceptionUtils.asUnchecked(e); } } public static String encryptToken(String token, String secret) { return new String(new BASE64Encoder().encode(encrypt(secret, token))); } public static String decrypt(String secret, String encrypted) { byte[] raw = secret.getBytes(Charsets.US_ASCII); if (raw.length != 16) { throw ExceptionUtils.asUnchecked(new IllegalArgumentException("Invalid key size.")); } SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); try { Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(new byte[16])); byte[] original = cipher.doFinal(new BASE64Decoder().decodeBuffer(encrypted)); return new String(original, Charsets.US_ASCII); } catch (Exception e) { throw ExceptionUtils.asUnchecked(e); } } }