- HASH(단방향)
- 공개키(비대칭)
- 비밀키(대칭)
- Stream
- Block
1. HASH(단방향)
해시함수는 임의길이의 정보를 입력으로 받아, 고정된 길이의 암호문(해시값)을 출력하는 암호기술.
암호화된 정보는 복호화가 불가능한 특징을 가지고 있다. 따라서 해시함수를 이용하면 아래와 같이 비밀번호를 입력하여 (해시값)을 생성해 낼 수는 있지만, (해시값)을 가지고 원래의 비밀번호 를 알아낼 수는 없다. 즉, 개인정보처리자도 시스템에 저장된 암호문(해시값)을 가지고 원래의 사용자 비밀번호를 알 수 없기 때문에 안전한 비밀번호 관리가 가능해 진다.
=> 용도
1.메시지 인증용
2.키유도/난수생성용
3.단순 Hash/전자서명용.
3. 비밀키(대칭)
- 송신자는 수신자의 공개키를 구한다.
- 송신자는 수신자의 공개키로 평문을 암호화 한다.
- 송신자는 암호화된 메시지를 상대방에게 전달한다. 메시지는 암호화되어 있으므로 전달 도중에 유출되거나 도청되도 암호문으로부터 원문을 알아내기가 어렵다.
- 수신자는 자신의 비밀키로 암호화된 메시지를 해독하여 평문을 얻는다.
암호화에 사용할 대칭키(해당 세션에서만 사용하므로 세션 키 라고도 함.)를 상대방의 공개키로 암호화해서 안전하게 전달하는 용도로 사용
3.1. Stream
- 평문과 키를 바이트 단위로 XOR 연산
- 일대일 대응관계 => 공격에 취약 => 동일한 키 재사용 불가능
- 공격 감지능력 x => 무결성 보장 x
- DMB 등과 같은 실시간처리가 필요한 분야에 동일 키 재사용이 가능
3.2. Block
3.2.1. ECB
- 평문 블록(Ci)을 입력 블록(Ii)으로 설정하고, 이를 암호화한 출력 블록(Oi)을 암호문 블록(Pi)으로 설정한다.
- 암호화
- 입력 : 평문 데이터 + 비밀키
- 출력 : 암호문 데이터
- 처리과정 :
for i=1 to n
i번째 암호문 블록 = 비밀키를 이용한 암호화 함수(i번째 평문 블록)
- 복호화
- 입력 : 암호문 데이터 + 비밀키
- 출력 : 평문 데이터
- 처리과정 :
for i=1 to n
i번째 평문 블록 = 비밀키를 이용한 복호화 함수(i번째 암호문 블록)
3.2.2. CBC
CBC(Cipher Block Chaining) 모드는 동일한 평문 블록과 암호문 블록 쌍이 발생하지 않도록 전 단 계의 암․복호화 결과가 현 단계에 영향을 주는 운영모드이다
CBC 모드에서는 1 단계 앞에서 수행되어 결 과로 출력된 암호문 블록에 평문 블록을 XOR 하고 나서 암호화를 수행
「1 단계 앞의 암호문 블록」이 존재하지 않으 므로 「1단계 앞의 암호문 블록」을 대신할 비 트열 블록 준비 : IV
IV : 비밀키와 마찬가지로 송신자와 수신자간에 미 리 약속되어 있어야 하지만 공개된 값을 사용 해도 무방
암호화 때마다 다른 랜덤 비트열을 이용하는 것이 보통
순차적
암호화
- 입력 : 평문 데이터 + 비밀키 + IV (사용자가 지정하는 초기화 벡터)
- 출력 : 암호문 데이터
- 처리과정 :
i번째 암호문 블록 = 비밀키를 이용한 암호화 함수(①)
(i번째 평문 블록) XOR (전 단계의 암호문 블록) 〮 〮 〮 〮 〮 〮 〮 〮 〮 〮①
for i=1 to n
0번째 암호문 블록 = IV
- 복호화
- 입력 : 암호문 데이터 + 비밀키 + IV
- 출력 : 평문 데이터
- 처리과정 :
- 0번째 암호문 블록 = IV
for i=1 to n
비밀키를 이용한 복호화 함수(i번째 암호문 블록) 〮 〮 〮 〮 〮 〮 〮 〮①
i번째 평문 블록 = (i번째 암호문 블록) XOR ①
3.2.3. CTR
CTR(CounTeR) 모드는 각 단계에 따라 증가되는 카운트 블록을 입력 블록으로 사용하는 운영모드이다.
CTR 모드의 경우, 마지막 암호화 단계의 평문 블록이 128비트를 만족하지 못하고 m비트가 남아있을 때, 마지막 출력 블록128비트 중 상위 m비트 와 마지막 평 문 블록 m비트와 배타적 논리합 연산함으로 아래와 같은 패딩 방법을 적용하지 않을 수 있다.
카운터를 암호화한 비트열과 평문 블록과 의 XOR을 취한 결과가 암호문 블록이됨
병렬
카운터의 초기값은 암호화 때마다 다른 값 (nonce, 비표)을 기초로 해서 만든다.
암호화
- 입력 : 평문 데이터 + 비밀키 + 카운터
- 출력 : 암호문 데이터
- 처리과정 :
for i=1 to n
비밀키를 이용한 암호화 함수(카운터) 〮 〮 〮 〮 〮 〮 〮 〮①
i번째 암호문 블록 = (i번째 평문 블록) XOR ①
- 복호화
- 입력 : 암호문 데이터 + 비밀키 + 카운터
- 출력 : 평문 데이터
- 처리과정 :
for i=1 to n
비밀키를 이용한 암호화 함수(카운터) 〮 〮 〮 〮 〮 〮 〮 〮①
i번째 암호문 블록 = (i번째 암호문 블록) XOR ①
3.2.4. SEED
- Feistel 구조를 갖는 블록 암호알고리즘은 F 함수의 특성에 따라 구분될 수 있다.
- SEED의 F 함수는 수정된 64비트 Feistel 형태로 구성된다
- Feistel 구조란 각각 n/2비트인 L 0,R0 블록으로 이루어진 n비트 평문 블록 (L0 ,R0)이 r라운드( r≥1)를 거쳐 암호문 (Lr ,Rr)으로 변환되는 반복 구조이다.
- 모든 라운드가 끝난 후, 최종적으로 {\displaystyle (R_{n+1},L_{n+1})}가 암호화된 값이 된다.
- 공통 : 128비트 길이 블록단위로 처리
- 128 : 128비트의 암⋅복호화키
- 256 : 256비트의 암⋅복호화키
- Feistel 구조
i = 라운드 수
K i= 라운드 키
(L 0, R 0) =
암호화 하려는 정보를 2로 나눈 것
L i+1 = R i
R i+1 = L i XOR F (L 0, R 0)