본문 바로가기
FullStack/21. Java

[Java] AES-256 암호화

by nakanara 2021. 3. 12.
반응형

AES(Advanced Encryption Standard) 암호화는 대칭키를 쓰는 블록 암호화 방식이다.
암호화 Key에 값에 따라 AES-128, AES-192, AES-256으로 생성된다.

secretKey키의 길이에 따라서 AES-256, 24bit일 경우 AES-192, 16bit의 경우 AES-128로 암화화 되므로 주의해야 한다.입력을 받은 값으로 암호화를 할 경우 해당 자리수만큼의 값을 채우거나, 제거하는 방법 필요

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class AES256 {

    final String secretKey = "01234567890123456789012345678912"; //32bit
    final byte[] IV = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00 }; // 16bit

    //암호화
    public String encrypt(String str) throws Exception {

        byte[] keyData = secretKey.getBytes();

        SecretKey secureKey = new SecretKeySpec(keyData, "AES");

        Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
        c.init(Cipher.ENCRYPT_MODE, secureKey, new IvParameterSpec(IV));

        byte[] encrypted = c.doFinal(str.getBytes("UTF-8"));
        String enStr = new String(Base64.encodeBase64(encrypted));

        return enStr;
    }

    //복호화
    public String decrypt(String str) throws Exception {

        byte[] keyData = secretKey.getBytes();

        SecretKey secureKey = new SecretKeySpec(keyData, "AES");
        Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
        c.init(Cipher.DECRYPT_MODE, secureKey, new IvParameterSpec(IV));

        byte[] byteStr = Base64.decodeBase64(str.getBytes());

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

참고 AESConstants 에 설정된 KeySIZE, 길이가 틀린 경우 Key길이 오류 발생

com.sun.crypto.provider.AESConstants

package com.sun.crypto.provider;

interface AESConstants {
    int AES_BLOCK_SIZE = 16;
    int[] AES_KEYSIZES = new int[]{16, 24, 32};
}

참고

#aes #aes-256 #java

반응형