본문 바로가기
  • 일하면서 배운 내용 끄적이는 블로그
Java

Cipher 클래스 - Java의 암호화 & 복호화 담당

by dhl7799 2024. 4. 24.

Cipher 클래스는 Java에서 암호화와 복호화를 담당한다

 

javax.crypto pakage에 위치해서 암호화 및 복호화 기능을 제공

 

JCE framework의 핵심을 구성

JCE란 Java Cryptography Extension : 자바 보안 기능의 핵심을 담당하는 Java Crpytography Architectur(JCA)의 일부분으로, 애플리케이션에서 데이터 암호화, 복호화 그리고 개인 데이터의 해싱을 제공한다.

 

사용법

 

암호화

// 암호화
public String aesEncode(String str) throws Exception{
        
    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
    c.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes()));
    byte[] encrypted = c.doFinal(str.getBytes(ENCODING_TYPE));
    String enStr = new String(Base64.encodeBase64(encrypted));
 
    return enStr;
}

 

복호화

//복호화
public String aesDecode(String str) throws Exception {
    	
    Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
    c.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv.getBytes(ENCODING_TYPE)));
    byte[] byteStr = Base64.decodeBase64(str.getBytes());
        
    return new String(c.doFinal(byteStr),ENCODING_TYPE);
}

 

1. 객체 인스턴스화

Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");

getInstance 메서드에 Cipher 객체를 AES 암호화, CBC operation mode, PKCS5 padding scheme로 초기화하라고 요청하는 코드

 

2. Key 생성

@PostConstruct
public void init() throws UnsupportedEncodingException{
    this.iv = AES_KEY.substring(0, 16);

    byte[] keyBytes = new byte[16];
    byte[] b = AES_KEY.getBytes(ENCODING_TYPE);
    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;
}

 

여기서 AES_KEY는 properties 파일에서 가져온 상수

 

Key 인터페이스는 암호화 작업들을 위한 키들을 나타낸다. Keys는 인코딩된 키, 키의 인코딩 포맷, 암호화 알고리즘을 포함하는 불투명한 컨테이너이다.

 

키는 일반적으로 키 팩토리를 사용하는 key generators, certificates, 또는 key specifications를 통해서 획득한다.

keyBytes로 부터 양방향 키를 생성

 

3. 초기화

Cipher 객체를 초기화하기 위해서 키 또는 증명서(Certificate)

그리고 Cipher의 작동 모드를 나타내는 opmode와 함께 init() 메서드를 호출한다

 

선택적으로 랜덤과 관련된 소스를 전달할 수 있음.

기본적으로 가장 높은 우선 순위로 설치된 provider의 SecureRandom 구현이 사용됨.

 

알고리즘 별 매개 변수 세트를 선택적으로 지정할 수도 있음.

해당 코드에서는 IvParameterSpec을 전달하여 초기화 벡터를 지정.

 

이용 가능한 cipher 작업 모드 목록

1. ENCRYPT_MODE: cipher 객체를 암호화 모드로 초기화한다.

2. DECRYPT_MODE: cipher 객체를 복호화 모드로 초기화한다.

3. WRAP_MODE: cipher 객체를 key-wrapping 모드로 초기화한다.

4. UNWRAP_MODE: cipher 객체를  key-unwrapping 모드로 초기화한다. 

 

4-1. 암호화

byte[] encrypted = c.doFinal(str.getBytes(ENCODING_TYPE))

암호화를 수행하는 부분.

주어진 문자열을 바이트 배열로 변환한 후, Cipher 객체의 doFinal 메서드를 사용하여 암호화/복호화 진행

 

String enStr = new String(Base64.encodeBase64(encrypted)): 암호화된 결과를 Base64로 인코딩하여 문자열로 변환

바이트 배열을 문자열로 변환

 

4-2. 복호화

byte[] byteStr = Base64.decodeBase64(str.getBytes()): Base64로 인코딩된 문자열을 바이트 배열로 디코딩하여 byteStr에 저장

return new String(c.doFinal(byteStr), ENCODING_TYPE): Cipher 객체의 doFinal 메서드를 사용하여 복호화를 진행

그 결과를 지정된 문자 인코딩(ENCODING_TYPE)으로 디코딩하여 반환

'Java' 카테고리의 다른 글

Try-Catch 자동 close  (0) 2024.02.26
URI, URL, ContentPath, RemoteAddr 출력  (0) 2024.02.22