package com.gustz.dove.cli.api.service.util;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
/**
* TODO: AES codec <br/>
*
* secret key length: 16b <br/>
* mode: ECB/CBC/PCBC/CTR/CTS/CFB/CFB8 to CFB128/OFB/OBF8 to OFB128 <br/>
* padding: Nopadding/PKCS5Padding/ISO10126Padding/
*
* @author ZHENFENG ZHANG
* @since [ Aug 15, 2015 ]
*/
public abstract class AESCodec {
private static final Charset CHARSET = Charset.forName("utf-8");
// algorithm
private static final String AES_ALGO_KEY = "AES";
private static final String MD5_ALGO_KEY = "MD5";
// cipher algorithm
private static final String CIPHER_ALGO = "AES/ECB/PKCS5Padding";
/**
* Encrypt
*
* @param seed
* @param data
* @return string encrypt data
* @throws Exception
*/
public static String encrypt(final String seed, String data) throws Exception {
return encrypt(seed, data, CHARSET);
}
/**
* Encrypt
*
* @param seed
* @param data
* @param charset
* @return string encrypt data
* @throws Exception
*/
public static String encrypt(final String seed, String data, Charset charset) throws Exception {
data = DatatypeConverter.printBase64Binary(data.getBytes(charset));
byte[] _byData = DatatypeConverter.parseBase64Binary(data);
// get keyt
byte[] keyt = getSecretKeyt(seed, charset);
//
Cipher cipher = Cipher.getInstance(CIPHER_ALGO);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyt, AES_ALGO_KEY));
// do
return DatatypeConverter.printBase64Binary(cipher.doFinal(_byData));
}
/**
* Decrypt
*
* @param seed
* @param data
* @return string decrypt data
* @throws Exception
*/
public static String decrypt(final String seed, String data) throws Exception {
return decrypt(seed, data, CHARSET);
}
/**
* Decrypt
*
* @param seed
* @param data
* @param charset
* @return string decrypt data
* @throws Exception
*/
public static String decrypt(final String seed, String data, Charset charset) throws Exception {
// get keyt
byte[] keyt = getSecretKeyt(seed, charset);
//
Cipher cipher = Cipher.getInstance(CIPHER_ALGO);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyt, AES_ALGO_KEY));
// do
byte[] _retVal = cipher.doFinal(DatatypeConverter.parseBase64Binary(data));
return new String(_retVal, charset);
}
/**
* Get secret keyt
*
* @param seed
* @param charset
* @return secret keyt
* @throws NoSuchAlgorithmException
*/
private static byte[] getSecretKeyt(final String seed, Charset charset) throws NoSuchAlgorithmException {
MessageDigest _md5 = MessageDigest.getInstance(MD5_ALGO_KEY);
_md5.update(seed.getBytes(charset));
//
return _md5.digest();
}
}