복어(암호)

Blowfish (cipher)
복어
일반
디자이너브루스 슈나이어
초판1993
후계자투피시
암호 상세
키 사이즈32 ~ 448 비트
블록 크기64비트
구조.파이스텔 네트워크
라운드16
최고의 퍼블릭 암호 분석
복어 4발은 2차 미분 공격에 취약하다(Rijmen, 1997).[1] 약한 키의 경우 복어 14발은 의사 난수 치환과 구별할 수 있다(Vaudenay, 1996).

Blowfish는 Bruce Schneier가 1993년에 설계한 대칭키 블록 암호로 많은 암호 스위트 및 암호화 제품에 포함되어 있습니다.복어는 소프트웨어에서 우수한 암호화 속도를 제공하며, 현재까지 복어의 효과적인 암호 해독은 발견되지 않았습니다.그러나, AES(Advanced Encryption Standard)는 현재 더욱 주목을 받고 있으며, Schneier는 최신 애플리케이션에 [2]Twofish를 추천합니다.

Schneier는 노후화된 DES의 대안으로 다른 알고리즘과 관련된 문제와 제약이 없는 범용 알고리즘으로 Blowfish를 설계했습니다.Blowfish가 출시되었을 때, 다른 많은 디자인들은 특허에 의해 방해받거나 상업적이거나 정부 기밀이었다.슈나이어는 "복어는 특허가 없으며 모든 나라에서 그럴 것이다.이것에 의해, 이 알고리즘은 퍼블릭 도메인에 배치되어 [3]누구나 자유롭게 사용할 수 있습니다.」

이 설계의 주요 특징으로는 키에 의존하는 S박스 및 매우 복잡한스케줄이 있습니다.

알고리즘

복어는 64비트 블록사이즈와 32비트부터 448비트까지의 [3]가변키 길이를 가지고 있습니다.16라운드 Feistel 암호로 키 의존성이 큰S 박스를 사용합니다.구조상 고정 S박스를 사용하는 CAST-128과 유사합니다.

복어의 피스텔 구조

다음 그림은 Blowfish의 암호화 루틴을 보여줍니다.각 행은 32비트를 나타냅니다.5개의 서브키 배열이 있습니다.1개의 18엔트리의 P-array(평문과의 혼동을 피하기 위해 그림에서는 K로 표시)와 4개의 256엔트리의 S-box(S0, S1, S2 및 S3)입니다.

라운드 r은 4개의 액션으로 구성됩니다.

액션 1 r번째 P-array 엔트리를 사용하여 데이터의 왼쪽 절반(L)을 XOR합니다.
액션 2 XORed 데이터를 Blowfish의 F-function 입력으로 사용
액션 3 데이터의 오른쪽 절반(R)을 포함한 F-함수의 XOR 출력
액션 4 L과 R의 스왑

F-함수는 32비트 입력을 4개의 8비트 쿼터로 분할하고 해당 쿼터를 S-box 입력으로 사용합니다.S박스는 8비트 입력을 받아 32비트 출력을 생성합니다.출력은 모듈32 2와 XOR을 추가하여 최종 32비트 출력을 생성합니다(오른쪽 상단 [4]모서리의 이미지 참조).

16라운드 후 마지막 스왑을 취소하고 XOR L을 K18로, R을 K17로 되돌립니다(출력 화이트닝).

복호화는 P1, P2, ..., P18이 역순으로 사용되는 것을 제외하고 암호화와 동일합니다.xor는 가환적이고 연관성이 있기 때문에 이것은 그렇게 명백하지 않다.일반적인 오해는 암호 해독 알고리즘으로서 암호의 역순을 사용하는 것이다(즉, 우선 암호문 블록에 대한 XORing P17 및 P18, 그 후 역순의 P-엔트리를 사용한다).

Blowfish의 주요 일정은 명확한 패턴을 포함하지 않는 16진수 파이 자릿수에서 파생된 값으로 P-array와 S-box를 초기화하는 것으로 시작합니다(내 소매 번호에 대한 아무것도 참조).다음으로 개인키는 바이트 단위로 필요에 따라 모든 P 엔트리와 함께 XOR 처리됩니다.64비트 올제로 블록은 알고리즘 그대로 암호화됩니다.생성된 암호 텍스트가 P와2 P를1 대체합니다.그 후 동일한 암호문이 새로운 서브키와 함께 다시 암호화되고 새로운 암호문이 P와34 P를 대체합니다.P 어레이 전체와 모든 S박스 엔트리를 대체하여 계속됩니다.Blowfish 암호화 알고리즘은 모두 521회 실행되어 모든 서브키를 생성합니다.약 4KB의 데이터가 처리됩니다.

