LSH (해시 함수) 문서 원본 보기
←
LSH (해시 함수)
둘러보기로 이동
검색으로 이동
문서 편집 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 명령은 다음 권한을 가진 사용자에게 제한됩니다:
사용자
.
문서의 원본을 보거나 복사할 수 있습니다.
{{위키데이터 속성 추적}} '''LSH'''는 대한민국이 PC, 스마트 디바이스 등 범용 CPU에서 무결성을 제공하기 위해 2014년에 개발한 해시 함수이다.<ref name="KHL+14">{{서적 인용 |title=International Conference on Information Security and Cryptology - ICISC 2014 |volume=8949 |chapter=LSH: A New Fast Secure Hash Function Family |last1=Kim |first1=Dong-Chan |last2=Hong |first2=Deukjo |last3=Lee |first3=Jung-Keun |last4=Kim |first4=Woo-Hwan |last5=Kwon |first5=Daesung |date=2014 |publisher=Springer/Heidelberg |isbn= |pages=286-313 |doi= |series=Lecture Notes in Computer Science }}</ref> LSH는 대한민국 암호모듈 검증제도 검증대상 암호 알고리즘이며, 대한민국 국가 표준(KS X 3262)이다. == 알고리즘 == 해시 함수 LSH의 전체 구조는 아래와 같다. [[파일:LSH_structure.png|600픽셀|섬네일|center|해시 함수 LSH 전체 구조]] LSH는 입력 메시지에 대해 다음과 같은 세 단계를 거쳐 해시값을 출력한다. * 초기화(Initialization): 입력 메시지를 메시지 블록 비트 길이의 배수가 되도록 패딩을 한 후, 이를 메시지 블록 단위로 분할한다. 그리고 연결 변수를 <math> \textsf{IV} </math>로 초기화한다. * 압축(Compression): 32워드 배열 메시지 블록을 압축 함수의 입력으로 하여 얻은 출력값으로 연결 변수를 갱신하며, 이를 마지막 메시지 블록을 처리할 때까지 반복하여 메시지를 압축한다. * 완료(Finalization): 압축 과정을 통해 연결 변수에 최종 저장된 값으로부터 n비트 길이의 해시 함수 출력값을 생성한다. {| class="wikitable" style="text-align: left; margin-left: auto; margin-right:auto; border: none;" | * '''function''' 해시 함수 LSH * '''input:''' 메시지 <math> m </math> * '''output:''' 해시값 <math> h \in \{ 0, 1 \}^n </math> * '''procedure''' <math> \qquad </math><math> m_p \leftarrow \textrm{pad}(m) </math>; <math> \qquad </math><math> m_p </math>로부터 메시지 블록 <math> (M^{(0)}, M^{(1)}, \cdots , M^{(t-1)}) </math> 생성; <math> \qquad </math><math> \textsf{CV}^{(0)} \leftarrow \textsf{IV} </math>; <math> \qquad </math>'''for''' <math> i = 0 </math> '''to''' <math> (t-1) </math> '''do''' <math> \qquad </math><math> \qquad </math><math> \textsf{CV}^{(i+1)} \leftarrow \textrm{CF} (\textsf{CV}^{(i)}, M^{(i)}) </math>; <math> \qquad </math>'''end for''' <math> \qquad </math><math> h \leftarrow \textrm{FIN}_n(\textsf{CV}^{(t)}) </math>; <math> \qquad </math>'''return''' <math> h </math>; |} 해시 함수 LSH의 규격은 다음 표와 같다. {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+해시 함수 LSH 규격 |- ! 구분 ! 출력 비트 길이 (<math> n </math>) ! 압축 함수의 단계 수 (<math> N_s </math>) ! 연결 변수 비트 길이 ! 메시지 블록 비트 길이 ! 워드 비트 길이 (<math> w </math>) |- | style="text-align:center;" | LSH-256-224 | style="text-align:center;" | 224 | rowspan="2" style="text-align:center;" | 26 | rowspan="2" style="text-align:center;" | 512 | rowspan="2" style="text-align:center;" | 1024 | rowspan="2" style="text-align:center;" | 32 |- | style="text-align:center;" | LSH-256-256 | style="text-align:center;" | 256 |- | style="text-align:center;" | LSH-512-224 | style="text-align:center;" | 224 | rowspan="4" style="text-align:center;" | 28 | rowspan="4" style="text-align:center;" | 1024 | rowspan="4" style="text-align:center;" | 2048 | rowspan="4" style="text-align:center;" | 64 |- | style="text-align:center;" | LSH-512-256 | style="text-align:center;" | 256 |- | style="text-align:center;" | LSH-512-384 | style="text-align:center;" | 384 |- | style="text-align:center;" | LSH-512-512 | style="text-align:center;" | 512 |} ===초기화=== 해시 함수의 입력 메시지를 <math>m</math>이라 하자. 먼저 <math>m</math>은 덧붙이기(padding) 과정을 거친다. 덧붙이기 과정은 <math>m</math>의 끝에 비트 ‘1’을 덧붙인 후, 전체 길이가 <math>32wt</math> 비트가 될 때까지 비트 ‘0’을 덧붙인다. 여기에서 <math>t = \lceil (|m| + 1)/32w\rceil </math>이다. 덧붙이기를 마친 메시지를 <math>m_p = m_0 \| m_1 \| \ldots \| m_{(32wt-1)}</math>이라고 하자. 이때 <math>m_p</math>는 <math>4wt</math> 바이트 배열 <math>m_a = (m[0], \ldots , m[4wt-1])</math>로 볼 수 있다. 여기에서 <math>m[k] = m_{8k} \| m_{(8k+1)} \| \ldots \| m_{(8k+7)}</math> <math>(0 \le k \le (4wt-1))</math>이다. 바이트 배열 <math>m_a</math>는 다음과 같이 <math>32t</math> 워드 배열 <math> \textsf{M} = (M[0], \ldots , M[32t-1])</math>으로 변환할 수 있다. <math>M[s] \leftarrow m[ws/8+(w/8-1)] \| \ldots \| m[ws/8+1] \| m[ws/8]</math> <math>(0 \le s \le (32t-1))</math> 이어서 워드 배열 <math> \textsf{M} </math>으로부터 다음과 같은 규칙에 따라 <math>t</math>개 메시지 블록 <math> \textsf{M}^{(0)} </math>, <math> \textsf{M}^{(1)} </math>, \ldots , <math> \textsf{M}^{(t-1)}</math>을 구성할 수 있다. <math> \textsf{M}^{(i)} \leftarrow (M[32i], M[32i+1], \ldots , M[32i+31])</math> <math>(0 \le i \le (t-1))</math> 연결 변수 <math> \textsf{CV}^{(0)} </math><math>(\in \mathcal{W}^{16})</math>는 초기값을 이용하여 다음과 같이 배열 색인별로 값을 할당하는 방식으로 초기화한다. 이때, <math> \mathcal{W}^t </math>는 <math> t \ge 1 </math>일 때 <math> t </math>개 워드 배열의 전체 집합을 나타낸다. <math> \textsf{CV}^{(0)}[l] \leftarrow \textsf{IV}[l] </math> <math>(0 \le l \le 15)</math> 초기값은 다음과 같다. 모든 값은 16진수로 표현되어 있다. {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+LSH-256-224 초기값 |- ! <math> \textsf{IV}[0] </math> ! <math> \textsf{IV}[1] </math> ! <math> \textsf{IV}[2] </math> ! <math> \textsf{IV}[3] </math> ! <math> \textsf{IV}[4] </math> ! <math> \textsf{IV}[5] </math> ! <math> \textsf{IV}[6] </math> ! <math> \textsf{IV}[7] </math> |- | <span style="font-family:Courier;">068608D3</span> | <span style="font-family:Courier;">62D8F7A7</span> | <span style="font-family:Courier;">D76652AB</span> | <span style="font-family:Courier;">4C600A43</span> | <span style="font-family:Courier;">BDC40AA8</span> | <span style="font-family:Courier;">1ECA0B68</span> | <span style="font-family:Courier;">DA1A89BE</span> | <span style="font-family:Courier;">3147D354</span> |- ! <math> \textsf{IV}[8] </math> ! <math> \textsf{IV}[9] </math> ! <math> \textsf{IV}[10] </math> ! <math> \textsf{IV}[11] </math> ! <math> \textsf{IV}[12] </math> ! <math> \textsf{IV}[13] </math> ! <math> \textsf{IV}[14] </math> ! <math> \textsf{IV}[15] </math> |- | <span style="font-family:Courier;">707EB4F9</span> | <span style="font-family:Courier;">F65B3862</span> | <span style="font-family:Courier;">6B0B2ABE</span> | <span style="font-family:Courier;">56B8EC0A</span> | <span style="font-family:Courier;">CF237286</span> | <span style="font-family:Courier;">EE0D1727</span> | <span style="font-family:Courier;">33636595</span> | <span style="font-family:Courier;">8BB8D05F</span> |} {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+LSH-256-256 초기값 |- ! <math> \textsf{IV}[0] </math> ! <math> \textsf{IV}[1] </math> ! <math> \textsf{IV}[2] </math> ! <math> \textsf{IV}[3] </math> ! <math> \textsf{IV}[4] </math> ! <math> \textsf{IV}[5] </math> ! <math> \textsf{IV}[6] </math> ! <math> \textsf{IV}[7] </math> |- | <span style="font-family:Courier;">46A10F1F</span> | <span style="font-family:Courier;">FDDCE486</span> | <span style="font-family:Courier;">B41443A8</span> | <span style="font-family:Courier;">198E6B9D</span> | <span style="font-family:Courier;">3304388D</span> | <span style="font-family:Courier;">B0F5A3C7</span> | <span style="font-family:Courier;">B36061C4</span> | <span style="font-family:Courier;">7ADBD553</span> |- ! <math> \textsf{IV}[8] </math> ! <math> \textsf{IV}[9] </math> ! <math> \textsf{IV}[10] </math> ! <math> \textsf{IV}[11] </math> ! <math> \textsf{IV}[12] </math> ! <math> \textsf{IV}[13] </math> ! <math> \textsf{IV}[14] </math> ! <math> \textsf{IV}[15] </math> |- | <span style="font-family:Courier;">105D5378</span> | <span style="font-family:Courier;">2F74DE54</span> | <span style="font-family:Courier;">5C2F2D95</span> | <span style="font-family:Courier;">F2553FBE</span> | <span style="font-family:Courier;">8051357A</span> | <span style="font-family:Courier;">138668C8</span> | <span style="font-family:Courier;">47AA4484</span> | <span style="font-family:Courier;">E01AFB41</span> |} {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+LSH-512-224 초기값 |- ! <math> \textsf{IV}[0] </math> ! <math> \textsf{IV}[1] </math> ! <math> \textsf{IV}[2] </math> ! <math> \textsf{IV}[3] </math> |- | <span style="font-family:Courier;">0C401E9FE8813A55</span> | <span style="font-family:Courier;">4A5F446268FD3D35</span> | <span style="font-family:Courier;">FF13E452334F612A</span> | <span style="font-family:Courier;">F8227661037E354A</span> |- ! <math> \textsf{IV}[4] </math> ! <math> \textsf{IV}[5] </math> ! <math> \textsf{IV}[6] </math> ! <math> \textsf{IV}[7] </math> |- | <span style="font-family:Courier;">A5F223723C9CA29D</span> | <span style="font-family:Courier;">95D965A11AED3979</span> | <span style="font-family:Courier;">01E23835B9AB02CC</span> | <span style="font-family:Courier;">52D49CBAD5B30616</span> |- ! <math> \textsf{IV}[8] </math> ! <math> \textsf{IV}[9] </math> ! <math> \textsf{IV}[10] </math> ! <math> \textsf{IV}[11] </math> |- | <span style="font-family:Courier;">9E5C2027773F4ED3</span> | <span style="font-family:Courier;">66A5C8801925B701</span> | <span style="font-family:Courier;">22BBC85B4C6779D9</span> | <span style="font-family:Courier;">C13171A42C559C23</span> |- ! <math> \textsf{IV}[12] </math> ! <math> \textsf{IV}[13] </math> ! <math> \textsf{IV}[14] </math> ! <math> \textsf{IV}[15] </math> |- | <span style="font-family:Courier;">31E2B67D25BE3813</span> | <span style="font-family:Courier;">D522C4DEED8E4D83</span> | <span style="font-family:Courier;">A79F5509B43FBAFE</span> | <span style="font-family:Courier;">E00D2CD88B4B6C6A</span> |} {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+LSH-512-256 초기값 |- ! <math> \textsf{IV}[0] </math> ! <math> \textsf{IV}[1] </math> ! <math> \textsf{IV}[2] </math> ! <math> \textsf{IV}[3] </math> |- | <span style="font-family:Courier;">6DC57C33DF989423</span> | <span style="font-family:Courier;">D8EA7F6E8342C199</span> | <span style="font-family:Courier;">76DF8356F8603AC4</span> | <span style="font-family:Courier;">40F1B44DE838223A</span> |- ! <math> \textsf{IV}[4] </math> ! <math> \textsf{IV}[5] </math> ! <math> \textsf{IV}[6] </math> ! <math> \textsf{IV}[7] </math> |- | <span style="font-family:Courier;">39FFE7CFC31484CD</span> | <span style="font-family:Courier;">39C4326CC5281548</span> | <span style="font-family:Courier;">8A2FF85A346045D8</span> | <span style="font-family:Courier;">FF202AA46DBDD61E</span> |- ! <math> \textsf{IV}[8] </math> ! <math> \textsf{IV}[9] </math> ! <math> \textsf{IV}[10] </math> ! <math> \textsf{IV}[11] </math> |- | <span style="font-family:Courier;">CF785B3CD5FCDB8B</span> | <span style="font-family:Courier;">1F0323B64A8150BF</span> | <span style="font-family:Courier;">FF75D972F29EA355</span> | <span style="font-family:Courier;">2E567F30BF1CA9E1</span> |- ! <math> \textsf{IV}[12] </math> ! <math> \textsf{IV}[13] </math> ! <math> \textsf{IV}[14] </math> ! <math> \textsf{IV}[15] </math> |- | <span style="font-family:Courier;">B596875BF8FF6DBA</span> | <span style="font-family:Courier;">FCCA39B089EF4615</span> | <span style="font-family:Courier;">ECFF4017D020B4B6</span> | <span style="font-family:Courier;">7E77384C772ED802</span> |} {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+LSH-512-384 초기값 |- ! <math> \textsf{IV}[0] </math> ! <math> \textsf{IV}[1] </math> ! <math> \textsf{IV}[2] </math> ! <math> \textsf{IV}[3] </math> |- | <span style="font-family:Courier;">53156A66292808F6</span> | <span style="font-family:Courier;">B2C4F362B204C2BC</span> | <span style="font-family:Courier;">B84B7213BFA05C4E</span> | <span style="font-family:Courier;">976CEB7C1B299F73</span> |- ! <math> \textsf{IV}[4] </math> ! <math> \textsf{IV}[5] </math> ! <math> \textsf{IV}[6] </math> ! <math> \textsf{IV}[7] </math> |- | <span style="font-family:Courier;">DF0CC63C0570AE97</span> | <span style="font-family:Courier;">DA4441BAA486CE3F</span> | <span style="font-family:Courier;">6559F5D9B5F2ACC2</span> | <span style="font-family:Courier;">22DACF19B4B52A16</span> |- ! <math> \textsf{IV}[8] </math> ! <math> \textsf{IV}[9] </math> ! <math> \textsf{IV}[10] </math> ! <math> \textsf{IV}[11] </math> |- | <span style="font-family:Courier;">BBCDACEFDE80953A</span> | <span style="font-family:Courier;">C9891A2879725B3E</span> | <span style="font-family:Courier;">7C9FE6330237E440</span> | <span style="font-family:Courier;">A30BA550553F7431</span> |- ! <math> \textsf{IV}[12] </math> ! <math> \textsf{IV}[13] </math> ! <math> \textsf{IV}[14] </math> ! <math> \textsf{IV}[15] </math> |- | <span style="font-family:Courier;">BB08043FB34E3E30</span> | <span style="font-family:Courier;">A0DEC48D54618EAD</span> | <span style="font-family:Courier;">150317267464BC57</span> | <span style="font-family:Courier;">32D1501FDE63DC93</span> |} {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+LSH-512-512 초기값 |- ! <math> \textsf{IV}[0] </math> ! <math> \textsf{IV}[1] </math> ! <math> \textsf{IV}[2] </math> ! <math> \textsf{IV}[3] </math> |- | <span style="font-family:Courier;">ADD50F3C7F07094E</span> | <span style="font-family:Courier;">E3F3CEE8F9418A4F</span> | <span style="font-family:Courier;">B527ECDE5B3D0AE9</span> | <span style="font-family:Courier;">2EF6DEC68076F501</span> |- ! <math> \textsf{IV}[4] </math> ! <math> \textsf{IV}[5] </math> ! <math> \textsf{IV}[6] </math> ! <math> \textsf{IV}[7] </math> |- | <span style="font-family:Courier;">8CB994CAE5ACA216</span> | <span style="font-family:Courier;">FBB9EAE4BBA48CC7</span> | <span style="font-family:Courier;">650A526174725FEA</span> | <span style="font-family:Courier;">1F9A61A73F8D8085</span> |- ! <math> \textsf{IV}[8] </math> ! <math> \textsf{IV}[9] </math> ! <math> \textsf{IV}[10] </math> ! <math> \textsf{IV}[11] </math> |- | <span style="font-family:Courier;">B6607378173B539B</span> | <span style="font-family:Courier;">1BC99853B0C0B9ED</span> | <span style="font-family:Courier;">DF727FC19B182D47</span> | <span style="font-family:Courier;">DBEF360CF893A457</span> |- ! <math> \textsf{IV}[12] </math> ! <math> \textsf{IV}[13] </math> ! <math> \textsf{IV}[14] </math> ! <math> \textsf{IV}[15] </math> |- | <span style="font-family:Courier;">4981F5E570147E80</span> | <span style="font-family:Courier;">D00C4490CA7D3E30</span> | <span style="font-family:Courier;">5D73940C0E4AE1EC</span> | <span style="font-family:Courier;">894085E2EDB2D819</span> |} ===압축=== 초기화 단계에서 생성된 <math>t</math>개의 메시지 블록은 압축 단계에서 순차적으로 압축 함수(compression function) <math> \textrm{CF} : \mathcal{W}^{16} \times \mathcal{W}^{32} \rightarrow \mathcal{W}^{16}</math>의 입력값으로 사용된다. 압축 함수 <math> \textrm{CF} </math>는 연결 변수 <math> \textsf{CV}^{(i)}(\in \mathcal{W}^{16})</math>와 메시지 블록 <math> \textsf{M}^{(i)} (\in \mathcal{W}^{32})</math>를 입력으로 받아 연결 변수 <math> \textsf{CV}^{(i+1)} (\in \mathcal{W}^{16})</math>을 반환한다. 압축 함수는 다음 네 가지 함수로 구성된다. * 메시지 확장 함수 <math>\textrm{MsgExp}: \mathcal{W}^{32} \rightarrow \mathcal{W}^{16(Ns+1)}</math> * 메시지 덧셈 함수 <math>\textrm{MsgAdd}: \mathcal{W}^{16} \times \mathcal{W}^{16} \rightarrow \mathcal{W}^{16}</math> * 섞음 함수 <math>\textrm{Mix}_j: \mathcal{W}^{16} \rightarrow \mathcal{W}^{16}</math> * 워드 단위 치환 <math>\textrm{WordPerm}: \mathcal{W}^{16} \rightarrow \mathcal{W}^{16}</math> 압축 함수의 전체 구조를 도시하면 다음 그림과 같다. [[파일:LSH structure of the compression function.png|600픽셀|섬네일|center|해시 함수 LSH 압축 함수]] 압축 함수 입력값 중 메시지 블록 <math> \textsf{M}^{(i)} </math>는 메시지 확장 함수 MsgExp를 거쳐 <math>(N_s+1)</math>개의 16워드 크기 데이터 <math> \textsf{M}_j^{(i)}</math> <math>(0 \le j \le N_s)</math>로 확장된다. 이어서 16워드 크기의 임시 변수 <math> \textsf{T} = (T[0], \ldots , T[15])</math>에 <math> \textsf{CV}^{(i)}</math>를 할당한 후, 순차적으로 단계 함수(step function) <math>\textrm{Step}_j</math>를 통해 데이터 <math> \textsf{M}_j^{(i)} </math>를 처리하면서 <math> \textsf{T} </math>를 갱신한다. 단계 함수를 거쳐 <math> \textsf{T} </math>에 저장된 값은 MsgAdd 함수를 통해 처리된 후 <math>(i+1)</math>번 째 연결 변수 <math> \textsf{CV}^{(i+1)}</math>에 입력된다. 이러한 압축 함수 처리 절차는 다음과 같다. {| class="wikitable" style="text-align: left; margin-left: auto; margin-right:auto; border: none;" | * '''function''' 압축 함수 <math> \textrm{CF} </math> * '''input:''' 연결 변수 <math> \textsf{CV}^{(i)} </math> (<math> \in \mathcal{W}^{16} </math>)와 메시지 블록 <math> \textsf{M}^{(i)} </math> (<math> \in \mathcal{W}^{32} </math>) * '''output:''' 연결 변수 <math> \textsf{CV}^{(i+1)} </math> (<math> \in \mathcal{W}^{16} </math>) * '''procedure''' <math> \qquad </math><math> \{ \textsf{M}_j^{(i)} \} _{0\le j\le N_s} \leftarrow \textrm{MsgExp} \left( \textsf{M}^{(i)} \right) </math>; <math> \qquad </math><math> \textsf{T} \leftarrow \textsf{CV}^{(i)} </math>; <math> \qquad </math>'''for''' <math> j = 0 </math> '''to''' <math> (N_s - 1) </math> '''do''' <math> \qquad </math><math> \qquad </math><math> \textsf{T} \leftarrow \textrm{Step}_j \left( \textsf{T},\textsf{M}_j^{(i)} \right) </math>; <math> \qquad </math>'''end for''' <math> \qquad </math><math> \textsf{CV}^{(i+1)} \leftarrow \textrm{MsgAdd} \left( \textsf{T}, \textsf{M}_{N_s}^{(i)} \right) </math>; <math> \qquad </math>'''return''' <math> \textsf{CV}^{(i+1)} </math>; |} 압축 함수에서 순차적으로 <math> \textsf{M}_j^{(i)} </math>를 처리하는 단계 함수 <math>\textrm{Step}_j : \mathcal{W}^{16} \times \mathcal{W}^{16} \rightarrow \mathcal{W}^{16}</math>는 다음과 같다. <math>\textrm{Step}_j := \textrm{WordPerm} \circ \textrm{Mix}_j \circ \textrm{MsgAdd}</math> <math>(0 \le j \le (N_s-1))</math> 단계 함수의 전체 구조는 다음 그림과 같다. [[파일:LSH step function.png|600픽셀|섬네일|center|해시 함수 LSH의 <math> j </math> 번째 단계 함수 <math> \textrm{Step}_j </math>]] ====메시지 확장 함수 MsgExp==== 압축 함수에 입력된 메시지 블록 <math> \textsf{M}^{(i)} = (M^{(i)}[0], \ldots , M^{(i)}[31]) </math>에 대해, 메시지 확장 함수 MsgExp는 <math> (N_s+1) </math>개의 16워드 길이의 데이터 <math> \textsf{M}_j^{(i)}</math> <math>(0 \le j \le N_s) </math>를 생성한다. 생성 방법은 다음과 같다. * <math> \textsf{M}_0^{(i)} \leftarrow (M^{(i)}[0], M^{(i)}[1], \ldots , M^{(i)}[15])</math> * <math> \textsf{M}_1^{(i)} \leftarrow (M^{(i)}[16], M^{(i)}[17], \ldots , M^{(i)}[31])</math> * <math> \textsf{M}_j^{(i)}[l] \leftarrow \textsf{M}_{j-1}^{(i)}[l] \boxplus \textsf{M}_{j-2}^{(i)}[\tau(l)]</math> <math>(0 \le l \le 15, \ 2 \le j \le N_s)</math> 함수 <math>\tau</math>는 다음과 같이 정의된 <math>\mathbb{Z}_{16}</math> 상의 치환이다. {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+<math>\mathbb{Z}_{16}</math> 상의 치환 <math>\tau</math> |- ! <math> l </math> | style="text-align:center;" | 0 | style="text-align:center;" | 1 | style="text-align:center;" | 2 | style="text-align:center;" | 3 | style="text-align:center;" | 4 | style="text-align:center;" | 5 | style="text-align:center;" | 6 | style="text-align:center;" | 7 | style="text-align:center;" | 8 | style="text-align:center;" | 9 | style="text-align:center;" | 10 | style="text-align:center;" | 11 | style="text-align:center;" | 12 | style="text-align:center;" | 13 | style="text-align:center;" | 14 | style="text-align:center;" | 15 |- ! <math> \tau(l) </math> | style="text-align:center;" | 3 | style="text-align:center;" | 2 | style="text-align:center;" | 0 | style="text-align:center;" | 1 | style="text-align:center;" | 7 | style="text-align:center;" | 4 | style="text-align:center;" | 5 | style="text-align:center;" | 6 | style="text-align:center;" | 11 | style="text-align:center;" | 10 | style="text-align:center;" | 8 | style="text-align:center;" | 9 | style="text-align:center;" | 15 | style="text-align:center;" | 12 | style="text-align:center;" | 13 | style="text-align:center;" | 14 |} ====메시지 덧셈 함수 MsgAdd==== 두 개의 16워드 길이의 변수 <math> \textsf{X} = (X[0], \ldots , X[15]) </math>와 <math> \textsf{Y} = (Y[0], \ldots , Y[15]) </math>를 입력으로 받아 16워드 길이의 결과값을 출력하는 메시지 덧셈 함수 <math>\textrm{MsgAdd} : \mathcal{W}^{16} \times \mathcal{W}^{16} \rightarrow \mathcal{W}^{16}</math>는 다음과 같이 정의한다. <math>\textrm{MsgAdd}( \textsf{X}, \textsf{Y} ) := (X[0] \oplus Y[0], \ldots , X[15] \oplus Y[15]) </math> ====섞음 함수 Mix==== 섞음 함수 <math>\textrm{Mix}_j: \mathcal{W}^{16} \rightarrow \mathcal{W}^{16}</math>는 16워드 길이의 변수 <math> \textsf{T} = (T[0], \ldots , T[15]) </math>를 입력으로 받아 두 개의 워드 <math>T[l]</math>, <math>T[l+8]</math> <math>(0 \le l \le 7)</math>을 쌍으로 구성한 후 아래와 같이 각각을 섞어 <math> \textsf{T} </math>를 갱신한다. <math>(T[l], T[l+8]) \leftarrow \textrm{Mix}_{j,l}(T[l], T[l+8])</math> <math>(0 \le l \le 7)</math> 여기에서 <math>\textrm{Mix}_{j,l} : \mathcal{W}^2 \rightarrow \mathcal{W}^2</math>은 두 개 워드 <math>X</math>, <math>Y</math>를 처리하는 부분 섞음 함수로 다음과 같다. {| class="wikitable" style="text-align: left; margin-left: auto; margin-right:auto; border: none;" | * '''function''' 부분 섞음 함수 <math> \textrm{Mix}_{j,l} </math> * '''input:''' 워드 <math> X </math>, <math> Y </math> * '''output:''' 워드 <math> X </math>, <math> Y </math> * '''procedure''' <math> \qquad </math><math> X \leftarrow X \boxplus Y </math>;<math> \qquad X \leftarrow X^{\lll \alpha_j} </math>; <math> \qquad </math><math> X \leftarrow X \oplus SC_j[l] </math>; <math> \qquad </math><math> Y \leftarrow X \boxplus Y </math>;<math> \qquad Y \leftarrow Y^{\lll \beta_j} </math>; <math> \qquad </math><math> X \leftarrow X \boxplus Y </math>;<math> \qquad Y \leftarrow Y^{\lll \gamma_l} </math>; <math> \qquad </math>'''return''' <math> X </math>, <math> Y </math> |} 부분 섞음 함수 <math> \textrm{Mix}_{j,l} </math>를 도식화하면 다음 그림과 같다. [[파일:LSH mix function.png|250픽셀|섬네일|center|해시 함수 LSH의 부분 섞음 함수]] 섞음 함수 <math>\textrm{Mix}_{j,l}</math>에 사용되는 비트 순환량 <math>\alpha_j</math>, <math>\beta_j</math>, <math>\gamma_l</math>은 다음 표와 같다. 비트 순환량 <math>\alpha_j</math>, <math>\beta_j</math>는 짝수 단계와 홀수 단계에서 다른 값이 적용된다. {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+비트 순환량 <math>\alpha_j</math>, <math>\beta_j</math>, <math>\gamma_l</math> |- ! <math> w </math> ! <math> j </math> ! <math> \alpha_j </math> ! <math> \beta_j </math> ! <math> \gamma_0 </math> ! <math> \gamma_1 </math> ! <math> \gamma_2 </math> ! <math> \gamma_3 </math> ! <math> \gamma_4 </math> ! <math> \gamma_5 </math> ! <math> \gamma_6 </math> ! <math> \gamma_7 </math> |- | rowspan="2" style="text-align:center;" | 32 | style="text-align:center;" | 짝수 | style="text-align:center;" | 29 | style="text-align:center;" | 1 | rowspan="2" style="text-align:center;" | 0 | rowspan="2" style="text-align:center;" | 8 | rowspan="2" style="text-align:center;" | 16 | rowspan="2" style="text-align:center;" | 24 | rowspan="2" style="text-align:center;" | 24 | rowspan="2" style="text-align:center;" | 16 | rowspan="2" style="text-align:center;" | 8 | rowspan="2" style="text-align:center;" | 0 |- | style="text-align:center;" | 홀수 | style="text-align:center;" | 5 | style="text-align:center;" | 17 |- | rowspan="2" style="text-align:center;" | 64 | style="text-align:center;" | 짝수 | style="text-align:center;" | 23 | style="text-align:center;" | 59 | rowspan="2" style="text-align:center;" | 0 | rowspan="2" style="text-align:center;" | 16 | rowspan="2" style="text-align:center;" | 32 | rowspan="2" style="text-align:center;" | 48 | rowspan="2" style="text-align:center;" | 8 | rowspan="2" style="text-align:center;" | 24 | rowspan="2" style="text-align:center;" | 40 | rowspan="2" style="text-align:center;" | 56 |- | style="text-align:center;" | 홀수 | style="text-align:center;" | 7 | style="text-align:center;" | 3 |} 그리고 8워드 길이의 단계 상수 <math> \textsf{SC}_j = (SC_j[0], \ldots , SC_j[7]) </math>는 먼저 <math> \textsf{SC}_0 </math>를 아래 표와 같이 정의한 후, 나머지 <math> (N_s-1) </math>개의 상수 <math> \textsf{SC}_j </math>를 <math> SC_j[l] \leftarrow SC_{j-1}[l] \boxplus SC_{j-1}[l]^{\lll8}</math> <math>(0 \le l \le 7, 1 \le j \le (N_s-1)) </math>와 같이 유도한다. {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+초기 단계 상수 |- ! ! <math> w = 32 </math> ! <math> w = 64 </math> |- ! style="text-align:center;" | <math> SC_0[0] </math> | <span style="font-family:Courier;">917caf90</span> | <span style="font-family:Courier;">97884283c938982a</span> |- ! style="text-align:center;" | <math> SC_0[1] </math> | <span style="font-family:Courier;">6c1b10a2</span> | <span style="font-family:Courier;">ba1fca93533e2355</span> |- ! style="text-align:center;" | <math> SC_0[2] </math> | <span style="font-family:Courier;">6f352943</span> | <span style="font-family:Courier;">c519a2e87aeb1c03</span> |- ! style="text-align:center;" | <math> SC_0[3] </math> | <span style="font-family:Courier;">cf778243</span> | <span style="font-family:Courier;">9a0fc95462af17b1</span> |- ! style="text-align:center;" | <math> SC_0[4] </math> | <span style="font-family:Courier;">2ceb7472</span> | <span style="font-family:Courier;">fc3dda8ab019a82b</span> |- ! style="text-align:center;" | <math> SC_0[5] </math> | <span style="font-family:Courier;">29e96ff2</span> | <span style="font-family:Courier;">02825d079a895407</span> |- ! style="text-align:center;" | <math> SC_0[6] </math> | <span style="font-family:Courier;">8a9ba428</span> | <span style="font-family:Courier;">79f2d0a7ee06a6f7</span> |- ! style="text-align:center;" | <math> SC_0[7] </math> | <span style="font-family:Courier;">2eeb2642</span> | <span style="font-family:Courier;">d76d15eed9fdf5fe</span> |} ====워드 단위 치환 WordPerm==== 워드 단위 치환 <math> \textrm{WordPerm} : \mathcal{W}^{16} \rightarrow \mathcal{W}^{16} </math>은 16워드 길이의 변수 <math> \textsf{X} = (X[0], \ldots , X[15]) </math>를 입력으로 받아 16워드 길이의 결과값을 출력한다. <math> \textrm{WordPerm}( \textsf{X}) := (X[\sigma(0)], \ldots , X[\sigma(15)]) </math> 이때, 사용되는 함수 <math>\sigma</math>는 다음 표와 같이 정의된 <math>\mathbb{Z}_{16}</math> 상의 치환이다. {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+<math>\mathbb{Z}_{16}</math> 상의 치환 <math>\sigma</math> |- ! <math> l </math> | style="text-align:center;" | 0 | style="text-align:center;" | 1 | style="text-align:center;" | 2 | style="text-align:center;" | 3 | style="text-align:center;" | 4 | style="text-align:center;" | 5 | style="text-align:center;" | 6 | style="text-align:center;" | 7 | style="text-align:center;" | 8 | style="text-align:center;" | 9 | style="text-align:center;" | 10 | style="text-align:center;" | 11 | style="text-align:center;" | 12 | style="text-align:center;" | 13 | style="text-align:center;" | 14 | style="text-align:center;" | 15 |- ! <math> \sigma(l) </math> | style="text-align:center;" | 6 | style="text-align:center;" | 4 | style="text-align:center;" | 5 | style="text-align:center;" | 7 | style="text-align:center;" | 12 | style="text-align:center;" | 15 | style="text-align:center;" | 14 | style="text-align:center;" | 13 | style="text-align:center;" | 2 | style="text-align:center;" | 0 | style="text-align:center;" | 1 | style="text-align:center;" | 3 | style="text-align:center;" | 8 | style="text-align:center;" | 11 | style="text-align:center;" | 10 | style="text-align:center;" | 9 |} ===완료=== 완료 함수 <math>\textrm{FIN}_n : \mathcal{W}^{16} \rightarrow \{0, 1\}^{n}</math>은 압축 과정의 결과로 생성된 마지막 연결 변수 <math> \textsf{CV}^{(t)} = ( CV^{(t)}[0], \ldots , CV^{(t)}[15])</math>에 적용되어 <math>n</math>비트 길이의 해시값 <math>h</math>를 생성한다. <math> \textsf{H} = (H[0], \ldots , H[7])</math>를 8워드 길이의 변수, <math> \textsf{h}_\textsf{b} = (h_b[0], \ldots , h_b[w-1])</math>는 <math>w</math> 바이트 길이의 변수라고 하면, 출력 함수 <math>\textrm{FIN}_n</math>은 다음 절차를 수행한다. * <math>H[l] \leftarrow CV^{(t)}[l] \oplus CV^{(t)}[l+8]</math> <math>(0 \le l \le 7)</math> * <math>h_b[s] \leftarrow H[\lfloor 8s/w\rfloor]^{\ggg(8s \mod w)}_{[7:0]}</math> <math>(0 \le s \le (w-1))</math> * <math>h \leftarrow (h_b[0] \| \ldots \| h_b[w-1])_{[0:n-1]}</math> 이때, 임의의 워드 <math> X </math>에 대해 <math> r \ge s </math>일 때, <math> X_{[r:s]} </math>는 <math> X </math>의 비트열 표현에서 부분 비트열 <math> x_r \| x_{r-1} \| \ldots \| x_s </math>를 나타낸다. 그리고 임의의 비트열 <math> x </math>에 대해 <math> r \le s </math>일 때, <math> x_{[r:s]} </math>는 <math> x </math>의 부분 비트열 <math> x_r \| x_{r+1} \| \ldots \| x_s </math>를 나타낸다. == 안전성 == LSH는 현재까지 알려진 모든 해시 함수 공격에 대해 안전하다. LSH는 ideal cipher model 하에서 쿼리의 수가 <math> q < 2^{n/2} </math>일 때 충돌 저항성(collision-resistance)을 가지며, 쿼리의 수가 <math> q < 2^n </math>일 때 역상 저항성(preimage-resistance) 및 제2-역상 저항성(second-preimage-resistance)을 가지는 것이 증명되었다<ref name=KHL+14 />. 또한, LSH-256의 경우 13스텝, LSH-512의 경우 14스텝이 알려진 모든 공격에 대해 안전함이 알려져 있어 50% 이상의 안전성 마진을 제공한다<ref name=KHL+14 />. == 구현 성능 == LSH는 다양한 소프트웨어 플랫폼에서 SHA-2/3 대비 빠른 속도를 보유하고 있다. 아래 표는 다양한 플랫폼 상에서 LSH의 1MB 메시지에 대한 해시값 계산 속도를 보여준다. {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+LSH의 1MB 메시지에 대한 해시값 계산 속도 (cycles/byte)<ref name=KHL+14 /> |- ! Platform | style="text-align:center;" | P1{{efn|Intel Core i7-4770K @ 3.5GHz (Haswell), Ubuntu 12.04 64-bit, GCC 4.8.1 with “-m64 -mavx2 -O3”}} | style="text-align:center;" | P2{{efn|Intel Core i7-2600K @ 3.40GHz (Sandy Bridge), Ubuntu 12.04 64-bit, GCC 4.8.1 with “-m64 -msse4 -O3”}} | style="text-align:center;" | P3{{efn|Intel Core 2 Quad Q9550 @ 2.83GHz (Yorkfield), Windows 7 32-bit, Visual studio 2012}} | style="text-align:center;" | P4{{efn|AMD FX-8350 @ 4GHz (Piledriver), Ubuntu 12.04 64-bit, GCC 4.8.1 with “-m64 -mxop -O3”}} | style="text-align:center;" | P5{{efn|Samsung Exynos 5250 ARM Cortex-A15 @ 1.7GHz dual core (Huins ACHRO 5250), Android 4.1.1}} | style="text-align:center;" | P6{{efn|Qualcomm Snapdragon 800 Krait 400 @ 2.26GHz quad core (LG G2), Android 4.4.2}} | style="text-align:center;" | P7{{efn|Qualcomm Snapdragon 800 Krait 400 @ 2.3GHz quad core (Samsung Galaxy S4), Android 4.2.2}} | style="text-align:center;" | P8{{efn|Qualcomm Snapdragon 400 Krait 300 @ 1.7GHz dual core (Samsung Galaxy S4 mini), Android 4.2.2}} |- | style="text-align:center;" | LSH-256-<math> n </math> | style="text-align:right;" | 3.60 | style="text-align:right;" | 3.86 | style="text-align:right;" | 5.26 | style="text-align:right;" | 3.89 | style="text-align:right;" | 11.17 | style="text-align:right;" | 15.03 | style="text-align:right;" | 15.28 | style="text-align:right;" | 14.84 |- | style="text-align:center;" | LSH-512-<math> n </math> | style="text-align:right;" | 2.39 | style="text-align:right;" | 5.04 | style="text-align:right;" | 7.76 | style="text-align:right;" | 5.52 | style="text-align:right;" | 8.94 | style="text-align:right;" | 18.76 | style="text-align:right;" | 19.00 | style="text-align:right;" | 18.10 |} {{notelist}} 아래 표는 Haswell 기반 플랫폼에서 LSH와 몇 종류의 해시 함수 성능을 비교한 것이다. LSH는 Intel Core i7-4770k @ 3.5 GHz quad core 플랫폼에서, 다른 해시 함수는 Intel Core i5-4570S @ 2.9 GHz quad core 플랫폼에서 성능을 측정한 결과이다. {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+Speed benchmark of LSH, SHA-2 and the SHA-3 finalists at the platform based on Haswell CPU (cycles/byte)<ref name=KHL+14 /> |- ! rowspan="2" style="text-align:center;" | Algorithm ! colspan="6" style="text-align:center;" | Message size in bytes |- ! style="text-align:center;" | long ! style="text-align:center;" | 4,096 ! style="text-align:center;" | 1,536 ! style="text-align:center;" | 576 ! style="text-align:center;" | 64 ! style="text-align:center;" | 8 |- |- style="border-top:double;" | style="text-align:center;" | LSH-256-256 | style="text-align:right;" | 3.60 | style="text-align:right;" | 3.71 | style="text-align:right;" | 3.90 | style="text-align:right;" | 4.08 | style="text-align:right;" | 8.19 | style="text-align:right;" | 65.37 |- | style="text-align:center;" | Skein-512-256 | style="text-align:right;" | 5.01 | style="text-align:right;" | 5.58 | style="text-align:right;" | 5.86 | style="text-align:right;" | 6.49 | style="text-align:right;" | 13.12 | style="text-align:right;" | 104.50 |- | style="text-align:center;" | Blake-256 | style="text-align:right;" | 6.61 | style="text-align:right;" | 7.63 | style="text-align:right;" | 7.87 | style="text-align:right;" | 9.05 | style="text-align:right;" | 16.58 | style="text-align:right;" | 72.50 |- | style="text-align:center;" | Grøstl-256 | style="text-align:right;" | 9.48 | style="text-align:right;" | 10.68 | style="text-align:right;" | 12.18 | style="text-align:right;" | 13.71 | style="text-align:right;" | 37.94 | style="text-align:right;" | 227.50 |- | style="text-align:center;" | Keccak-256 | style="text-align:right;" | 10.56 | style="text-align:right;" | 10.52 | style="text-align:right;" | 9.90 | style="text-align:right;" | 11.99 | style="text-align:right;" | 23.38 | style="text-align:right;" | 187.50 |- | style="text-align:center;" | SHA-256 | style="text-align:right;" | 10.82 | style="text-align:right;" | 11.91 | style="text-align:right;" | 12.26 | style="text-align:right;" | 13.51 | style="text-align:right;" | 24.88 | style="text-align:right;" | 106.62 |- | style="text-align:center;" | JH-256 | style="text-align:right;" | 14.70 | style="text-align:right;" | 15.50 | style="text-align:right;" | 15.94 | style="text-align:right;" | 17.06 | style="text-align:right;" | 31.94 | style="text-align:right;" | 257.00 |- style="border-top:double;" | style="text-align:center;" | LSH-512-512 | style="text-align:right;" | 2.39 | style="text-align:right;" | 2.54 | style="text-align:right;" | 2.79 | style="text-align:right;" | 3.31 | style="text-align:right;" | 10.81 | style="text-align:right;" | 85.62 |- | style="text-align:center;" | Skein-512-512 | style="text-align:right;" | 4.67 | style="text-align:right;" | 5.51 | style="text-align:right;" | 5.80 | style="text-align:right;" | 6.44 | style="text-align:right;" | 13.59 | style="text-align:right;" | 108.25 |- | style="text-align:center;" | Blake-512 | style="text-align:right;" | 4.96 | style="text-align:right;" | 6.17 | style="text-align:right;" | 6.82 | style="text-align:right;" | 7.38 | style="text-align:right;" | 14.81 | style="text-align:right;" | 116.50 |- | style="text-align:center;" | SHA-512 | style="text-align:right;" | 7.65 | style="text-align:right;" | 8.24 | style="text-align:right;" | 8.69 | style="text-align:right;" | 9.03 | style="text-align:right;" | 17.22 | style="text-align:right;" | 138.25 |- | style="text-align:center;" | Grøstl-512 | style="text-align:right;" | 12.78 | style="text-align:right;" | 15.44 | style="text-align:right;" | 17.30 | style="text-align:right;" | 17.99 | style="text-align:right;" | 51.72 | style="text-align:right;" | 417.38 |- | style="text-align:center;" | JH-512 | style="text-align:right;" | 14.25 | style="text-align:right;" | 15.66 | style="text-align:right;" | 16.14 | style="text-align:right;" | 17.34 | style="text-align:right;" | 32.69 | style="text-align:right;" | 261.00 |- | style="text-align:center;" | Keccak-512 | style="text-align:right;" | 16.36 | style="text-align:right;" | 17.86 | style="text-align:right;" | 18.46 | style="text-align:right;" | 20.35 | style="text-align:right;" | 21.56 | style="text-align:right;" | 171.88 |} 아래 표는 Samsung Exynos 5250 ARM Cortex-A15 @ 1.7 GHz dual core 플랫폼에서 LSH와 몇 종류의 해시 함수 성능을 비교한 것이다. {| class="wikitable" style="margin-left: auto; margin-right:auto; border: none;" |+Speed benchmark of LSH, SHA-2 and the SHA-3 finalists at the platform based on Exynos 5250 ARM Cortex-A15 CPU (cycles/byte)<ref name=KHL+14 /> |- ! rowspan="2" style="text-align:center;" | Algorithm ! colspan="6" style="text-align:center;" | Message size in bytes |- ! style="text-align:center;" | long ! style="text-align:center;" | 4,096 ! style="text-align:center;" | 1,536 ! style="text-align:center;" | 576 ! style="text-align:center;" | 64 ! style="text-align:center;" | 8 |- |- style="border-top:double;" | style="text-align:center;" | LSH-256-256 | style="text-align:right;" | 11.17 | style="text-align:right;" | 11.53 | style="text-align:right;" | 12.16 | style="text-align:right;" | 12.63 | style="text-align:right;" | 22.42 | style="text-align:right;" | 192.68 |- | style="text-align:center;" | Skein-512-256 | style="text-align:right;" | 15.64 | style="text-align:right;" | 16.72 | style="text-align:right;" | 18.33 | style="text-align:right;" | 22.68 | style="text-align:right;" | 75.75 | style="text-align:right;" | 609.25 |- | style="text-align:center;" | Blake-256 | style="text-align:right;" | 17.94 | style="text-align:right;" | 19.11 | style="text-align:right;" | 20.88 | style="text-align:right;" | 25.44 | style="text-align:right;" | 83.94 | style="text-align:right;" | 542.38 |- | style="text-align:center;" | SHA-256 | style="text-align:right;" | 19.91 | style="text-align:right;" | 21.14 | style="text-align:right;" | 23.03 | style="text-align:right;" | 28.13 | style="text-align:right;" | 90.89 | style="text-align:right;" | 578.50 |- | style="text-align:center;" | JH-256 | style="text-align:right;" | 34.66 | style="text-align:right;" | 36.06 | style="text-align:right;" | 38.10 | style="text-align:right;" | 43.51 | style="text-align:right;" | 113.92 | style="text-align:right;" | 924.12 |- | style="text-align:center;" | Keccak-256 | style="text-align:right;" | 36.03 | style="text-align:right;" | 38.01 | style="text-align:right;" | 40.54 | style="text-align:right;" | 48.13 | style="text-align:right;" | 125.00 | style="text-align:right;" | 1000.62 |- | style="text-align:center;" | Grøstl-256 | style="text-align:right;" | 40.70 | style="text-align:right;" | 42.76 | style="text-align:right;" | 46.03 | style="text-align:right;" | 54.94 | style="text-align:right;" | 167.52 | style="text-align:right;" | 1020.62 |- style="border-top:double;" | style="text-align:center;" | LSH-512-512 | style="text-align:right;" | 8.94 | style="text-align:right;" | 9.56 | style="text-align:right;" | 10.55 | style="text-align:right;" | 12.28 | style="text-align:right;" | 38.82 | style="text-align:right;" | 307.98 |- | style="text-align:center;" | Blake-512 | style="text-align:right;" | 13.46 | style="text-align:right;" | 14.82 | style="text-align:right;" | 16.88 | style="text-align:right;" | 20.98 | style="text-align:right;" | 77.53 | style="text-align:right;" | 623.62 |- | style="text-align:center;" | Skein-512-512 | style="text-align:right;" | 15.61 | style="text-align:right;" | 16.73 | style="text-align:right;" | 18.35 | style="text-align:right;" | 22.56 | style="text-align:right;" | 75.59 | style="text-align:right;" | 612.88 |- | style="text-align:center;" | JH-512 | style="text-align:right;" | 34.88 | style="text-align:right;" | 36.26 | style="text-align:right;" | 38.36 | style="text-align:right;" | 44.01 | style="text-align:right;" | 116.41 | style="text-align:right;" | 939.38 |- | style="text-align:center;" | SHA-512 | style="text-align:right;" | 44.13 | style="text-align:right;" | 46.41 | style="text-align:right;" | 49.97 | style="text-align:right;" | 54.55 | style="text-align:right;" | 135.59 | style="text-align:right;" | 1088.38 |- | style="text-align:center;" | Keccak-512 | style="text-align:right;" | 63.31 | style="text-align:right;" | 64.59 | style="text-align:right;" | 67.85 | style="text-align:right;" | 77.21 | style="text-align:right;" | 121.28 | style="text-align:right;" | 968.00 |- | style="text-align:center;" | Grøstl-512 | style="text-align:right;" | 131.35 | style="text-align:right;" | 138.49 | style="text-align:right;" | 150.15 | style="text-align:right;" | 166.54 | style="text-align:right;" | 446.53 | style="text-align:right;" | 3518.00 |} == 테스트 벡터 == 해시 함수 LSH의 테스트 벡터는 다음과 같다. 모든 값은 16진수로 표현되어 있다. LSH-256-224("abc") = <span style="font-family:Courier;">F7 C5 3B A4 03 4E 70 8E 74 FB A4 2E 55 99 7C A5 12 6B B7 62 36 88 F8 53 42 F7 37 32</span> LSH-256-256("abc") = <span style="font-family:Courier;">5F BF 36 5D AE A5 44 6A 70 53 C5 2B 57 40 4D 77 A0 7A 5F 48 A1 F7 C1 96 3A 08 98 BA 1B 71 47 41</span> LSH-512-224("abc") = <span style="font-family:Courier;">D1 68 32 34 51 3E C5 69 83 94 57 1E AD 12 8A 8C D5 37 3E 97 66 1B A2 0D CF 89 E4 89</span> LSH-512-256("abc") = <span style="font-family:Courier;">CD 89 23 10 53 26 02 33 2B 61 3F 1E C1 1A 69 62 FC A6 1E A0 9E CF FC D4 BC F7 58 58 D8 02 ED EC</span> LSH-512-384("abc") = <span style="font-family:Courier;">5F 34 4E FA A0 E4 3C CD 2E 5E 19 4D 60 39 79 4B 4F B4 31 F1 0F B4 B6 5F D4 5E 9D A4 EC DE 0F 27 B6 6E 8D BD FA 47 25 2E 0D 0B 74 1B FD 91 F9 FE</span> LSH-512-512("abc") = <span style="font-family:Courier;">A3 D9 3C FE 60 DC 1A AC DD 3B D4 BE F0 A6 98 53 81 A3 96 C7 D4 9D 9F D1 77 79 56 97 C3 53 52 08 B5 C5 72 24 BE F2 10 84 D4 20 83 E9 5A 4B D8 EB 33 E8 69 81 2B 65 03 1C 42 88 19 A1 E7 CE 59 6D</span> == 구현 == C, Java, Python으로 구현된 LSH의 배포용 소스코드는 KISA 암호이용활성화 웹페이지에서 다운받을 수 있다.<ref name="LSH_source">{{웹 인용|title=LSH 소스코드|url=https://seed.kisa.or.kr/kisa/Board/22/detailView.do}}</ref> == 암호모듈 검증제도 == LSH는 2019년 대한민국 암호모듈 검증제도 검증대상 암호알고리즘 목록에 포함되었다.<ref name="KCMVP">{{웹 인용|title=암호모듈검증|url=https://seed.kisa.or.kr/kisa/kcmvp/EgovSummary.do}}</ref> == 표준 == LSH는 아래 표준으로 제정되어 있다. * KS X 3262, 해시 함수 LSH<ref name="KS_X_3262">{{웹 인용 |url = https://standard.go.kr |title = e-나라 표준인증 |url-status = |archiveurl = |archivedate = }}</ref> == 각주 == {{각주}} {{암호화 해시}} [[분류:암호화 해시 함수]]
이 문서에서 사용한 틀:
틀:Efn
(
원본 보기
)
틀:Notelist
(
원본 보기
)
틀:각주
(
원본 보기
)
틀:서적 인용
(
원본 보기
)
틀:암호화 해시
(
원본 보기
)
틀:웹 인용
(
원본 보기
)
틀:위키데이터 속성 추적
(
원본 보기
)
LSH (해시 함수)
문서로 돌아갑니다.
둘러보기 메뉴
개인 도구
로그인
이름공간
문서
토론
한국어
보기
읽기
원본 보기
역사 보기
더 보기
검색
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
특수 문서 목록
도구
여기를 가리키는 문서
가리키는 글의 최근 바뀜
문서 정보