프로그래밍/android

[android] 안드로이드 AES256 암호화 복호화 (feat. java)

-샤리- 2020. 8. 11. 13:48

암호화 방식이 많이 있지만, 자주 사용하는 방식중에 하나인 AES256 이다.

 

[code]

public class AES256Util {

    private String iv;
    private Key keySpec;

    public AES256Util(String key) throws UnsupportedEncodingException {
        this.iv = key.substring(0, 16);

        byte[] keyBytes = new byte[16];
        byte[] b = key.getBytes("UTF-8");
        int len = b.length;
        if (len > keyBytes.length) {
            len = keyBytes.length;
        }
        System.arraycopy(b, 0, keyBytes, 0, len);
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");

        this.keySpec = keySpec;
    }


    // 암호화
    public String encode(String str) throws UnsupportedEncodingException,
            NoSuchAlgorithmException,
            NoSuchPaddingException,
            InvalidKeyException,
            InvalidAlgorithmParameterException,
            IllegalBlockSizeException,
            BadPaddingException {
        Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
        c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));

        byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));
        String enStr = new String(Base64.encodeToString(encrypted, 0));
        return enStr;
    }

    //복호화
    public String decode(String str) throws UnsupportedEncodingException,
            NoSuchAlgorithmException,
            NoSuchPaddingException,
            InvalidKeyException,
            InvalidAlgorithmParameterException,
            IllegalBlockSizeException,
            BadPaddingException {
        Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
        c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes("UTF-8")));

        byte[] byteStr = Base64.decode(str.getBytes(), 0);

        return new String(c.doFinal(byteStr),"UTF-8");
    }
}

 

 

[사용 예]

var aes = AES256Util("16자리_문자열의_your_secret_key")
var encStr = aes.encode("123456")
var decStr = aes.decode(encStr)

 

[주의사항]

 

여기서 주의할 점은 "key값"이 고정되어 있으면 같은 값이 나오기 때문에 실무에 사용할 때에는 암호화 할 때마다 "key"값을 바꿔주어야 한다는 것이다. 어려운 코드 아니니 그냥 긁어다가 쉽게 사용하도록 하자.