블레이크2B
BLAKE는 단 버스타인(Dan Bernstein)의 ChaCha stream 암호를 기반으로 하는 암호화 해시 함수이고, BLAKE2는 2012년 12월 21일에 발표된 BLAKE를 기반으로 하는 암호화 해시 함수이다.
개요
ChaCha stream 암호에 기초하지만 입력 블록에 복사판 XORed는 ChaCha 라운드마다 앞에 추가된다. 단어 크기는 두 가지로 변형되는데, 8 단어의 해시값을 16개의 메시지 워드와 반복적으로 결합해 다음 해시값을 도출해낸다.
역사
BLAKE는 미국 표준 기술 연구소 (NIST; National Institute of Standards and Technology) 해시 함수 경쟁에 Jean-Philippe Aumasson, Luca Henzen, Willi Meier, Raphael C.W이 제출했다. 5명의 후보자로 구성된 최종 라운드에 진출했지만 2012년 SHA-3 알고리즘에 채택된 Keccak에 패배했다. 그후 2012년 BLAKE를 기반으로 업그레이드 버전인 BLAKE2가 손상된 MD5, SHA-1 알고리즘을 대체하는 것을 목적으로 발표됐다.
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》
|