블로피시
블로피시(blowfish)는 1993년 브루스 슈나이어(Bruce Schneier)가 데이터 암호화 표준(DES; Data Encryption Standard)의 대안으로 개발한 대칭키 알고리즘이다. 블로피시는 소프트웨어에서 양호한 암호화 속도를 제공한다.
개요
1993년 이전의 다른 암호 알고리즘은 사유 알고리즘이거나 정부와 산업체의 기밀 사항, 또는 특허를 가지고 있어서 일반인들과 개인이 사용하기에 용이란 일반 목적의 알고리즘이 존재하지 않았다. 이에 브루스 슈나이어는 일반 목적으로 사용가능한 블로피시 알고리즘을 개발했다. 블로피시는 비특허 알고리즘이기 때문에 퍼블릭 도메인에 속하며, 누구든 자유럽게 사용할 수 있다고 본인이 직접 밝혔다. 블로피시는 데이터 암호화 표준, 즉 DES와 국제 데이터 암호화 알고리즘을 대신하여 사용되는 암호화 알고리즘이다. 키의 길이는 32비트 내지 448비트의 가변 길이 키를 사용하는 비밀 키 블록 암호로, 키의 스케줄링이 복잡하여 S-box에 의존한다. 또, 블로피시는 현재까지도 비특허로써 모든 사용자에게 무료로 개방되어 있다. 미국 정부는 특별한 경우를 제외하면 40비트보다 큰 키를 사용하는 암호화 소프트웨어의 수출을 금지한다. 하지만 블로피시 알고리즘은 비특허이기 때문에 수출에 용이하다. 32비트 명령어 프로세서를 염두하며 설계되었고, DES보다 훨씬 빠르다. 소프트웨어에서 양호한 암호화 속도를 제공하지만 현재는 고급암호화 표준이 더 주목을 받고 있다.[1][2]
특징
장점
블로피시는 몇 가지 장점을 가지고 있다. 그중 하나는 32비트 마이크로 프로세스에서 1바이트 당 18클럭 사이클의 속도로 암호화하여 Khufu, RC5, DES, IDEA, Trip-DES와 비교했을 때, 그 속도가 매우 빠르다는 것이다. 간결성과 단순성 또한 블로피시의 장점이다. 블로피시는 5K 이내의 메모리에서 실행될 수 있으며, 간단한 구조는 구현이 쉽고 알고리즘의 강도 결정이 용이하다. 더불어 블로피시는 키의 길이가 가변적이어서 448비트 만큼 길어질 수 있으며 를 법으로 수행되는 단어의 덧셈 연산과 비트 XOR, 두 개의 기본 연산이 가능하다. 이외에도 비특허 공개 알고리즘이라는 점, 사전 공격을 방어할 수 있어 보안성이 뛰어난다는 점 등이 블로피시의 특징이자 장점으로 꼽히고 있다. 이러한 장점들을 바탕으로 블로피시는 각종 온라인 게임의 패킷 암호화, 패킷 복호화에 주로 사용된다.
블로피시 알고리즘은 과거에 기업이나 정부에서만 제한되는 것이 아니라 일반 목적으로 사용될 수 있도록 비특허 알고리즘으로 개발된 덕에 수출에 매우 용이하고 일반인들도 무료로 마음껏 사용할 수 있다는 장점이 있다. 또, 블로피시 알고리즘은 속도와 간결함, 키 사이즈 등에서 유연성을 갖고 있다. 블로피시는 가변길이 키 구조의 64비트 알고리즘으로서, 주로 암호화 부분과 키 확장 부분으로 구성되어 있다. 암호키는 18비트로 변환되며 키를 확장할 때는 32비트 서브키로 변환되어 P어레이로 저장된다. 데이터 암호화는 16라운드 파이스텔 네트워크를 경유하여 처리되기 때문에 키가 자동화 파일 암호처럼 자주 변하지 않는 응용에서 적용하는 편이 적합하다.
베나와 연구자들은 성능을 측정하기 위해 대칭 알고리즘인 DES, 3DES, AES, 블로피시 알고리즘을 구현했다. 결과를 에너지 소비와 실행 시간 측면에서 다른 대칭 알고리즘과 비교하여 블로피시가 월등하다는 내용이었다. 블로피시는 처리 시간과 자원 소비가 최적화되었으며, AES 알고리즘은 블록 사이즈의 증가로 프로세싱 능력과 시간이 더 필요했다. 3DES의 실행 시간은 3중 단계 암호화때문에 DES보다 더 오래 걸리는 결과가 나왔다.[2]
취약점
블로피시는 높은 보안 수준과 빠른 속도를 갖고 있기 때문에 스마트폰 플랫폼에도 매우 적합한 알고리즘이라고 할 수 있다. 블로피시를 파괴할 수 있는 공격은 아직 없다. 그러나 블로피시는 키가 자주 변경되지 않을 때 최적의 성능을 보여주기 때문에, 블로피시 암호의 초기화는 스마트폰의 저장장치인 EEPROM이나 FLSASHPROM에 저장되므로 외부의 공격자들이 스마트폰의 메모리에서 서브키들을 훔쳐 갈 수 있어 키를 쉽게 끄집어낼 수 있다. 이러한 문제를 극복하기 위해 블로피시 암호화 및 복호화 과정에서 몇 가지 수정이 필요하다.
적용
언어
데이터 암호화
구현
- 32비트 평문을 Parray의 첫 번째 구성 원소와 XOR 연산한다.
- 결과 값을 BlowFish_F 함수로 연산한다.
- 결과 값을 우측 값과 XOR 연산한다.
- 결과값을 좌측에 저장하고 1번의 연산값을 우측에 저장한다.
- 1~4의 과정을 16회에 걸쳐 반복한다.
- 좌측 연산값을 P 18번째 원소과 XOR 연산하고 좌측에 저장한다.
- 우측 연산값을 P 17번째 원소와 XOR 연산하고 우측에 저장한다.[3]
의사코드
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 }
각주
- ↑ 블로피시 위키백과 - https://ko.wikipedia.org/wiki/%EB%B8%94%EB%A1%9C%ED%94%BC%EC%8B%9C
- ↑ 2.0 2.1 조석팔, 〈[스마트폰 보안을 위한 통합된 타원곡선 암호와 블로피시 암호]〉, 《한국과학기술정보연구원》, 2016-06-21
- ↑ empty1234, 〈BlowFish에 관해서〉, 《티스토리》, 2010-04-25
참고자료
- 블로피시 위키백과 - https://ko.wikipedia.org/wiki/%EB%B8%94%EB%A1%9C%ED%94%BC%EC%8B%9C
- empty1234, 〈BlowFish에 관해서〉, 《티스토리》, 2010-04-25
- 조석팔, 〈[스마트폰 보안을 위한 통합된 타원곡선 암호와 블로피시 암호]〉, 《한국과학기술정보연구원》, 2016-06-21
같이 보기