암호 기법은 평문을 처리하는 방법에 따라서 스트림 암호와 블록 암호로 나뉜다.
스트림 암호는 난수를 1비트 단위로 생성하고 평문과 xor 연산을 해서 암호화를 진행한다.
스트림 암호가 1비트 단위로 암호화를 했다면 블록 암호는 여러 개의 비트로 이루어진 블록 단위로 암호화를 진행한다.
이번 포스팅에서는 블록 암호에 대해 알아보고 대표적인 DES에 대해 알아보려고 한다.
feistel cipher
feistel cipher는 블록 암호의 일종이고 알고리즘이 아니라 일종의 프레임워크이다.
대부분의 블록 암호는 feistel cipher를 따른다.
1. 평문을 같은 길이의 두 정보로 쪼갠다.
2. 라운드 i에서 사용하는 키를 K(i)라고 하고 라운드 함수를 F로 놓는다.
3. R0는 그대로 그 다음 단계로 넘어가는데 오른쪽이 아닌 왼쪽으로(L1) 보낸다.
4. R0와 K0를 사용하여 라운드 함수를 거친 값은 L0와 xor 연산을 해서 다음 단계로 넘어가는데 왼쪽이 아닌 오른쪽(R1)으로 보낸다.
이를 반복한다.
전체 과정을 그림으로 보면 아래와 같다.
이 구조를 요약하자면 서브 키 K(i)를 사용하여 R(i)에 라운드 함수 F를 적용한다.
그리고 그 값을 L(i)와 xor 연산을 해서 치환한다.
좌우 결과를 교환하여 전치한다.
이렇게 확산(diffusion)과 혼돈(confusion) 특성을 가진다.
DES (Data Encryption Standard)
DES 역시 위와 같은 feistel cipher 구조를 따른다.
DES의 one round 구조는 다음과 같다.
하나씩 살펴보자.
먼저 연산에 들어가기 전에 절반으로 나누고 R0에 expansion permutation 연산을 적용한다.
expansion permutation
64 비트를 반으로 나눈 32 비트를 48 비트로 늘린다.
이렇게 구한 값을 서브키 K(i)와 xor 연산을 적용한다.
S - boxes
xor 연산을 적용한 비트의 개수는 48개이다.
그리고 48비트가 S - boxes를 거쳐서 32비트가 되는 모습을 확인할 수 있다.
이 과정은 다음과 같이 총 8개의 S-box에 비트가 나누어서 들어간다.
6비트가 4비트로 바뀌는 S-box는 다음과 같은 테이블을 사용한다.
P - box
permutation을 의미하는 P-box는 32비트를 받아서 위치를 바꾼 후 같은 32 비트를 반환한다.
이렇게 구한 최종 적인 값을 원래의 L0와 xor 연산을 해서 그 다음 단계의 R1의 값이 된다. (L1은 R0 값 그대로 사용)
이것이 하나의 라운드에서의 연산이다.
다음은 DES에서 사용되는 값들이다.
블록 길이 | 64 bit |
키 길이 | 56 bit |
라운드 횟수 | 16 번 |
각각의 라운드 마다 쓰는 키(sub key) 길이 | 48 bit |
참고로 DES의 안정성은 주로 S-box에 달려있다.
DES key
이제 하나의 라운드에서 sub key가 만들어지는 과정을 살펴보자.
먼저 키를 반절로 나누어서 섞는다.
그리고 circular shift 연산을 적용한다.
위 그림은 한 칸씩 이동하는 shift 연산인데 각 라운드마다 이동하는 정도는 다르게 한다.
이후 압축하여 총 56비트를 48비트로 줄인다.
'공부 > 보안' 카테고리의 다른 글
[보안] SSL/TLS 인증서 발급 과정 및 인증 절차 (0) | 2023.10.30 |
---|---|
[보안] 대칭키, 비대칭키(공개키), 혼합 (0) | 2023.10.28 |
[정보 보안] 고전 암호 기법 (전치) (1) | 2023.10.17 |
[정보 보안] 고전 암호 기법 (치환) (0) | 2023.10.16 |
댓글