큐브해시
CubeHash큐브해시[1](CubeHash)는 다니엘 J. 번스타인이 NIST 해시함수 경연에 제출한 해시함수다. 큐브해시는 128바이트의 상태를 가지고 있으며, 와이드 파이프 구조를 사용하며, ARX 기반이다. 메시지 블록은 128바이트 상태의 초기 비트로 XORed 되고, 그 다음 블록들 사이의 r-원형 생체적 변환을 거친다. 초기 NIST 제안서("Cubehash8/1")는 바이트당 약 200 사이클이 필요했다.[2] 저자는 NIST의 명확화 이후 '큐브해시8/1보다 약 16배 빨라 기준 플랫폼에서 SHA-256과 SHA-512를 모두 쉽게 따라잡는다'는 큐브해시16/32로 제안서를 변경하면서 여전히 '편안한 보안마진'[3]을 유지했다.
큐브해시는 대회 2라운드에 진출했지만 최종 5명 중 하나로 선정되지는 않았다. 이후 번스타인은 매개변수를 더욱 조정했으며, 그의 주요 추천은 큐브해시16+16/32+32+32–512로 정의되는 큐브해시512이다.[4]
작전
이 설명은 NIST 제출서가 아닌 최신 사양을 참조한다.[4]
CubeHash에는 5개의 파라미터가 있으며, 특정 인스턴스는 CubeHashi+r/b+f-h로 표시된다.
- i는 초기 라운드 수입니다.
- r은 블록당 라운드 수입니다.
- b는 {1, 2, 3, ... 128}에 대해 정의된 블록 크기(바이트)입니다.
- f는 최종 라운드 수입니다.
- h는 {8, 16, 24, 32, ... 512}에 대해 정의된 해시 출력 크기(비트)
원래 NIST 제출물에서 i와 f는 10r로 고정되었다. 구식 표기법 CubeHashr/b-h는 i와 f가 암묵적으로 10r임을 나타낸다.
내부 상태는 두 차원 모두에서 0-1인 5차원 단어 배열(4바이트 정수)로 정의된다. 이 단어들은 좌표 [00000]에서 [11111]로 언급된다. 그 말들은 리틀 엔디안으로 취급된다.
내부 상태는 처음 세 단어([00000], [0000001], [00010])를 각각 h/8, b, r로 설정하여 초기화되며, 다른 모든 단어는 0으로 설정한다. 그런 다음 i라운드를 통해 상태가 실행되고 초기화 단계가 완료된다. 이제 상태는 초기화 벡터(IV)가 된다. IV는 h, b, r의 특정 조합에 대해 저장 및 재사용할 수 있다.
메시지는 패딩되어 b바이트 블록으로 분할된다. 패딩에 1비트가 추가되고, 이어 필요한 만큼 0비트가 들어가 완전한 블록을 만든다.
각 블록은 XORing에 의해 주의 첫 번째 b바이트로 입력된 다음, r라운드의 변환을 수행한다.
마지막으로, 1은 상태 단어 [11111]에 XORed된 후 f라운드의 변환이 수행된다.
출력 해시는 이제 이 최종 상태의 첫 번째 h/8바이트에 포함된다.
라운드 함수
CubeHash 원형 함수는 다음 10단계로 구성된다.
- x[0jklm]를 x[1jklm] modulo 2에32 각각(j,k,l,m)씩 추가한다.
- x[0jklm]를 각(j,k,l,m)에 대해 7비트씩 위쪽으로 돌리십시오.
- x[00klm]를 x[01klm]로 교환한다(k,l,m).
- xor x[1jklm]를 x[0jklm]로, 각각에 대해 (j,k,l,m)
- x[1jk0m]를 x[1jk1m]와 교환한다(j,k,m).
- x[0jklm]를 x[1jklm] modulo 2에32 각각(j,k,l,m)씩 추가한다.
- x[0jklm]를 각각(j,k,l,m)씩 11비트 위쪽으로 돌리십시오.
- x[0j0lm]를 x[0j1lm]와 교환한다(j,l,m).
- xor x[1jklm]를 x[0jklm]로, 각각에 대해 (j,k,l,m)
- x[1jkl0]를 x[1jkl1]와 교환한다(j,k,l).
예시 해시
이 예에서는 CubeHash80+8/1+80-512를 사용한다. 초기화 벡터는 모든 80+8/1+f-512 해시에 대해 동일하며, 다음과 같다.
5df39869c73009fb108994600f1626e6f37c07360c0d8bb53d19cf57b8e74133\ 5b8034a3eff9892014c4ff315038ef2a391812fe52a440e9a293527d12ca4570\ 6e0958933470bf814aa4909adb3ec39384e9c314d0db874af21d45bcacb31252\ 1ce5ab6a3bf6f05de88abbdd0fcfd3fafb8225d546242eada52540095c3da221
ASCII 메시지 "Hello"(hex: 0x48, 0x65, 0x6c, 0x6c, 0x6f) 해싱은 6개의 메시지 블록을 사용한다. 메시지에서 5블록 떨어져 있고, 이것은 바이트 정렬 입력이므로 패딩용 블록은 1블록이다. 512비트 해시 값은:
7ce309a25e25e2e1603ca2e1603ca0267b4d0f1b744ca08e75675644\ 8e2f62fdbff7bbbd637ce40fc293286b9d09e8dda029113e0ccfd39b.
눈사태 효과로 인해, 단 한 비트만 뒤집는 것과 같은 메시지의 작은 변화는 해시 출력을 크게 변화시킬 것이다. 메시지 "Hello"(1비트 위치의 "Hello"와 다를 뿐) 해싱은 다음과 같은 해시 값을 제공한다.
01ee7f4eb0eb0eb0eb0eb0eb0ebf460f64993faf13afce01b0d3d2a63690d250f\ 7127109455a7cef12253e762b7e765a7c143e75e49c79a0471a970ba8a638
매개 변수 변경
CubeHash는 해시 출력을 결정하는 데 많은 다른 매개변수를 사용할 수 있도록 한다. 어떤 파라미터를 사용하고자 하는지는 사용자에게 달려 있다. 다음은 서로 다른 매개 변수를 사용하는 서로 다른 메시지의 해시 몇 가지 예입니다. 그 메시지는 모두 ASCII로 되어 있다.
message: "" (the zero-length string) CubeHash160+16/32+160-512: 4a1d00bbcfcb5a9562fb981e7f7db3350fe2658639d948b9d57452c22328bb32\ f468b072208450bad5ee178271408be0b16e5633ac8a1e3cf9864cfbfc8e043a CubeHash80+8/1+80-512: 90bc3f2948f7374065a811f1e47a208a53b1a2f3be1c0072759ed49c9c6c7f28\ f26eb30d5b0658c563077d599da23f97df0c2c0ac6cce734ffe87b2e76ff7294 CubeHash10+1/1+10-512: 3f917707df9acd9b94244681b3812880e267d204f1fdf795d398799b584fa8f1\ f4a0b2dbd52fd1c4b6c5e020dc7a96192397dd1bce9b6d16484049f85bb71f2f CubeHash160+16/32+160-256: 44c6de3ac6c73c391bf0906cb7482600ec06b216c7c54a2a8688a6a42676577d CubeHash80+8/1+80-256: 38d1e8a22dbaac7baac6f5262d 83de89cacf784a02caa8639987722abc59 CubeHash10+1/1+1+10-256: 80f72e07ddddddddddddddb44a7823e2e2ef3a1fc03a1fca1fc030ca1fca1fc0305epa1fa1fa0c0c0c0c0c0c5c5e5c5
message: "Hello" CubeHash160+16/32+160-512: dcc0503aae279a3c8c95fa1181d37c418783204e2e3048a081392fd61bace883\ a1f7c4c96b16b4060c42104f1ce45a622f1a9abaeb994beb107fed53a78f588c CubeHash80+8/1+80-512: 7ce309a25e2e1603ca0fc369267b4d43f0b1b744ac45d6213ca08e7567566444\ 8e2f62fdbf7bbd637ce40fc293286d75b9d09e8dda31bd029113e02ecccfd39b CubeHash10+1/1+10-512: 13cf99c1a71e40b135f5535bee02e151eb4897e4de410b9cb6d7179c677074eb\ 6ef1ae9a9e685ef2d2807509541f484d39559525179d53838eda95eb3f6a401d CubeHash160+16/32+160-256: e712139e3b892f2f5fe52d0f30d78a0cb16b51b217da0e4acb103dd0856f2db0 CubeHash80+8/1+80-256: 692638db57760867326f851bd2376533f37b640bd47a0ddc607a9456b692f70f 큐브Hash10+1/1++10-256: f63041a946aaa98bd3175e600dc2ccccf597b276ba46fe35d49
message: "The quick brown fox jumps over the lazy dog" CubeHash160+16/32+160-512: bdba44a28cd16b774bdf3c9511def1a2baf39d4ef98b92c27cf5e37beb8990b7\ cdb6575dae1a548330780810618b8a5c351c1368904db7ebdf8857d596083a86 CubeHash80+8/1+80-512: ca942b088ed9103726af1fa87b4deb59e50cf3b5c6dcfbcebf5bba22fb39a6be\ 9936c87bfdd7c52fc5e71700993958fa4e7b5e6e2a3672122475c40f9ec816ba CubeHash10+1/1+10-512: eb7f5f80706e8668c61186c3c710ce57f9094fbfa1dbdc7554842cdbb4d10ce4\ 2fce72736d10b152f6216f23fc648bce810a7af4d58e571ec1b852fa514a0a8e CubeHash160+16/32+160-256: 5151e251e348cbbfee46538651c06b138b10eeb71cf6ea6054d7ca5fec82eb79 CubeHash80+8/1+80-256: 94e0c958d85cdfaf554919980f0f50b945b88ad08413e0762d6ff0219aff3e55 CubeHash10+1/1+10-256: 217a4876f2b24cec489c9171f85d53395cc979156ea0254938c4c2c59dfdf8a4
표시된 4가지 변형에 대한 초기화 벡터도 모두 다르다. 예를 들어 CubeHash80+8/1+80-512의 초기화 벡터는 위에서 볼 수 있으며, CubeHash80+8/1+80-256의 IV는 다음과 같다.
830b2bd5273d616fd785876a4a500218a5388963eeb702fb47547842459f8d89\ 8727a1c8ba40bd48cef47fe82543c2735c033052ae9fcd632d4541bde6b6cb0d\ cb8a9cdf579f5b67b2ae00968180af6e51ebdf0ca597cd2bf91f981f7ab29a62\ 01ad72d946e6c075c6d1337e0a293d6f90c438ac38be153f32aa288ffc5eca8a
보안
이 함수의 강도는 b가 1로 감소할수록, r이 증가함에 따라 증가한다. 그래서 큐브해시 8/1-512는 큐브해시 1/1-512보다 더 강력하고(더 안전), 큐브해시 1/2-512는 큐브해시 1/2-512보다 강하다. 이 알고리즘의 가장 약한 버전은 큐브해시 1/128-h이다. 그러나 보안 대 시간 트레이드오프가 있다. 더 안전한 버전은 약화된 버전보다 해시 값을 계산하는 데 더 오래 걸릴 것이다.
참조
- ^ Daniel J. Bernstein (2009-09-14). "CubeHash specification (2.B.1)" (PDF).
{{cite journal}}
: Cite 저널은 필요로 한다.journal=
(도움말) - ^ Daniel J. Bernstein (2008-10-28). "CubeHash efficiency estimates (2.B.2)" (PDF).
{{cite journal}}
: Cite 저널은 필요로 한다.journal=
(도움말) - ^ Daniel J. Bernstein (2009-07-15). "CubeHash parameter tweak: 16 times faster" (PDF).
{{cite journal}}
: Cite 저널은 필요로 한다.journal=
(도움말) - ^ a b Daniel J. Bernstein. "Introduction to CubeHash".