블로피시(Blowfish) 알고리즘이란?
블로피시(Blowfish)는 1993년 12월 브루스 슈나이어(Bruce Schneier)가 개발한 대칭 키 블록 암호 알고리즘으로, 기존의 DES나 IDEA를 대체할 목적으로 설계되었습니다. 가장 널리 알려진 파이스텔(Feistel) 네트워크 기반 암호 중 하나이며, 64비트 블록 크기와 32비트에서 448비트까지의 가변 키 길이를 지원합니다. 알고리즘은 크게 키 확장(key-expansion) 부분과 데이터 암호화(data-encryption) 부분으로 구성됩니다.
블로피시는 최대 448비트 길이의 키를 여러 하위 키(서브키) 배열로 변환하며, 그 총합은 1,042개의 32비트 값, 즉 4,168바이트에 해당합니다. 이 알고리즘은 16라운드 파이스텔 구조를 채택하고 있으며, 키에 강하게 의존하는 S-박스를 활용해 16회의 반복 연산을 수행합니다.
모든 라운드는 키와 데이터에 의존하는 치환(substitution)과 키에 의존하는 순열(permutation)로 이루어져 있습니다. 32비트 워드 단위의 연산에는 덧셈과 XOR 연산이 사용됩니다. 내부 구조는 하나의 P-배열과 네 개의 32비트 S-박스로 구성되며, 입력값은 64비트 데이터 블록입니다.
하위 키 배열의 구조
블로피시는 매우 많은 수의 하위 키를 사용하며, 이 키들은 암호화 및 복호화가 시작되기 전에 모두 준비되어 있어야 합니다. 키 크기는 32비트에서 448비트 사이이며, 다시 말해 32비트 워드 단위로 1개에서 14개까지의 키 워드를 가질 수 있습니다.
1. 키 배열(K-array)
입력된 키는 다음과 같은 배열 형태로 저장됩니다.
K1, K2, …, Kn (단, 1 ≤ n ≤ 14)
2. P-배열(P-array)
P-배열은 18개의 32비트 하위 키로 구성됩니다.
P1, P2, …, P18
3. S-박스(S-box)
네 개의 32비트 S-박스가 사용되며, 각 S-박스는 256개의 엔트리를 포함합니다.
S1,0 ~ S1,255
S2,0 ~ S2,255
S3,0 ~ S3,255
S4,0 ~ S4,255
하위 키 생성 절차
- 키 준비: 입력 키를 32비트 워드 단위의 배열 K1, K2, …, Kn으로 나누어 저장합니다.
- P-배열 초기화: 먼저 P-배열을, 이어서 네 개의 S-박스를 고정 문자열(fixed string)로 초기화합니다.
- 원주율(π) 활용: P-배열과 네 개의 S-박스는 원주율 π의 16진수 자릿수 값으로 초기화됩니다.
- XOR 연산 적용: P-배열과 키 배열 K를 비트 단위 XOR 연산합니다. 이때 키 비트가 부족하면 K 배열의 워드를 순환적으로 재사용합니다. 예를 들어 P1은 키의 첫 32비트와, P2는 다음 32비트와 XOR 연산됩니다(P1 XOR 키 32비트, P2 XOR 키 32비트).
- 영 블록 암호화: 현재의 P-배열과 S-박스를 사용하여 모든 비트가 0인 64비트 블록을 표준 암호화 과정으로 암호화합니다.
- P1, P2 교체: 위 암호화 결과물로 P1과 P2의 값을 대체합니다.
- 연속 암호화: 이 출력값을 다시 현재의 P-박스와 S-박스로 암호화하여 그 결과로 P3와 P4를 교체합니다.
- 반복 수행: 위 과정을 P-배열의 모든 원소(P1~P18)가 교체될 때까지 반복한 뒤, 같은 방식으로 네 개의 S-박스 전체 엔트리도 차례대로 교체합니다.
이처럼 블로피시의 하위 키 생성은 원주율 기반 초기화, 키와의 XOR 연산, 그리고 반복적인 암호화 과정을 통해 이루어지며, 이러한 구조 덕분에 키 의존성이 매우 높은 견고한 암호 시스템을 구현할 수 있습니다.