P 어레이의 길이는 576비트이며 초기화 중에 키바이트는 모두 576비트로 XOR되기 때문에 많은 구현에서 최대 576비트의 키사이즈가 지원됩니다.그 이유는 448비트 키를 사용하는 원래의 Blowfish 설명과 576비트 키를 사용하는 참조 구현의 차이가 있기 때문입니다.서드파티 구현을 검증하기 위한 테스트 벡터도 576비트 키를 사용하여 작성되었습니다.어떤 복어 버전이 올바른 것인지 묻자 브루스 슈나이어는 "시험 벡터는 하나의 진짜 복어를 결정하기 위해 사용되어야 한다"고 대답했다.

또 다른 의견은 P 배열의 마지막 4개의 값이 암호문의 모든 비트에 영향을 주지 않기 때문에 각 서브키의 모든 비트가 키의 [3]모든 비트에 의존하도록 하기 위해 448비트 제한이 존재한다는 것입니다.이 포인트는 라운드 수가 다른 실장에서는 고려해야 합니다.이는 철저한 공격에 대한 보안을 강화하지만 알고리즘에 의해 보장되는 보안을 약화시키기 때문입니다.또한 키를 변경할 때마다 암호 초기화가 느리기 때문에 448비트보다 긴 키 크기를 정당화하지 못하는 브루트 포스 공격으로부터 자연스럽게 보호됩니다.

가성 갑옷의 복어

uint32_t P[18]; uint32_t S[4][256];  uint32_t f (uint32_t x) {    uint32_t h = S[0][x >> 24] + S[1][x >> 16 & 0xff];    돌아가다 ( h ^ S[2][x >> 8 & 0xff] ) + S[3][x & 0xff]; }  무효 복어류(uint32_t *L, uint32_t *R) {     위해서 (짧다 r = 0; r < > 16; r++) {   *L = *L ^ P[r];   *R = f(*L) ^ *R;   바꾸다(L, R);  }  바꾸다(L, R);  *R = *R ^ P[16];  *L = *L ^ P[17]; }  무효 복어류(uint32_t *L, uint32_t *R) {  위해서 (짧다 r = 17; r > 1; r--) {   *L = *L ^ P[r];   *R = f(*L) ^ *R;   바꾸다(L, R);  }  바꾸다(L, R);  *R = *R ^ P[1];  *L = *L ^ P[0]; }    // ...   // pi에서 파생된 값으로 P-array 및 S-box 초기화(아래에서 찾을 수 있음)   // ...    {  /* 키를 사용하여 P 박스를 초기화합니다*  uint32_t k;  위해서 (짧다 i = 0, p = 0; i < > 18; i++) {   k = 0x00;   위해서 (짧다 j = 0; j < > 4; j++) {    k = (k << > 8)   (uint8_t) 열쇠[p];    p = (p + 1) % key_len;   }   P[i] ^= k;  }      /* 복어 키 확장 (521회 반복)*/  uint32_t l = 0x00, r = 0x00;  위해서 (짧다 i = 0; i < > 18; i+=2) {   복어류(&l, &r);   P[i] = l;    P[i+1] = r;  }  위해서 (짧다 i = 0; i < > 4; i++) {   위해서 (짧다 j = 0; j < > 256; j+=2) {    복어류(&l, &r);    S[i][j] = l;    S[i][j+1] = r;   }  } } 

연습 중인 복어

복어는 키를 바꿀 때를 제외하고 빠른 블록 암호입니다.각각의 새로운 키는 약 4킬로바이트의 텍스트를 암호화하는 것과 동등한 전처리를 필요로 합니다.이는 다른 블록 암호에 비해 매우 느린 속도입니다.이것에 의해, 특정의 애플리케이션에서는 사용할 수 없게 됩니다만, 다른 애플리케이션에서는 문제가 되지 않습니다.

한 어플리케이션에서는 Blowfish의 느린 키 변경이 실제로 장점입니다: OpenB에서 사용되는 패스워드 해시 방식(암호 $2, 즉 bcrypt)SD는 느린 키 스케줄을 사용하는 Blowfish에서 파생된 알고리즘을 사용합니다.따라서 추가 계산 작업이 사전 공격에 대한 보호를 제공합니다. 스트레칭을 참조하십시오.

복어의 메모리 용량은 4킬로바이트가 조금 넘습니다.이 제약은 오래된 데스크톱 및 노트북 컴퓨터에서도 문제가 되지 않지만 초기 스마트 카드와 같은 최소 임베디드 시스템에서는 사용할 수 없습니다.

복어는 특허가 적용되지 않은 최초의 보안 블록 암호 중 하나였기 때문에 누구나 자유롭게 사용할 수 있었다.이러한 이점은 암호화 소프트웨어에서의 인기에 기여했습니다.

