105 lines
3.1 KiB
Java
105 lines
3.1 KiB
Java
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;
|
|
}
|
|
}
|