Cipher
java 에서 암복호화에 사용하여는 클래스
암호화
- 권한이 있는 사용자만 메세지를 이해하거나 접근할 수 있도록하는 것
- 즉, 원문 메세지를 권한이 없는 사람들은 못 읽게한다.
Cipher 사용
Cipher cipher = Cipher.getInstance("AES/CBC/PKCSSPadding", Providername (선택) );
암호화 알고리즘
- 단방향 알고리즘 : 암호문을 평문으로 되돌리는 복호화가 불가능하다.
=> 해시 기법 (SHA-256, MD-5)
- 비대칭키 알고리즘 : 암복호화에 사용하는 키가 서로 다르고, 두 개의 키중 하나의 키는 반드시 공개되어야해서 공개키 방식이라고도 부른다.
=> RSA
- 대칭키 알고리즘 : 암복호화에 사용하는 키가 서로같다.
=> AES
운용 방식
- 특정 비트 수의 집합을 일정 크기의 블록 단위로 구성하여 처리하는 암호 기법을 블록 암호화
- 블록을 어떻게 암호화 할지 정해야하는데 이 블록들의 암호화 방식을 운용 방식이라 한다.
패딩
- AES나 DES와 같은 브록 암호 알고리즘은 평문의 길이가 해당 암호의 블록크기의 배수로 정확하게 떨어져야한다.
- 이 마지막 블록의 빈 공간을 채우는 것을 패딩이라한다.
SecretKey
SecretKey secretKey = new SecretKeySpec(keyBytes, "AES");
- 암호화 작업들을 위한 키
- keys는 인코딩된 키, 키의 인코딩 포맷, 암호화 알고리즘을 포함하는 불투명한 컨테이너
init
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKey secretKey = new SecretKeySpec(keyBytes, "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
- Cipher 객체 초기화 시 키 또는 증명서 그리고 Cipher의 작동 모드를 나타내는 Opmode와 함께 init() 메서드를 호출할 수 있다.
- cipher 작업 모드
- ENCRYPT_MODE : cipher 객체를 암호화 모드로 초기화한다.
- DECRYPT_MODE : cipher 객체를 복호화 모드로 초기화한다.
- WRAP_MODE : cipher 객체를 key-wrapping 모드로 초기화한다.
- UNWRAP_MODE : cipher 객체를 key-unwrapping 모드로 초기화한다.
- InvalidKeyException
doFinal
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
SecretKey secretKey = new SecretKeySpec(keyBytes, "AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return cipher.doFinl(message);
- Cipher 객체를 초기화한 후에 암호화 또는 복호화 작업을 위해서 doFinal() 메서드를 호출한다.
- 암호화 또는 복호화된 메세지를 포함한 Byte 배열을 반환한다.
Providers
Security.addProvider(new BouncyCastleProvider());
- BouncyCastle 인증된 암호화 라이브러리를 보안 공급자로 연결하고 새로운 알고리즘을 원할하게 추가할 수 있다.
- Provider 구현체는 보안 알고리즘 구현체 목록을 포함하고 있다.
- 특정 알고리즘의 인스턴스가 필요해지면 프로바이더 저장소에서 해당 알고리즘의 적합한 구현체 클래스를 찾아 클래스 인스턴스를 생성한다.
Refer
https://devjjsjjj.tistory.com/entry/Cipher-%EC%9E%90%EB%B0%94%EC%9D%98-%EC%95%94%ED%98%B8%ED%99%94%EB%B3%B5%ED%98%B8%ED%99%94%EB%A5%BC-%EB%8B%B4%EB%8B%B9%ED%95%98%EB%8A%94-%ED%81%B4%EB%9E%98%EC%8A%A4-1