블로피시
블로피시(blowfish)는 1993년 브루스 슈나이어(Bruce Schneier)가 데이터 암호화 표준(DES; Data Encryption Standard)의 대안으로 개발한 대칭키 알고리즘이다. 블로피시는 소프트웨어에서 양호한 암호화 속도를 제공한다.
개요
1993년 이전의 다른 암호 알고리즘은 사유 알고리즘이거나 정부, 산업체의 기밀 사항, 또는 특허를 가지고 있었기 때문에 당시 일반 목적의 알고리즘은 존재하지 않았다. 이에 브루스 슈나이어는 DES의 대안으로 다른 알고리즘에 관련된 제약 문제를 해결하기 위해 일반 목적의 알고리즘으로 블로피시를 설계했다. 그는 직접 블로피시는 비특허이기 때문에 퍼블릭 도메인에 속하며 누구든지 자유롭게 사용할 수 있다고 밝혔다. 블로피시는 4비트~ 최대 448비트의 가변 키 길이를 갖고 있고 키의 스케쥴링이 복잡하며 S 박스에 의존한다. 블로피시는 소프트웨어에서 양호한 암호화 속도를 제공하지만 현재는 고급암호화 표준이 더 많은 주목을 받고 있다.[1]
특징
장점
블로피시는 몇 가지 장점을 가지고 있다. 그중 하나는 32비트 마이크로 프로세스에서 1바이트 당 18클럭 사이클의 속도로 암호화하여 Khufu, RC5, DES, IDEA, Trip-DES와 비교했을 때, 그 속도가 매우 빠르다는 것이다. 간결성과 단순성 또한 블로피시의 장점이다. 블로피시는 5K 이내의 메모리에서 실행될 수 있으며, 간단한 구조는 구현이 쉽고 알고리즘의 강도 결정이 용이하다. 더불어 블로피시는 키의 길이가 가변적이어서 448비 만큼 길어질 수 있으며 2³²를 법으로 수행되는 단어의 덧셈 연산과 비트 XOR, 두 개의 기본 연산이 가능하다. 이외에도 비특허 공개 알고리즘이라는 점, 사전 공격을 방어할 수 있어 보안성이 뛰어난다는 점 등이 블로피시의 특징이자 장점으로 꼽히고 있다. 이러한 장점들을 바탕으로 블로피시는 각종 온라인 게임의 패킷 암호화, 패킷 복호화에 주로 사용된다.
취약점
구현
- 32비트 평문을 Parray의 첫 번째 구성 원소와 XOR 연산한다.
- 결과 값을 BlowFish_F 함수로 연산한다.
- 결과 값을 우측 값과 XOR 연산한다.
- 결과값을 좌측에 저장하고 1번의 연산값을 우측에 저장한다.
- 1~4의 과정을 16회에 걸쳐 반복한다.
- 좌측 연산값을 P 18번째 원소과 XOR 연산하고 좌측에 저장한다.
- 우측 연산값을 P 17번째 원소와 XOR 연산하고 우측에 저장한다.[2]
의사코드
01 uint32_t P[18]; 02 uint32_t S[4][256]; 03 04 uint32_t f (uint32_t x) { 05 uint32_t h = S[0][x >> 24] + S[1][x >> 16 & 0xff]; 06 return ( h ^ S[2][x >> 8 & 0xff] ) + S[3][x & 0xff]; 07 } 08 09 void encrypt (uint32_t & L, uint32_t & R) { 10 for (int i=0 ; i<16 ; i += 2) { 11 L ^= P[i]; 12 R ^= f(L); 13 R ^= P[i+1]; 14 L ^= f(R); 15 } 16 L ^= P[16]; 17 R ^= P[17]; 18 swap (L, R); 19 } 20 21 void decrypt (uint32_t & L, uint32_t & R) { 22 for (int i=16 ; i > 0 ; i -= 2) { 22 L ^= P[i+1]; 23 R ^= f(L); 24 R ^= P[i]; 25 L ^= f(R); 26 } 27 L ^= P[1]; 28 R ^= P[0]; 29 swap (L, R); 30 } 31 32 // ... 33 // initializing the P-array and S-boxes with values derived from pi; omitted in the example 34 // ... 35 { 36 for (int i=0 ; i<18 ; ++i) 37 P[i] ^= key[i % keylen]; 38 uint32_t L = 0, R = 0; 39 for (int i=0 ; i<18 ; i+=2) { 40 encrypt (L, R); 41 P[i] = L; P[i+1] = R; 42 } 43 for (int i=0 ; i<4 ; ++i) 44 for (int j=0 ; j<256; j+=2) { 45 encrypt (L, R); 46 S[i][j] = L; S[i][j+1] = R; 47 } 48 }
각주
- ↑ 〈블로피시〉, 《위키백과》
- ↑ empty1234, 〈BlowFish에 관해서〉, 《티스토리》, 2010-04-25
참고자료
- 〈블로피시〉, 《위키백과》
- empty1234, 〈BlowFish에 관해서〉, 《티스토리》, 2010-04-25
같이 보기