package com.espressif.iot.esptouch.util; 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; public class EspAES { private static final String TRANSFORMATION_DEFAULT = "AES/ECB/PKCS5Padding"; private final byte[] mKey; private final byte[] mIV; private final String mTransformation; private Cipher mEncryptCipher; private Cipher mDecryptCipher; public EspAES(byte[] key) { this(key, null, TRANSFORMATION_DEFAULT); } public EspAES(byte[] key, String transformation) { this(key, null, transformation); } public EspAES(byte[] key, byte[] iv) { this(key, iv, TRANSFORMATION_DEFAULT); } public EspAES(byte[] key, byte[] iv, String transformation) { mKey = key; mIV = iv; mTransformation = transformation; mEncryptCipher = createEncryptCipher(); mDecryptCipher = createDecryptCipher(); } private Cipher createEncryptCipher() { try { Cipher cipher = Cipher.getInstance(mTransformation); SecretKeySpec secretKeySpec = new SecretKeySpec(mKey, "AES"); if (mIV == null) { cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); } else { IvParameterSpec parameterSpec = new IvParameterSpec(mIV); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, parameterSpec); } return cipher; } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException e) { e.printStackTrace(); } return null; } private Cipher createDecryptCipher() { try { Cipher cipher = Cipher.getInstance(mTransformation); SecretKeySpec secretKeySpec = new SecretKeySpec(mKey, "AES"); if (mIV == null) { cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); } else { IvParameterSpec parameterSpec = new IvParameterSpec(mIV); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, parameterSpec); } return cipher; } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException e) { e.printStackTrace(); } return null; } public byte[] encrypt(byte[] content) { try { return mEncryptCipher.doFinal(content); } catch (BadPaddingException | IllegalBlockSizeException e) { e.printStackTrace(); } return null; } public byte[] decrypt(byte[] content) { try { return mDecryptCipher.doFinal(content); } catch (BadPaddingException | IllegalBlockSizeException e) { e.printStackTrace(); } return null; } }