{{위키데이터 속성 추적}}
'''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>

== 각주 ==
{{각주}}

{{암호화 해시}}

[[분류:암호화 해시 함수]]