AES-256 양방향 암호화

떡ol·2022년 10월 23일
0

1. AES-256란?

'AES(Advanced Encryption Standard) 고급 암호화 표준'

AES는 암호화 및 복호화에 동일한 키를 사용하는 대칭키 알고리즘으로 높은 안전성과 빠른 속도로 인해 양방향 암호화에서 가장 많이 사용되는 방식이며, AES 암호화의 종류는 AES-128, AES-192, AES-256이 있으며 뒤에 붙은 숫자는 키의 길이를 의미한다. AES의 종류가 무엇이냐에 따라 Secret Key의 길이가 달라진다.
(128bit = 16byte, 192bit = 24byte, 256bit = 32byte)

  • 대칭키(Symmetric Key)는 암호화하고 복호화 하는데 사용되는 키가 동일한 것임을 의미하며, 반대로 비대칭키(Asymmetric Key)는 암호화와 복호화에 각각 다른 키가 사용된다.

암호화 : 'plain text -> pain bytes -> encrypt -> encrypted bytes -> encrypted base64 test'
복호화 : 'encrypted base64 text -> encrypted bytes -> decrypt -> plain bytes -> plain text'

AES 암호화에는 아래 네가지가 필요하다.
SecretKey, IV(Initialize Vector), Cipher Mode(EBC/CBC/...), Padding Mode(PKCS5/PKCS7/...)

  • 알고리즘은 ("AES/CBC/PKCS5Padding" => AES, CBC operation mode, PKCS5 padding scheme으로 초기화된 Cipher 객체) 를 사용한다.

AES는 암호화 알고리즘을 말하며, CBC는 해당 알고리즘으로 문자를 어떻게 암호화할건지를 말한다, 한글자씩 잘라서 할 수도있고, 문자전체를 암호화할 수도 있고 다양하다 CBC는 XOR연산을 통해 이전 암호문과 연산하는 방식이다. PKCS5는 padding 환경을 설정하는 것으로 블록암호는 단위로 나워져있기 때문에 전체글자를 암호화 하고 남은 글자에 공백? 등 의미없는 글자로 채워넣어서 오류가 안나게 해결해준다.

암호화 형식, 운영 모드, 패딩등 자세한건 검색해보자
암호화 : 알고리즘
운영 모드 : 적용 방식
패딩 : 남은 글자수에 채워넣기
  • Key와 IV(Initialize Vector), 초기화 벡터를 지정하여 암호화 복호화 기능을 사용가능하다.
    Key와 iv값은 지정된 자리수만큼 랜덤하게 사용하면 된다. 이 값 두가지가 노출되면 큰일 난다.
    key와 iv를 두가지를 관리하기 귀찮다면 key 32byte를 16byte로 잘라서 사용하기도 한다.

key = abcdefghabcdefghabcdefghabcdefgh --> iv = abcdefghabcdefgh

2. 사용법

@Component
public class Crypto {

	public static String alg = "AES/CBC/PKCS5Padding";
	private final String key = "abcdefghabcdefghabcdefghabcdefgh"; // 32byte
	private String iv = "AD80FJK2I3DNN3FM"; // 16byte
	
	public String encrypt(String value) {
		try {
			Cipher cipher = Cipher.getInstance(alg);
			SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
			IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
			cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParamSpec);
			
			byte[] encrypted = cipher.doFinal(value.getBytes("UTF-8"));
			
			return Base64.getEncoder().encodeToString(encrypted);
		} catch (Exception e) {
			e.printStackTrace();
			return "error";
		}

		
	}
	
	public String decrypt(String value)  {
		try {
			Cipher cipher = Cipher.getInstance(alg);
			SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(),"AES");
			IvParameterSpec ivParamSpec = new IvParameterSpec(iv.getBytes());
			cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParamSpec);
			
			byte[] decodedByte = Base64.getDecoder().decode(value);
			byte[] decrypted = cipher.doFinal(decodedByte);
			return new String (decrypted,"UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
			return "error";
		}
	}



참고자료들___
(참고) Java AES-256 양방향 암호화 제대로 알고 사용하기

profile
하이

0개의 댓글