Cipher 정의
- 자바의 암호화 & 복호화를 담당하는 클래스
*암호화 : 권한이 있는 유저들만 메세지를 이해하거나 접근할 수 있도록 메세지를 인코딩하는 과정을 말함
- javax.crypto package에 위치한 Cipher 클래스는 암호화 복호화 기능을 제공하며, JCE framework의 핵심을 구성
*Java Crpytography Architectur(JCA)의 일부분인 Java Cryptography Extension(JCE)는 어플리케이션에서 데이터 암호화, 복호화 그리고 개인 데이터의 해싱을 제공
encrypt 함수 생성
1. Cipher 객체 인스턴스화 하기
- Cipher 객체를 인스턴스화 하기 위해서는 static getInstance 메서드를 호출하고, 원하는 변환 형태의 이름을 전달
- 알고리즘/운용모드/패딩방식 : DESede/CBC/NoPadding 변환은 getInstance 메서드에서 Cipher 객체를 DESede 암호화, CBC operation mode, padding x 로 초기화하라고 요청
getInstance(알고리즘/운용모드/패딩방식)
- DESede : triple des
- 운용모드 👉 데이터 블록으로 나누어 처리하고 합치는 것, 그것이 암호화에서 운용모드가 하는 역할이다.
-
CBC : 원문 블록을 그대로 암호화하지 않고, 직전에 암호화된 블록과 XOR 연산을 한 다음에 암호화를 수행. 그렇기 때문에 같은 내용을 갖는 원문 블록이라도 전혀 다른 암호문을 갖게 됨. BUT! 첫번째 블록은 직전 암호문이 없으므로 XOR 연산 대상이 없다. 이를 위해 CBC 모드는 초기화 벡터(IV)를 입력 받는다. 초기화 벡터는 원문 블록을 XOR하는데 쓰이기 때문에 당연히 블록 사이즈와 동일한 크기여야 함.
CBC 모드는 직전 블록이 다음 블록의 암호화에 관여하므로 일부 블록만 복호화하고 싶어도 전체를 복호화 해야 한다. ECB는 일부 복호화 가능
-
ECB : 단순히 블록 단위로 처리한 결과를 이어붙이는 방법이다
ECB는 단순하지만 같은 값을 갖는 원문 블록은 같은 암호 블록을 출력하기 때문에 원문의 패턴이 그대로 드러남. 이는 암호문에서 원문을 유추할 수 있음을 의미하기 때문에 ECB는 확산의 성질을 달성 못함
2. Keys
- Key 인터페이스는 암호화 작업들을 위한 키들을 나타냄
- Keys는 인코딩된 키, 키의 인코딩 포맷, 암호화 알고리즘을 포함하는 불투명한 컨테이너다.
- SecretKeySpec (byte[] key, int offset, int len, String algorithm) : offset로 부터 시작되는 key 최초의 len 바이트를 사용해, 지정된 바이트 배열로부터 비밀키를 구축
- SecretKeySpec (byte[] key, String algorithm) : 지정된 바이트 배열로부터 비밀키를 구축
3. Cipher 초기화
- Cipher 객체를 초기화하기 위해서 키 또는 증명서 그리고 Cipher의 작동 모드를 나타내는 opmode와 함께 init() 메서드 호출 가능
- CBC 방식은 IvParameterSpec 객체를 생성해서 cipher.init() 할때 같이 초기화 시킨다.
- Cipher 작업 모드
1.ENCRYPT_MODE: cipher 객체를 암호화 모드로 초기화한다.
2.DECRYPT_MODE: cipher 객체를 복호화 모드로 초기화한다.
3.WRAP_MODE: cipher 객체를 key-wrapping 모드로 초기화한다.
4.UNWRAP_MODE: cipher 객체를 key-unwrapping 모드로 초기화한다.
4. Encrpytion/Decryption
- Encrpytion
- Decryption : Cipher 작업모드 👉 DECRYPT_MODE로 변경
5. doFinal()
- 이 암호의 초기화 방법에 따라 데이터가 암호화되거나 암호 해독
- 마무리 단계로, 단일 부품 작업에서 데이터를 암호화 또는 해독하거나 다중 부품 작업을 완료시키기
참조 : 1. https://scshim.tistory.com/305 | [Java] Cipher, 자바의 암호화&복호화를 담당하는 클래스 2. http://happinessoncode.com/2019/04/06/java-cipher-algorithm-mode-padding/ | Java Cipher - 알고리즘, 운용 모드, 패딩의 이해 | APRIL 6, 2019