bcrypt는 다양한 반복 횟수(작업 비용)와 조합하여 Blowfish의 고비용 키 설정 단계를 이용하여 해시 계산의 워크로드와 지속 시간을 증가시켜 무차별 포스 공격에 의한 위협을 더욱 감소시키는 패스워드 해시 함수입니다.

bcrypt는 Blowfish를 [5][6][7][8]구현하는 크로스 플랫폼 파일 암호화 유틸리티의 이름이기도 합니다.

약점 및 후계자

복어는 64비트 블록 크기를 사용합니다(예:AES의 128비트 블록 크기)는 특히 HTTPS와 같은 컨텍스트에서 생일 공격에 취약합니다. 2016년 SWEET32 공격은 64비트 블록 [9]크기의 암호에 대해 생일 공격을 사용하여 평문 복구(즉, 암호 해독)를 수행하는 방법을 시연했습니다.GnuPG 프로젝트는 Blowfish가 블록 크기가 [11]작기 때문에 4GB보다[10] 큰 파일을 암호화하는 데 사용하지 말 것을 권장합니다.

Blowfish의 축소된 변형은 반사적으로 약한 키에 대한 알려진 일반 텍스트 공격에 취약하다고 알려져 있습니다.복어 실장에서는 16라운드의 암호화를 사용하기 때문에 이 [12][13]공격에 취약하지 않습니다.

브루스 슈나이어는 그의 후계자인 투피쉬[2]이주를 추천했다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ Vincent Rijmen (1997). "Cryptanalysis and Design of Iterated Block Ciphers" (PostScript). Ph.D. Thesis. Archived from the original on 2013-05-08.
  2. ^ a b Dahna, McConnachie (2007-12-27). "Bruce Almighty: Schneier preaches security to Linux faithful". Computerworld. p. 3. Archived from the original on 2016-12-02. Retrieved 2018-01-26. At this point, though, I'm amazed it's still being used. If people ask, I recommend Twofish instead.
  3. ^ a b c Bruce Schneier (1993). "Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish)". Fast Software Encryption, Cambridge Security Workshop Proceedings. Springer-Verlag: 191–204. Archived from the original on 2014-01-26.
  4. ^ "Cryptography: Description of a New Variable-Length Key, 64-Bit Block Cipher (Blowfish)". Schneier on Security. Archived from the original on 2016-03-04. Retrieved 2015-12-31.
  5. ^ 'Bcrypt - Blowfish File Encryption' 2015-08-29 Wayback Machine bcrypt 파일 암호화 프로그램 홈페이지(bcrypt).sourceforge.net)
  6. ^ "bcrypt Free Download - whodunnit.tools.bcrypt". bcrypt463065.android.informer.com. Archived from the original on 4 March 2016. Retrieved 7 May 2018.
  7. ^ "T2 package - trunk - bcrypt - A utility to encrypt files". www.t2-project.org. Archived from the original on 21 April 2017. Retrieved 7 May 2018.
  8. ^ "Oracle GoldenGateのライセンス". docs.oracle.com. Archived from the original on 27 October 2017. Retrieved 7 May 2018.
  9. ^ Karthikeyan Bhargavan; Gaëtan Leurent (August 2016). "On the Practical (In-)Security of 64-bit Block Ciphers — Collision Attacks on HTTP over TLS and OpenVPN". ACM CCS 2016. Archived from the original on 2016-10-09.
  10. ^ "GnuPG Frequently Asked Questions". Archived from the original on 2017-12-21. Retrieved 2018-01-26. Blowfish should not be used to encrypt files larger than 4Gb in size, but Twofish has no such restrictions.
  11. ^ "GnuPG Frequently Asked Questions". Archived from the original on 2017-12-21. Retrieved 2018-01-27. For a cipher with an eight-byte block size, you’ll probably repeat a block after about 32 gigabytes of data. This means if you encrypt a single message larger than 32 gigabytes, it’s pretty much a statistical guarantee you’ll have a repeated block. That’s bad. For this reason, we recommend you not use ciphers with eight-byte data blocks if you’re going to be doing bulk encryption. It’s very unlikely you’ll have any problems if you keep your messages under 4 gigabytes in size.
  12. ^ Tom Gonzalez (January 2007). "A Reflection Attack on Blowfish" (PDF). Journal of LATEX Class Files. Archived from the original (PDF) on 2015-11-18. Retrieved 2015-11-17.
  13. ^ Orhun Kara & Cevat Manap (March 2007). "A New Class of Weak Keys for Blowfish" (PDF). FSE 2007. Archived (PDF) from the original on 2016-10-05.

외부 링크