블로피시(Blowfish) 알고리즘이란?
블로피시(Blowfish)는 1993년 12월 브루스 슈나이어(Bruce Schneier)가 개발한 대칭형 블록 암호 알고리즘입니다. 이 알고리즘은 하드웨어 구현에 적합하고 효율적이며, 별도의 라이선스 없이 누구나 자유롭게 사용할 수 있다는 큰 장점을 가지고 있습니다. 블로피시의 기본 연산자는 테이블 조회(table lookup), 덧셈(addition), XOR 배타적 논리합으로 구성되며, 사용되는 테이블은 네 개의 S-박스(S-box)와 하나의 P-배열(P-array)로 이루어져 있습니다.
블로피시는 파이스텔(Feistel) 라운드 구조에 기반한 암호입니다. F 함수의 설계는 DES에서 사용된 원리를 단순화한 것으로, 동일한 수준의 보안성을 유지하면서 소프트웨어 환경에서 더 빠르고 효율적으로 동작하도록 만들어졌습니다.
블로피시는 64비트 대칭 블록 암호로, 32비트부터 448비트(14바이트)까지 가변 길이의 키를 필요로 합니다. 이 알고리즘은 64비트 평문을 64비트 암호문으로 안전하고 효과적으로 암호화하기 위해 고안되었습니다.
32비트 프로세서에서 정보를 암호화하고 복호화하는 데 걸리는 시간을 최소화하기 위해, 알고리즘에는 테이블 조회, 모듈러스(modulus), 덧셈, 비트별 XOR 연산이 채택되었습니다.
DES와의 차이점
DES와 마찬가지로 블로피시도 암호화 및 복호화를 위해 16라운드 파이스텔 네트워크를 사용합니다. 그러나 DES가 각 라운드마다 오른쪽 32비트만 변경하여 다음 라운드의 왼쪽 32비트로 전달하는 것과 달리, 블로피시는 매 라운드마다 데이터의 왼쪽 32비트와 오른쪽 32비트 모두를 교환합니다.
또한 블로피시는 왼쪽 32비트에 대해 F 함수로 변환되거나 다음 라운드의 오른쪽 32비트로 전달되기 전에 비트별 XOR 연산을 수행합니다.
16라운드가 모두 끝난 후에는 두 번의 XOR 연산과 스왑(swap) 연산이 추가로 수행됩니다. 이 과정은 DES에서 사용하는 순열(permutation) 함수와는 차별화되는 부분입니다.
암호화 과정
암호화 과정에는 두 가지 입력이 필요합니다. 하나는 평문인 이미지 데이터이고, 다른 하나는 암호화 키입니다. 이 방식에서는 원본 이미지 데이터의 비트 스트림이 블로피시 알고리즘의 블록 길이에 맞게 분할됩니다.
이미지 헤더는 암호화 대상에서 제외되며, 비트맵 픽셀 또는 배열은 파일 헤더 바로 다음부터 시작됩니다. 배열의 바이트 요소들은 왼쪽에서 오른쪽으로 행(row) 순서대로 저장되며, 각 행은 이미지의 한 스캔 라인을 나타냅니다. 이미지의 행들은 위에서 아래로 순차적으로 암호화됩니다.
복호화 과정
암호화된 이미지는 위에서 아래로 블로피시 알고리즘과 동일한 블록 길이로 분할됩니다. 첫 번째 블록이 복호화 함수에 입력되며, 암호화에 사용된 것과 동일한 키로 이미지를 복호화할 수 있습니다. 단, 서브키(subkey)의 적용 순서는 역순으로 진행됩니다. 복호화 과정은 이미지의 나머지 블록들에 대해 위에서 아래로 순차적으로 확장됩니다.
블로피시의 기본 알고리즘
블로피시의 기본 알고리즘 절차는 다음과 같습니다.
1. x를 두 개의 32비트 절반으로 분할합니다: xL, xR
2. i = 1부터 16까지 다음 연산을 반복합니다:
- xL = xL XOR Pi
- xR = F(xL) XOR xR
- xL과 xR을 서로 교환(swap)
16번째 라운드가 끝나면 마지막 스왑을 되돌리기 위해 xL과 xR을 다시 한 번 교환합니다. 그 후 암호문(ciphertext)은 xL과 xR의 연결(concatenation)이며, xR = xR XOR P17, xL = xL XOR P18 연산을 수행하여 최종 결과를 얻습니다.