All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.weavechain.core.encrypt.AESFieldEncrypt Maven / Gradle / Ivy

There is a newer version: 1.3
Show newest version
package com.weavechain.core.encrypt;

import com.weavechain.core.data.ConvertUtils;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
import java.security.spec.KeySpec;
import java.util.Arrays;

public class AESFieldEncrypt extends FieldEncrypt {

    static final Logger logger = LoggerFactory.getLogger(AESFieldEncrypt.class);

    private static final String KEY_FACTORY = "PBKDF2WithHmacSHA256";

    private static final String ALGORITHM = "AES/GCM/NoPadding";

    private SecretKeySpec secretKey;

    private Cipher cipher;

    @Override
    public void init(String key, String salt) {
        try {
            SecretKeyFactory factory = SecretKeyFactory.getInstance(KEY_FACTORY);
            KeySpec spec = new PBEKeySpec(key.toCharArray(), salt.getBytes(), 65536, 256);
            SecretKey tmp = factory.generateSecret(spec);
            secretKey = new SecretKeySpec(tmp.getEncoded(), "AES");
            cipher = Cipher.getInstance(ALGORITHM);
        } catch (Exception e) {
            logger.error("Failed encryptor initialization");
        }
    }

    @Override
    public Object encrypt(Object value) {
        if (value != null) {
            try {
                byte[] iv = KeysProvider.generateIV();
                IvParameterSpec ivspec = new IvParameterSpec(iv);

                cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivspec);
                byte[] enc = cipher.doFinal(ConvertUtils.convertToString(value).getBytes(StandardCharsets.UTF_8));

                ByteArrayOutputStream output = new ByteArrayOutputStream();
                output.write(iv);
                output.write(enc);

                return Base64.encodeBase64String(output.toByteArray());
            } catch (Exception e) {
                logger.error("Failed encryption", e);
            }
        }
        return null;
    }

    @Override
    public Object decrypt(Object value) {
        if (value != null) {
            try {
                byte[] input = Base64.decodeBase64(ConvertUtils.convertToString(value).getBytes(StandardCharsets.UTF_8));

                byte[] iv = Arrays.copyOfRange(input, 0, 16);
                IvParameterSpec ivspec = new IvParameterSpec(iv);

                cipher.init(Cipher.DECRYPT_MODE, secretKey, ivspec);
                byte[] enc =  Arrays.copyOfRange(input, 16, input.length);
                return new String(cipher.doFinal(enc), StandardCharsets.UTF_8);
            } catch (Exception e) {
                logger.error("Failed decryption", e);
            }
        }
        return null;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy