블레이크2B
블레이크2B(Blake2B)는 64비트 x64 혹은 ARM 아키텍처에서 MD5, SHA-1, SHA-2, SHA-3보다 빠른 암호화 해시함수이다.
개요[편집]
차차스트림(ChaCha stream) 암호에 기초하지만 입력 블록에 복사판 XORed는 차차(ChaCha) 라운드마다 앞에 추가된다. 단어 크기는 두 가지로 변형되는데, 8 단어의 해시값을 16개의 메시지 워드와 반복적으로 결합해 다음 해시값을 도출해낸다.
역사[편집]
블레이크(Blake)는 댄 버스타인(Dan Bernstein)의 차차스트림(ChaCha stream) 암호를 기반으로 하는 암호화 해시함수이다. 블레이크 알고리즘은 미국 표준기술연구소(NIST; National Institute of Standards and Technology) 해시 함수 경쟁에 장 필리프 오마송(Jean-Philippe Aumasson), 루카 헨젠(Luca Henzen), 윌리 마이어(Willi Meier), 레이펠 C.W(Raphael C.W)이 제출한 해시함수이다. 5명의 후보자로 구성된 최종 라운드에 진출했지만 2012년 SHA-3 알고리즘에 채택된 케착(Keccak)에 패배했다. 그후 2012년 블레이크(BLAKE)를 기반으로 업그레이드 버전인 블레이트2(BLAKE2)가 손상된 MD5, SHA-1 알고리즘을 대체하는 것을 목적으로 발표됐다.
블레이크2[편집]
블레이크2(BLAKE2)는 NEON이 활성화된 ARM을 포함해 64비트 플랫폼에 최적화되어 있으며 1~64 바이트의 다이제스트를 생성한다. 멀티 코어나 SIMD CPU에서 향상된 성능을 위해 설계된 4way 병렬 BLAKE2bp, 8way 병렬 BLAKE2sp를 포함한다. 키 해싱, 증분 트리 해싱 등에 대한 알고리즘을 제공한다. BLAKE2에는 BLAKE2x도 포함되어 있어 임의의 길이의 다이제스트를 생성할 수 있다. 초당 1기가 바이트, 바이트당 3.08 사이클의 처리가 가능하다.[1] keying, salting, personalization, 해시트리 모드(hash tree modes)를 지원한다.
알고리즘[편집]
- 초기화 벡터
BLAKE2b는 SHA-512에서 사용하는 IV와 동일한 초기화 벡터를 사용한다. 이 값들은 최초의 8개의 소수의 제곱근으로부터 처음의 64비트를 부분적으로 읽어들임으로써 얻어진다.
IV0 = 0x6a09e667f3bcc908 IV1 = 0xbb67ae8584caa73b IV2 = 0x3c6ef372fe94f82b IV3 = 0xa54ff53a5f1d36f1 IV4 = 0x510e527fade682d1 IV5 = 0x9b05688c2b3e6c1f IV6 = 0x1f83d9abfb41bd6b IV7 = 0x5be0cd19137e2179
다음은 BLAKE2B의 의사코드이다.
Algorithm BLAKE2b Input: M cbMessageLen: Number, (0..2^128) Key cbKeyLen: Number, (0..64) cbHashLen : Number, (1..64) Output: Hash 상태 벡터 h 를 IV로 초기화 ← IV 키 크기와 원하는 해시 길이를 h0에 혼합합니다. ← xor 0x0101kknn kk = 키 길이, nn = 해시 길이 cBytesCompressed ← 0 cBytesRemaining ← cbMessageLen if (cbKeyLen > 0) then M ← Pad(Key, 128) || M cBytesRemaining ← cBytesRemaining + 128 end if while (cBytesRemaining > 128) do chunk ← get next 128 bytes of message M cBytesCompressed ← cBytesCompressed + 128 cBytesRemaining ← cBytesRemaining - 128 h ← Compress(h, chunk, cBytesCompressed, false) end while hunk ← get next 128 bytes of message M cBytesCompressed ← cBytesCompressed+cBytesRemaining chunk ← Pad(chunk, 128) h ← Compress(h, chunk, cBytesCompressed, true) Result ← first cbHashLen bytes of little endian state vector h End Algorithm BLAKE2b
Compress Function Compress Input: h chunk t : Number, 0..2^128 IsLastBlock: Boolean Output: h V ← h V ← IV V ← V xor Lo(t) V ← V xor Hi(t) if IsLastBlock then V ← V xor 0xFFFFFFFFFFFFFFFF m ← chunk for i from 0 to 11 do S ← SIGMA[i mod 10] Mix(V0, V4, V8, V12, m[S0], m[S1]) Mix(V1, V5, V9, V13, m[S2], m[S3]) Mix(V2, V6, V10, V14, m[S4], m[S5]) Mix(V3, V7, V11, V15, m[S6], m[S7])
Mix(V0, V5, V10, V15, m[S8], m[S9]) Mix(V1, V6, V11, V12, m[S10], m[S11]) Mix(V2, V7, V8, V13, m[S12], m[S13]) Mix(V3, V4, V9, V14, m[S14], m[S15]) end for h ← h xor V h ← h xor V
Result ← h End Function Compress
MIX
Compress 함수에 의해 호출되며 메시지의 두 8바이트 단어를 해시 상태로 혼합한다. 대부분의 구현에서 이 함수는 인라인 또는 인라인 함수로 작성된다.[2]
각주[편집]
- ↑ 〈BLAKE2 - fast secure hashing〉, 《blake2.net》
- ↑ 〈BLAKE〉, 《wikipedia》
참고자료[편집]
- 〈BLAKE2 - fast secure hashing〉, 《blake2.net》
- 〈BLAKE〉, 《wikipedia》
같이 보기[편집]
|