반응형
import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Component;

public class AES256 {
	//AES256은 256bit=32byte의 암호화 키가 필요함.
    private final String key = "1234567890123456789012"; 
    private final String iv = key.substring(0, 16); // 16byte의 초기화벡터값

//암호화메소드
    public String encrypt(String plainText) throws Exception {
    	//암호화 모드는 CBC를, 패딩은 PKCS5을 사용
        Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
        IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
        c.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec);

        byte[] encrypted = c.doFinal(plainText.getBytes("UTF-8"));
        //base64로 인코딩
        return String(Base64.encodeBase64(encrypted));
    }

//복호화메소드
    public String decrypt(String cipherText) throws Exception {
        Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
        IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
        c.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);

        byte[] decodedBytes = Base64.decodeBase64(cipherText);
        byte[] decrypted = c.doFinal(decodedBytes);
        return new String(decrypted, "UTF-8");
    }

}

 

* 패딩

암복호화 할 때 인풋이 암호 블럭 사이즈의 배수와 맞지 않는 경우 배수에 맞춰 빈공간을 채우는 것을 패딩이라고 함.

* IV

CBC모드에서 최초의 평문블록을 암호화 할 때 '한 단계 앞의 암호문블록' 역할을 할 비트열


패딩 참고

 

OKKY | PKCS#5 패딩과 PKCS#7 패딩의 차이점

암복호화 할 때 인풋이 암호 블럭 사이즈의 배수와 맞지 않으면 배수에 맞춰 빈공간을 채워주게 됩니다. 이 채워주는 방법을 패딩이라고 부르는데 여기서 PKCS#5와 PKCS#7의 차이를 설명하겠습니

okky.kr

 

반응형

+ Recent posts