|
|
(사용자 3명의 중간 판 34개는 보이지 않습니다) |
1번째 줄: |
1번째 줄: |
− | '''HIGHT'''(HIGh security and light weigHT) 암호 알고리즘은 [[RFID]], [[USN]] 등과 같이 저전력ㆍ경량화를 요구하는 컴퓨팅 환경에서 기밀성을 제공하기 위해 2005년 [[KISA]], [[ETRI]] 부설연구소 및 [[고려대]]가 공동으로 개발한 [[GFS]]구조의 64비트 경량 블록 암호 알고리즘이다. 스마트폰, 스마트카드 및 RFID등과 같이 저전력, 경량화를 요구하는 모바일 환경에서 기밀성 있는 보안을 확보하기 위해 개발되었다. | + | '''HIGHT'''(HIGh security and light weigHT)는 [[GFS]]구조의 64비트 경량 [[블록]] [[암호 알고리즘]]이다. 저전력 및 경량화를 요구하는 컴퓨팅 환경 혹은 모바일 환경에서 기밀성을 제공하기 위해 개발되었다. 2005년 [[KISA]], [[ETRI]] 부설연구소 및 [[고려대]]가 공동으로 개발했다. |
− | | |
− | == 특징 ==
| |
− | * 휴대형 기기 및 모바일 환경에 적합하도록 특수 설계되었고, 전력 소비가 적도록 개발된 블록 암호화 알고리즘이다.
| |
− | * 8비트 단위의 기본적인 산술연산, XOR, 순환이동만으로 사용가능 하도록 간단구조로 설계되었다.
| |
− | * 128비트 국산암호화 알고리즘 [[SEED]]에 비해 제한된 호나경에 적용하기위해 매우 간단한 구조의 안전성, 효율성을 동시에 고려하였다.
| |
− | * 메모리와 같은 하드웨어 자원이 부족한 환경에 적합하도록 일반적인 블록 암호화 알고리즘과는 다르게 [[S-Box]](Substitution-box)를 제거하였다.
| |
− | * 2006년 12월 정보통신단체 표준으로 제정되었다.
| |
− | * 2010년 12월 ISO/IEC 국제 표준으로 제정되었다.<ref>경수, 〈[https://blog.naver.com/rudtn082/220923768132 HIGHT 암호 알고리즘에 대해]〉, 《네이버 블로그》 , 2017-01-31</ref>
| |
| | | |
| + | == 개요 == |
| + | HIGHT는 [[RFID]], [[USN]] 등과 같이 저전력 및 경량화를 요구하는 컴퓨팅 환경, 혹은 [[스마트폰]], [[스마트카드]] 및 [[RFID]]등과 같이 저전력, 경량화를 요구하는 [[모바일]] 환경에서 기밀성을 제공하기 위해 개발된 블록 암호화 알고리즘이다. 이는 휴대형 기기 및 모바일 환경에 적합하도록 특수 설계되었고, 전력 소비가 적도록 개발되었다. 또한 8비트 단위의 기본적인 산술연산, [[XOR]], 순환이동만으로 사용가능 하도록 간단구조로 설계되었다. HIGHT는 128비트 국산암호화 알고리즘 [[SEED]]에 비해 제한된 환경에 적용하기 위해 매우 간단한 구조의 안전성, 효율성을 동시에 고려하였으며, [[메모리]]와 같은 [[하드웨어]] 자원이 부족한 환경에 적합하도록 일반적인 블록 암호화 알고리즘과는 다르게 [[S-Box]](Substitution-box)를 제거하였다. 2006년 12월에는 정보통신단체 표준으로, 2010년 12월에는 ISO/IEC 국제 표준으로 제정되었다.<ref>경수, 〈[https://blog.naver.com/rudtn082/220923768132 HIGHT 암호 알고리즘에 대해]〉, 《네이버 블로그》 , 2017-01-31</ref> |
| | | |
| == 알고리즘 == | | == 알고리즘 == |
| HIGHT 알고리즘은 전체적으로 일반화된 Feistel 변형 구조로 이루어져 있으며, 64비트의 평문과 128비트의 키로부터 생성된 8개의 8비트 화이트닝키와 128개의 8비트 서브키를 입력으로 사용함으로써 총 32라운드를 거쳐서 64비트 암호문을 출력한다. | | HIGHT 알고리즘은 전체적으로 일반화된 Feistel 변형 구조로 이루어져 있으며, 64비트의 평문과 128비트의 키로부터 생성된 8개의 8비트 화이트닝키와 128개의 8비트 서브키를 입력으로 사용함으로써 총 32라운드를 거쳐서 64비트 암호문을 출력한다. |
| | | |
− | === 1. 기호와 표기 === | + | === 기호와 표기 === |
| 64비트 평문과 암호문은 각각 8개의 바이트로 다음과 같다. | | 64비트 평문과 암호문은 각각 8개의 바이트로 다음과 같다. |
− | :* 평문 : <math> P_{7} \ || \ P_{6} \ || \cdots || \ P_{0} </math>
| + | |
− | :* 암호문 : <math> C_{7} \ || \ C_{6} \ || \cdots || \ C_{0} </math>
| + | * 평문 : <math> P_{7} \ || \ P_{6} \ || \cdots || \ P_{0} </math> |
| + | * 암호문 : <math> C_{7} \ || \ C_{6} \ || \cdots || \ C_{0} </math> |
| + | |
| 64비트 라운드 함수 입·출력은 8개의 바이트로 다음과 같다. | | 64비트 라운드 함수 입·출력은 8개의 바이트로 다음과 같다. |
− | ::* <math> X_{i} = X_{i,7} \ || \ X_{i,6} \ || \cdots || \ X_{i,0}, i=0, \cdots ,32 </math>
| + | |
| + | <math> X_{i} = X_{i,7} \ || \ X_{i,6} \ || \cdots || \ X_{i,0}, i=0, \cdots ,32 </math> |
| + | |
| 128비트 키(마스터키)는 16개의 바이트로 다음과 같다. | | 128비트 키(마스터키)는 16개의 바이트로 다음과 같다. |
− | :* <math> MK = MK_{15} \ || \ MK_{14} \ || \cdots || \ MK_{0} </math>
| |
− | 라운드 함수에 적용되는 라운드키는 서브키(<math> SK_{i} </math>)와 화이트닝키(<math> WK_{i} </math>)로 다음과 같다.
| |
− | :* <math> SK_{i}, i=0,\cdots ,127 </math>
| |
− | :* <math> WK_{i}, i=0,\cdots ,7 </math>
| |
− | 산술 연산 기호
| |
− | :* ⊞ : 법 <math> 2^{8} </math> 덧셈
| |
− | :* ⊟ : 법 <math> 2^{8} </math> 뺄셈
| |
− | :* ⊕ : XOR (배타적 논리합)
| |
− | :* <math> A^{<<8} </math> : 8비트 값 A에 대한 8비트 좌측 순환 이동
| |
| | | |
− | === 2. 키 스케줄 === | + | <math> MK = MK_{15} \ || \ MK_{14} \ || \cdots || \ MK_{0} </math> |
− | HIGHT의 라운드키는 화이트닝키와 LFSR을 사용하여 생성한 서브키들로 이루어진다.
| |
| | | |
− | ==== 2.1. 화이트닝키 생성 ====
| + | 라운드 함수에 적용되는 라운드키는 서브키(<math> SK_{i} </math>)와 화이트닝키(<math> WK_{i} </math>)로 다음과 같다. |
− | 화이트닝키는 마스터키를 사용하여 다음과 같은 방법으로 생성한다.
| |
| | | |
− | <math> WK_{i} = \begin{cases} MK_{i+12} & , & 0 \le i \le 3 \\ MK_{i-4} & , & 4 \le i \le 7\end{cases} </math><br> | + | <math> SK_{i}, i=0,\cdots ,127 </math> |
| + | <math> WK_{i}, i=0,\cdots ,7 </math> |
| | | |
− | ==== 2.2. LFSR(Left Feedback Shift Register) <math>h</math> ====
| + | 산술 연산 기호 |
− | LFSR <math>h</math>의 연결 다항식은 <math> x^{7}+x^{3}+1 </math>이다. 이 다항식은 <math> F_2[x] </math>에서 원시다항식이기 때문에 <math>h</math>는 <math> 2^{7}-1=127 </math>의 주기를 갖는다. <math>h</math>의 초기 내부 상태 값은 <math> \delta_{0}=(s_{6},s_{5},s_{4},s_{3},s_{2},s_{1},s_{0})=(1,0,1,1,0,1,0)_{2} </math>으로 정해진다. 그러면 <math>i=1,\cdots,127</math>에 대하여 <math> \delta_{i} </math>는 다음과 같이 생성된다.
| |
| | | |
− | :::<math> s_{i+6}=s_{i+2} \oplus s_{i-1}, </math><br> | + | ⊞ : 법 <math> 2^{8} </math> 덧셈 |
− | :::<math> \delta_{i}=(s_{i+6},s_{i+5},s_{i+4},s_{i+3},s_{i+2},s_{i+1},s_{i}), </math> <math>1 \le i \le 127</math><br> | + | ⊟ : 법 <math> 2^{8} </math> 뺄셈 |
| + | ⊕ : XOR (배타적 논리합) |
| + | <math> A^{<<8} </math> : 8비트 값 A에 대한 8비트 좌측 순환 이동 |
| | | |
− | <math>h</math>의 주기가 127이기 때문에 <math> \delta_{0}=\delta_127 </math>이다.
| + | === 키 스케줄 === |
| + | HIGHT의 라운드키는 화이트닝키와 LFSR을 사용하여 생성한 서브키들로 이루어진다. |
| | | |
− | ==== 2.3. 서브키 생성 ====
| + | * '''화이트닝키 생성''' |
− | 서브키를 생성하는 알고리즘은 다음과 같이 구성된다.
| + | : 화이트닝키는 마스터키를 사용하여 다음과 같은 방법으로 생성한다. |
| | | |
− | :<math> For \ i=0 \ to \ 7 </math>
| + | <math> WK_{i} = \begin{cases} MK_{i+12} & , & 0 \le i \le 3 \\ MK_{i-4} & , & 4 \le i \le 7\end{cases} </math><br> |
− | ::<math> For \ j=0 \ to \ 7 </math>
| |
− | :::<math> SK_{16 \cdot i+j} \leftarrow MK_{j-i mod8} \boxplus \delta_{16 \cdot i+j}</math>;
| |
− | ::<math> For \ j=0 \ to \ 7 </math>
| |
− | :::<math> SK_{16 \cdot i+j+8} \leftarrow MK_{(j-i mod8)+8} \boxplus \delta_{16 \cdot i+j+8}</math>;
| |
| | | |
− | <math> \delta_{i} \ (0 \le i \le 127) </math>는 LFSR <math>h</math>의 내부 상태의 값들이다. | + | * '''LFSR(Left Feedback Shift Register) <math>h</math>''' |
| + | : LFSR <math>h</math>의 연결 다항식은 <math> x^{7}+x^{3}+1 </math>이다. 이 다항식은 <math> F_2[x] </math>에서 원시다항식이기 때문에 <math>h</math>는 <math> 2^{7}-1=127 </math>의 주기를 갖는다. <math>h</math>의 초기 내부 상태 값은 <math> \delta_{0}=(s_{6},s_{5},s_{4},s_{3},s_{2},s_{1},s_{0})=(1,0,1,1,0,1,0)_{2} </math>으로 정해진다. 그러면 <math>i=1,\cdots,127</math>에 대하여 <math> \delta_{i} </math>는 다음과 같이 생성된다. |
| | | |
− | ==== 2.4. 암호화키 생성 ==== | + | <math> s_{i+6}=s_{i+2} \oplus s_{i-1}, </math><br> |
− | HIGHT의 암호화 알고리즘이 수행되기 위하여 라운드키 생성과정은 바이트 단위의 8개의 화이트닝키(<math> WK_{0},\cdots,WK_{7} </math>)와 128개의 서브키(<math> SK_{0},\cdots,SK_{127} </math>)를 생성한다.
| + | <math> \delta_{i}=(s_{i+6},s_{i+5},s_{i+4},s_{i+3},s_{i+2},s_{i+1},s_{i}), </math> <math>1 \le i \le 127</math><br> |
| | | |
− | ==== 2.5. 복호화키 생성 ====
| + | : <math>h</math>의 주기가 127이기 때문에 <math> \delta_{0}=\delta_{127} </math>이다. |
− | HIGHT의 복호화 알고리즘은 암호화 알고리즘과 같은 화이트닝키와 서브키 바이트들을 이용하지만 순서가 다르다. 복호화 알고리즘에서는 <math> WK_{4},WK_{5},WK_{6},WK_{7} </math>이 초기 변환에, <math> WK_{0},WK_{1},WK_{2},WK_{3} </math>이 최종 변환에 사용된다. 복호화 알고리즘에서 사용되는 서브키 바이트들은 <math> SK'_{i} </math>로 표시되며, 다음과 같이 정의된다.
| |
| | | |
− | :::<math> SK'_{i}=SK_{127-i}, </math> <math>i=0,\cdots,127</math> | + | * '''서브키 생성''' |
| + | : 서브키를 생성하는 알고리즘은 다음과 같이 구성된다. |
| | | |
− | === 3. 암호화 === | + | <math> For \ i=0 \ to \ 7 </math> |
| + | <math> For \ j=0 \ to \ 7 </math> |
| + | <math> SK_{16 \cdot i+j} \leftarrow MK_{j-i \ mod8} \boxplus \delta_{16 \cdot i+j}</math>; |
| + | <math> For \ j=0 \ to \ 7 </math> |
| + | <math> SK_{16 \cdot i+j+8} \leftarrow MK_{(j-i \ mod8)+8} \boxplus \delta_{16 \cdot i+j+8}</math>;<br> |
| | | |
− | ==== 3.1. 암호화 초기 변환 ====
| + | : <math> \delta_{i} \ (0 \le i \le 127) </math>는 LFSR <math>h</math>의 내부 상태의 값들이다. |
| | | |
− | HIGHT 암호화의 초기 변환은 네 개의 화이트닝키 바이트(<math> WK_{0},WK_{1},WK_{2},WK_{3} </math>)를 이용하여 평문 <math>P</math>를 첫 번째 라운드 함수의 입력인 <math> X_{0}=X_{0,7} \ || \ X_{0,6} \ || \cdots || \ X_{0,0} </math>
| + | * '''암호화키 생성''' |
− | 로 변환한다.
| + | : HIGHT의 암호화 알고리즘이 수행되기 위하여 라운드키 생성과정은 바이트 단위의 8개의 화이트닝키(<math> WK_{0},\cdots,WK_{7} </math>)와 128개의 서브키(<math> SK_{0},\cdots,SK_{127} </math>)를 생성한다. |
| | | |
− | :<math> X_{0,i}=P_{i}, \quad i=1,3,5,7 </math> | + | * '''복호화키 생성''' |
− | :<math> X_{0,0}=P_{0} \boxplus WK_{0} </math>
| + | : HIGHT의 복호화 알고리즘은 암호화 알고리즘과 같은 화이트닝키와 서브키 바이트들을 이용하지만 순서가 다르다. 복호화 알고리즘에서는 <math> WK_{4},WK_{5},WK_{6},WK_{7} </math>이 초기 변환에, <math> WK_{0},WK_{1},WK_{2},WK_{3} </math>이 최종 변환에 사용된다. 복호화 알고리즘에서 사용되는 서브키 바이트들은 <math> SK'_{i} </math>로 표시되며, 다음과 같이 정의된다. |
− | :<math> X_{0,2}=P_{2} \oplus WK_{1} </math>
| |
− | :<math> X_{0,4}=P_{4} \boxplus WK_{2} </math>
| |
− | :<math> X_{0,6}=P_{6} \oplus WK_{3} </math>
| |
| | | |
− | ==== 3.2. 암호화 라운드 함수 ==== | + | <math> SK'_{i}=SK_{127-i}, </math> <math>i=0,\cdots,127</math> |
| | | |
− | HIGHT의 라운드 함수는 다음과 같은 두개의 보조 함수를 갖는다.
| + | === 암호화 === |
| + | * '''암호화 초기 변환''' |
| + | : HIGHT 암호화의 초기 변환은 네 개의 화이트닝키 바이트(<math> WK_{0},WK_{1},WK_{2},WK_{3} </math>)를 이용하여 평문 <math>P</math>를 첫 번째 라운드 함수의 입력인 <math> X_{0}=X_{0,7} \ || \ X_{0,6} \ || \cdots || \ X_{0,0} </math>로 변환한다. |
| | | |
− | :<math> F_{0}(X)=X^{<<1} \oplus X^{<<2} \oplus X^{<<7} </math>
| + | <math> X_{0,i}=P_{i}, \quad i=1,3,5,7 </math> |
− | :<math> F_{1}(X)=X^{<<3} \oplus X^{<<4} \oplus X^{<<6} </math>
| + | <math> X_{0,0}=P_{0} \boxplus WK_{0} </math> |
| + | <math> X_{0,2}=P_{2} \oplus WK_{1} </math> |
| + | <math> X_{0,4}=P_{4} \boxplus WK_{2} </math> |
| + | <math> X_{0,6}=P_{6} \oplus WK_{3} </math> |
| | | |
− | 라운드 함수는 <math> Round_{1} </math> 부터 <math> Round_{32} </math>까지 32회 반복한다. | + | * '''암호화 라운드 함수''' |
− | 각 <math>i</math>번째 라운드 함수 <math> Round_{i}, \ i=1, \cdots, \ 31 </math>는 <math> X_{i-1}=X_{i-1,7} \ || \cdots || \ X_{i-1,0} </math>를 <math> X_{i}=X_{i,7} \ || \cdots || \ X_{i,0} </math>와 같이 변화한다.
| + | : HIGHT의 라운드 함수는 다음과 같은 두개의 보조 함수를 갖는다. |
| | | |
− | :<math> X_{i,j}=X{i-1,j-1},j=1,3,5,7 </math>
| + | <math> F_{0}(X)=X^{<<1} \oplus X^{<<2} \oplus X^{<<7} </math> |
− | :<math> X_{i,0}=X{i-1,7} \oplus (F_{0}(X_{i-1,6}) \boxplus SK_{4i-1}) </math>
| + | <math> F_{1}(X)=X^{<<3} \oplus X^{<<4} \oplus X^{<<6} </math> |
− | :<math> X_{i,2}=X{i-1,1} \oplus (F_{0}(X_{i-1,0}) \boxplus SK_{4i-4}) </math>
| |
− | :<math> X_{i,4}=X{i-1,3} \oplus (F_{0}(X_{i-1,2}) \boxplus SK_{4i-3}) </math>
| |
− | :<math> X_{i,6}=X{i-1,5} \oplus (F_{0}(X_{i-1,4}) \boxplus SK_{4i-2}) </math>
| |
| | | |
− | 마지막 라운드 함수(<math> Round_{32} </math>)에서는 바이트들을 섞지 않는다. 따라서 입력값 <math> X_{31}=X_{31,7} \ || \cdots || \ X_{31,0} </math>으로부터 출력값 <math> X_{32}=X_{32,7} || \cdots || X_{32,0} </math>은 다음과 같이 계산된다.
| + | : 라운드 함수는 <math> Round_{1} </math> 부터 <math> Round_{32} </math>까지 32회 반복한다. |
| + | : 각 <math>i</math>번째 라운드 함수 <math> Round_{i}, \ i=1, \cdots, \ 31 </math>는 <math> X_{i-1}=X_{i-1,7} \ || \cdots || \ X_{i-1,0} </math>를 <math> X_{i}=X_{i,7} \ || \cdots || \ X_{i,0} </math>와 같이 변화한다. |
| | | |
− | :<math> X_{32,i}=X{31,i}, \ i=0,2,4,6 </math>
| + | <math> X_{i,j}=X{i-1,j-1},j=1,3,5,7 </math> |
− | :<math> X_{32,1}=X{31,1}, \boxplus (F_{1}(X_{31,0}) \oplus SK_{124} </math>
| + | <math> X_{i,0}=X{i-1,7} \oplus (F_{0}(X_{i-1,6}) \boxplus SK_{4i-1}) </math> |
− | :<math> X_{32,3}=X{31,3}, \oplus (F_{0}(X_{31,2}) \boxplus SK_{125} </math>
| + | <math> X_{i,2}=X{i-1,1} \oplus (F_{0}(X_{i-1,0}) \boxplus SK_{4i-4}) </math> |
− | :<math> X_{32,5}=X{31,5}, \boxplus (F_{1}(X_{31,4}) \oplus SK_{126} </math>
| + | <math> X_{i,4}=X{i-1,3} \oplus (F_{0}(X_{i-1,2}) \boxplus SK_{4i-3}) </math> |
− | :<math> X_{32,7}=X{31,7}, \oplus (F_{0}(X_{31,6}) \boxplus SK_{127} </math>
| + | <math> X_{i,6}=X{i-1,5} \oplus (F_{0}(X_{i-1,4}) \boxplus SK_{4i-2}) </math> |
| | | |
− | ==== 3.3. 암호화 최종 변환 ==== | + | : 마지막 라운드 함수(<math> Round_{32} </math>)에서는 바이트들을 섞지 않는다. 따라서 입력값 <math> X_{31}=X_{31,7} \ || \cdots || \ X_{31,0} </math>으로부터 출력값 <math> X_{32}=X_{32,7} || \cdots || X_{32,0} </math>은 다음과 같이 계산된다. |
| | | |
− | HIGHT의 최종 변환은 <math> Round_{32} </math>의 출력인 <math> X_{32}=X_{32,7} \ || \cdots || \ X_{32,0} </math>을 4개의 화이트닝키(<math> WK_{4},WK_{5},WK_{6},WK_{7} </math>)를 이용하여 변환한다.
| + | <math> X_{32,i}=X{31,i}, \ i=0,2,4,6 </math> |
| + | <math> X_{32,1}=X{31,1}, \boxplus (F_{1}(X_{31,0}) \oplus SK_{124} </math> |
| + | <math> X_{32,3}=X{31,3}, \oplus (F_{0}(X_{31,2}) \boxplus SK_{125} </math> |
| + | <math> X_{32,5}=X{31,5}, \boxplus (F_{1}(X_{31,4}) \oplus SK_{126} </math> |
| + | <math> X_{32,7}=X{31,7}, \oplus (F_{0}(X_{31,6}) \boxplus SK_{127} </math> |
| | | |
− | :<math> C_{i}=X_{32,i}, \ i=1,3,5,7 </math> | + | * '''암호화 최종 변환''' |
− | :<math> C_{0}=X_{32,0} \boxplus WK_{4} </math>
| + | : HIGHT의 최종 변환은 <math> Round_{32} </math>의 출력인 <math> X_{32}=X_{32,7} \ || \cdots || \ X_{32,0} </math>을 4개의 화이트닝키(<math> WK_{4},WK_{5},WK_{6},WK_{7} </math>)를 이용하여 변환한다. |
− | :<math> C_{2}=X_{32,2} \oplus WK_{5} </math>
| |
− | :<math> C_{4}=X_{32,4} \boxplus WK_{6} </math>
| |
− | :<math> C_{6}=X_{32,6} \oplus WK_{7} </math>
| |
| | | |
− | === 4. 복호화 === | + | <math> C_{i}=X_{32,i}, \ i=1,3,5,7 </math> |
| + | <math> C_{0}=X_{32,0} \boxplus WK_{4} </math> |
| + | <math> C_{2}=X_{32,2} \oplus WK_{5} </math> |
| + | <math> C_{4}=X_{32,4} \boxplus WK_{6} </math> |
| + | <math> C_{6}=X_{32,6} \oplus WK_{7} </math> |
| | | |
| + | === 복호화 === |
| HIGHT의 복호화 알고리즘은 암호화 알고리즘과 마찬가지로 라운드키 생성과정, 초기 변환(암호화 최종 변환의 역변환), 라운드 함수 32회 반복, 최종 변환(암호화 초기 변환의 역변환)으로 구성되어 있다. 복호화 알고리즘에서의 중간값은 <math> X^{'}_{i}=X^{'}_{i,7} \ || \cdots || \ X^{'}_{i,0}, \ i=0, \cdots, 32 </math>로 표시된다. | | HIGHT의 복호화 알고리즘은 암호화 알고리즘과 마찬가지로 라운드키 생성과정, 초기 변환(암호화 최종 변환의 역변환), 라운드 함수 32회 반복, 최종 변환(암호화 초기 변환의 역변환)으로 구성되어 있다. 복호화 알고리즘에서의 중간값은 <math> X^{'}_{i}=X^{'}_{i,7} \ || \cdots || \ X^{'}_{i,0}, \ i=0, \cdots, 32 </math>로 표시된다. |
| | | |
− | ==== 4.1. 복호화 초기변환 ====
| + | * '''복호화 초기변환''' |
| + | : 복호화 알고리즘의 초기 변환은 암호화 알고리즘의 최종 변환에 대한 역변환이다. 이 함수는 4개의 화이트닝키(<math> WK_{4}, WK_{5}, WK_{6}, WK_{7} </math>)를 이용하여 암호문 <math>C</math>를 복호화 알고리즘의 첫 번째 라운드 함수의 입력값(<math> X^{'}_{0,i}=X^{'}_{0,7}, \ || \cdots || \ X^{'}_{0,0} </math>)으로 다음과 같이 변환한다. |
| | | |
− | 복호화 알고리즘의 초기 변환은 암호화 알고리즘의 최종 변환에 대한 역변환이다. 이 함수는 4개의 화이트닝키(<math> WK_{4}, WK_{5}, WK_{6}, WK_{7} </math>)를 이용하여 암호문 <math>C</math>를 복호화 알고리즘의 첫 번째 라운드 함수의 입력값(<math> X^{'}_{0,i}=X^{'}_{0,7}, \ || \cdots || \ X^{'}_{0,0} </math>)으로 다음과 같이 변환한다.
| + | <math> X^{'}_{0,i}=C_{i}, \ i=1,3,5,7 </math> |
| + | <math> X^{'}_{0,0}=C_{0} \boxminus WK_{4} </math> |
| + | <math> X^{'}_{0,2}=C_{2} \oplus WK_{5} </math> |
| + | <math> X^{'}_{0,4}=C_{4} \boxminus WK_{6} </math> |
| + | <math> X^{'}_{0,6}=C_{6} \oplus WK_{7} </math> |
| | | |
− | :<math> X^{'}_{0,i}=C_{i}, \ i=1,3,5,7 </math> | + | * '''복호화 라운드 함수''' |
− | :<math> X^{'}_{0,0}=C_{0} \boxminus WK_{4} </math>
| + | : 복호화 알고리즘의 <math>i</math>번째 라운드 함수를 <math> Round^{'}_{i}, \ i=1, \cdots, 32 </math>로 표시한다.<br><math>i</math>번째 라운드 함수 <math> Round^{'}_{i} </math>는 <math> X^{'}_{i-1}=X^{'}_{i-1,7} \ || \cdots || \ X^{'}_{i-1,0} </math>를 <math> X^{'}_{i}=X^{'}_{i,7} \ || \cdots || \ X^{'}_{i,0} </math>로 다음과 같이 변환한다. |
− | :<math> X^{'}_{0,2}=C_{2} \oplus WK_{5} </math>
| |
− | :<math> X^{'}_{0,4}=C_{4} \boxminus WK_{6} </math>
| |
− | :<math> X^{'}_{0,6}=C_{6} \oplus WK_{7} </math>
| |
| | | |
− | ==== 4.2. 복호화 라운드 함수 ==== | + | <math> X^{'}_{i,j}=X^{'}_{i-1,j+1 \ mod8}, \ j=1,3,5,7 </math> |
| + | <math> X^{'}_{0,0}=X^{'}_{i-1,1} \boxminus (F_{1}(X^{'}_{i-1,0}) \oplus SK^{'}_{4i-1}) </math> |
| + | <math> X^{'}_{0,2}=X^{'}_{i-1,3} \oplus (F_{0}(X^{'}_{i-1,2}) \boxplus SK^{'}_{4i-2}) </math> |
| + | <math> X^{'}_{0,4}=X^{'}_{i-1,5} \boxminus (F_{1}(X^{'}_{i-1,4}) \oplus SK^{'}_{4i-3}) </math> |
| + | <math> X^{'}_{0,6}=X^{'}_{i-1,7} \oplus (F_{0}(X^{'}_{i-1,6}) \boxplus SK^{'}_{4i-4}) </math> |
| | | |
− | 복호화 알고리즘의 <math>i</math>번째 라운드 함수를 <math> Round^{'}_{i}, \ i=1, \cdots, 32 </math>로 표시한다.<br><math>i</math>번째 라운드 함수 <math> Round^{'}_{i} </math>는 <math> X^{'}_{i-1}=X^{'}_{i-1,7} \ || \cdots || \ X^{'}_{i-1,0} </math>를 <math> X^{'}_{i}=X^{'}_{i,7} \ || \cdots || \ X^{'}_{i,0} </math>로 다음과 같이 변환한다.
| + | : 암호화 알고리즘에서와 마찬가지로, 마지막 라운드 함수(<math> Round^{'}_{32} </math>)에서는 바이트들을 섞지 않는다. 따라서 다음과 같이 연산된다. |
| | | |
− | :<math> X^{'}_{i,j}=X^{'}_{i-1,j+1 \ mod8}, \ j=1,3,5,7 </math>
| + | <math> X^{'}_{32,i}=X^{'}_{31,i}, \ i=0,2,4,6 </math> |
− | :<math> X^{'}_{0,0}=X^{'}_{i-1,1} \boxminus (F_{1}(X^{'}_{i-1,0}) \oplus SK^{'}_{4i-1}) </math>
| + | <math> X^{'}_{32,1}=X^{'}_{31,1} \boxminus (F_{1}(X^{'}_{31,0}) \oplus SK^{'}_{127}) </math> |
− | :<math> X^{'}_{0,2}=X^{'}_{i-1,3} \oplus (F_{0}(X^{'}_{i-1,2}) \boxplus SK^{'}_{4i-2}) </math>
| + | <math> X^{'}_{32,3}=X^{'}_{31,3} \oplus (F_{0}(X^{'}_{31,2}) \boxplus SK^{'}_{126}) </math> |
− | :<math> X^{'}_{0,4}=X^{'}_{i-1,5} \boxminus (F_{1}(X^{'}_{i-1,4}) \oplus SK^{'}_{4i-3}) </math>
| + | <math> X^{'}_{32,5}=X^{'}_{31,5} \boxminus (F_{1}(X^{'}_{31,4}) \oplus SK^{'}_{125}) </math> |
− | :<math> X^{'}_{0,6}=X^{'}_{i-1,7} \oplus (F_{0}(X^{'}_{i-1,6}) \boxplus SK^{'}_{4i-4}) </math>
| + | <math> X^{'}_{32,7}=X^{'}_{31,7} \oplus (F_{0}(X^{'}_{31,6}) \boxplus SK^{'}_{124}) </math> |
| | | |
− | 암호화 알고리즘에서와 마찬가지로, 마지막 라운드 함수(<math> Round^{'}_{32} </math>)에서는 바이트들을 섞지 않는다. 따라서 다음과 같이 연산된다. | + | * '''복호화 최종 변환''' |
| + | : 복호화 알고리즘의 최종 변환은 암호화 알고리즘에서의 초기 변환에 대한 역변환이다. 이 함수는 네 개의 화이트닝키(<math> |
| + | X^{'}_{32}=X^{'}_{32,7} \ || \cdots || \ X^{'}_{32,0} </math>)를 평문 <math>P</math>로 변환한다. |
| | | |
− | :<math> X^{'}_{32,i}=X^{'}_{31,i}, \ i=0,2,4,6 </math>
| + | <math> P_{i}=X^{'}_{32,i}, \ i=1,3,5,7 </math> |
− | :<math> X^{'}_{32,1}=X^{'}_{31,1} \boxminus (F_{1}(X^{'}_{31,0}) \oplus SK^{'}_{127}) </math>
| + | <math> P_{0}=X^{'}_{32,0} \boxminus WK_{0} </math> |
− | :<math> X^{'}_{32,3}=X^{'}_{31,3} \oplus (F_{0}(X^{'}_{31,2}) \boxplus SK^{'}_{126}) </math>
| + | <math> P_{2}=X^{'}_{32,2} \oplus WK_{1} </math> |
− | :<math> X^{'}_{32,5}=X^{'}_{31,5} \boxminus (F_{1}(X^{'}_{31,4}) \oplus SK^{'}_{125}) </math>
| + | <math> P_{4}=X^{'}_{32,4} \boxminus WK_{2} </math> |
− | :<math> X^{'}_{32,7}=X^{'}_{31,7} \oplus (F_{0}(X^{'}_{31,6}) \boxplus SK^{'}_{124}) </math>
| + | <math> P_{6}=X^{'}_{32,6} \oplus WK_{3} </math><ref>"[https://hbisland.tistory.com/attachment/cfile25.uf@1815FE0B4C0C679143B3E3.pdf HIGHT 블록암호 알고리즘 사양 및 세부 명세서]", 2009-07 </ref> |
| | | |
− | ==== 4.3. 복호화 최종 변환 ==== | + | == 전망 == |
| + | 기술표준원에서는 국산 암호화 기술이 [[스마트폰]], [[USN]], 유비쿼터스 도시(U-City), 유비쿼터스 헬스(U-Health) 등 [[유비쿼터스]] 환경에서 널리 활용될 수 있도록 중소기업을 포함한 산학연을 대상으로 무료로 소스코드를 배포하는 등 암호이용 활성화를 위해 지속적으로 지원할 계획이라고 한다.<ref> 오병민기자, 〈[https://www.boannews.com/media/view.asp?idx=21392&kind=3&search=title&find=HIGHT 스마트폰용 국산 경량 암호화 기술 국제표준으로 채택]〉, 《보안뉴스》, 2010-06-08 </ref> |
| | | |
− | 복호화 알고리즘의 최종 변환은 암호화 알고리즘에서의 초기 변환에 대한 역변환이다. 이 함수는 네 개의 화이트닝키(<math>
| + | {{각주}} |
− | X^{'}_{32}=X^{'}_{32,7} \ || \cdots || \ X^{'}_{32,0} </math>을 평문 <math>P</math>로 변환한다.
| |
| | | |
− | :<math> P_{i}=X^{'}_{32,i}, \ i=1,3,5,7 </math>
| + | == 참고자료 == |
− | :<math> P_{0}=X^{'}_{32,0} \boxminus WK_{0} </math>
| + | * 경수, 〈[https://blog.naver.com/rudtn082/220923768132 HIGHT 암호 알고리즘에 대해]〉, 《네이버 블로그》 , 2017-01-31 |
− | :<math> P_{2}=X^{'}_{32,2} \oplus WK_{1} </math>
| + | * 한국인터넷진흥원, "[https://hbisland.tistory.com/attachment/cfile25.uf@1815FE0B4C0C679143B3E3.pdf HIGHT 블록암호 알고리즘 사양 및 세부 명세서]", 2009-07 |
− | :<math> P_{4}=X^{'}_{32,4} \boxminus WK_{2} </math>
| + | * 오병민기자, "[https://www.boannews.com/media/view.asp?idx=21392&kind=3&search=title&find=HIGHT 스마트폰용 국산 경량 암호화 기술 국제표준으로 채택]" 《보안뉴스》, 2010-06-08 |
− | :<math> P_{6}=X^{'}_{32,6} \oplus WK_{3} </math><ref>"[https://hbisland.tistory.com/attachment/cfile25.uf@1815FE0B4C0C679143B3E3.pdf HIGHT 블록암호 알고리즘 사양 및 세부 명세서]", 2009-07 </ref>
| |
− | | |
− | == 전망 ==
| |
− | 국산 암호화 기술이 [[스마트폰]], [[USN]], [[U-City]], [[U-Health]]등 [[유비쿼터스]] 환경에서 널리 활용될 수 있도록 중소기업을 포함한 산학연(산업계, 학계, 연구분야)을 대상으로 무료로 소스코드를 배포하는 등 암호이용 활성화를 위해 지속적으로 지원할 계획이라고 한다.<ref> 오병민기자, "[https://www.boannews.com/media/view.asp?idx=21392&kind=3&search=title&find=HIGHT 스마트폰용 국산 경량 암호화 기술 국제표준으로 채택]" 《보안뉴스》, 2010-06-08 </ref>
| |
| | | |
− | {{알고리즘|토막글}} | + | {{암호 알고리즘|검토 필요}} |
HIGHT(HIGh security and light weigHT)는 GFS구조의 64비트 경량 블록 암호 알고리즘이다. 저전력 및 경량화를 요구하는 컴퓨팅 환경 혹은 모바일 환경에서 기밀성을 제공하기 위해 개발되었다. 2005년 KISA, ETRI 부설연구소 및 고려대가 공동으로 개발했다.
HIGHT는 RFID, USN 등과 같이 저전력 및 경량화를 요구하는 컴퓨팅 환경, 혹은 스마트폰, 스마트카드 및 RFID등과 같이 저전력, 경량화를 요구하는 모바일 환경에서 기밀성을 제공하기 위해 개발된 블록 암호화 알고리즘이다. 이는 휴대형 기기 및 모바일 환경에 적합하도록 특수 설계되었고, 전력 소비가 적도록 개발되었다. 또한 8비트 단위의 기본적인 산술연산, XOR, 순환이동만으로 사용가능 하도록 간단구조로 설계되었다. HIGHT는 128비트 국산암호화 알고리즘 SEED에 비해 제한된 환경에 적용하기 위해 매우 간단한 구조의 안전성, 효율성을 동시에 고려하였으며, 메모리와 같은 하드웨어 자원이 부족한 환경에 적합하도록 일반적인 블록 암호화 알고리즘과는 다르게 S-Box(Substitution-box)를 제거하였다. 2006년 12월에는 정보통신단체 표준으로, 2010년 12월에는 ISO/IEC 국제 표준으로 제정되었다.[1]
알고리즘[편집]
HIGHT 알고리즘은 전체적으로 일반화된 Feistel 변형 구조로 이루어져 있으며, 64비트의 평문과 128비트의 키로부터 생성된 8개의 8비트 화이트닝키와 128개의 8비트 서브키를 입력으로 사용함으로써 총 32라운드를 거쳐서 64비트 암호문을 출력한다.
기호와 표기[편집]
64비트 평문과 암호문은 각각 8개의 바이트로 다음과 같다.
* 평문 :
* 암호문 :
64비트 라운드 함수 입·출력은 8개의 바이트로 다음과 같다.
128비트 키(마스터키)는 16개의 바이트로 다음과 같다.
라운드 함수에 적용되는 라운드키는 서브키()와 화이트닝키()로 다음과 같다.
산술 연산 기호
⊞ : 법 덧셈
⊟ : 법 뺄셈
⊕ : XOR (배타적 논리합)
: 8비트 값 A에 대한 8비트 좌측 순환 이동
키 스케줄[편집]
HIGHT의 라운드키는 화이트닝키와 LFSR을 사용하여 생성한 서브키들로 이루어진다.
- 화이트닝키는 마스터키를 사용하여 다음과 같은 방법으로 생성한다.
- LFSR(Left Feedback Shift Register)
- LFSR 의 연결 다항식은 이다. 이 다항식은 에서 원시다항식이기 때문에 는 의 주기를 갖는다. 의 초기 내부 상태 값은 으로 정해진다. 그러면 에 대하여 는 다음과 같이 생성된다.
- 의 주기가 127이기 때문에 이다.
- 서브키를 생성하는 알고리즘은 다음과 같이 구성된다.
;
;
- 는 LFSR 의 내부 상태의 값들이다.
- HIGHT의 암호화 알고리즘이 수행되기 위하여 라운드키 생성과정은 바이트 단위의 8개의 화이트닝키()와 128개의 서브키()를 생성한다.
- HIGHT의 복호화 알고리즘은 암호화 알고리즘과 같은 화이트닝키와 서브키 바이트들을 이용하지만 순서가 다르다. 복호화 알고리즘에서는 이 초기 변환에, 이 최종 변환에 사용된다. 복호화 알고리즘에서 사용되는 서브키 바이트들은 로 표시되며, 다음과 같이 정의된다.
암호화[편집]
- HIGHT 암호화의 초기 변환은 네 개의 화이트닝키 바이트()를 이용하여 평문 를 첫 번째 라운드 함수의 입력인 로 변환한다.
- HIGHT의 라운드 함수는 다음과 같은 두개의 보조 함수를 갖는다.
- 라운드 함수는 부터 까지 32회 반복한다.
- 각 번째 라운드 함수 는 를 와 같이 변화한다.
- 마지막 라운드 함수()에서는 바이트들을 섞지 않는다. 따라서 입력값 으로부터 출력값 은 다음과 같이 계산된다.
- HIGHT의 최종 변환은 의 출력인 을 4개의 화이트닝키()를 이용하여 변환한다.
복호화[편집]
HIGHT의 복호화 알고리즘은 암호화 알고리즘과 마찬가지로 라운드키 생성과정, 초기 변환(암호화 최종 변환의 역변환), 라운드 함수 32회 반복, 최종 변환(암호화 초기 변환의 역변환)으로 구성되어 있다. 복호화 알고리즘에서의 중간값은 로 표시된다.
- 복호화 알고리즘의 초기 변환은 암호화 알고리즘의 최종 변환에 대한 역변환이다. 이 함수는 4개의 화이트닝키()를 이용하여 암호문 를 복호화 알고리즘의 첫 번째 라운드 함수의 입력값()으로 다음과 같이 변환한다.
- 복호화 알고리즘의 번째 라운드 함수를 로 표시한다.
번째 라운드 함수 는 를 로 다음과 같이 변환한다.
- 암호화 알고리즘에서와 마찬가지로, 마지막 라운드 함수()에서는 바이트들을 섞지 않는다. 따라서 다음과 같이 연산된다.
- 복호화 알고리즘의 최종 변환은 암호화 알고리즘에서의 초기 변환에 대한 역변환이다. 이 함수는 네 개의 화이트닝키()를 평문 로 변환한다.
[2]
기술표준원에서는 국산 암호화 기술이 스마트폰, USN, 유비쿼터스 도시(U-City), 유비쿼터스 헬스(U-Health) 등 유비쿼터스 환경에서 널리 활용될 수 있도록 중소기업을 포함한 산학연을 대상으로 무료로 소스코드를 배포하는 등 암호이용 활성화를 위해 지속적으로 지원할 계획이라고 한다.[3]
참고자료[편집]
이 HIGHT 문서는 암호 알고리즘에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.
|
블록체인 : 블록체인 기술, 합의 알고리즘, 암호 알고리즘 □■⊕, 알고리즘, 블록체인 플랫폼, 블록체인 솔루션, 블록체인 서비스
|
|
암호기술
|
개인키 • 경량암호 • 다자간 계산(MPC) • 다중서명(멀티시그) • 동형암호 • 디지털서명 • 링서명 • 배타적 논리합(XOR) • 복호화 • 블랙박스 암호 • 서명 • 소수 • 소인수분해 • 슈노르서명 • 스케인 • 스키테일 • 스테가노그래피 • 안전한 다자간 계산(SMPC) • 암호 • 암호경제학 • 암호문 • 암호키 • 암호학 • 암호화 • 이산로그 • 전자봉투 • 전자서명 • 전치암호 • 종단간 암호화 • 치환암호(대체암호) • 키 • 패딩 • 패스워드 • 평문 • 합성수 • 해독 • 해시 • 형태보존암호 • 혼돈 • 화이트박스 암호 • 확산
|
|
논리연산
|
논리곱(AND) • 논리연산 • 논리합(OR) • 배타적 논리합(XOR) • 부울곱 • 부울대수 • 부울합 • 부정논리곱(NAND) • 부정논리합(NOR) • 부정연산(NOT)
|
|
SHA
|
SHA • SHA0 • SHA1 • SHA2 • SHA224 • SHA256 • SHA384 • SHA512 • SHA512/224 • SHA512/256 • SHA3 • SHA3-224 • SHA3-256 • SHA3-384 • SHA3-512
|
|
MD
|
MD • MD2 • MD4 • MD5 • RIPEMD • RIPEMD-128 • RIPEMD-160 • RIPEMD-256 • RIPEMD-320
|
|
기타 해시
|
CRC-16 • CRC-32 • CRC-64 • Keccak-256 • Keccak-384 • Keccak-512 • Shake-128 • Shake-256 • 베이스32 • 베이스32 파일 • 베이스58 • 베이스64 • 베이스64 파일 • 순환중복검사
|
|
대칭키
|
AES • ARIA(아리아) • DES • HIGHT(하이트) • LEA • SEED(시드) • 대칭키 • 대칭키 암호 알고리즘 • 디피-헬만 • 디피-헬만 키교환 • 레인달 • 블로피시 • 블록암호 • 스트림 암호 • 에스박스(S-Box) • 트리플 DES
|
|
비대칭키
|
PKI • RSA • 공개키 • 공개키 암호 알고리즘 • 비대칭키 • 엘가말 • 타원곡선 • 타원곡선 디지털서명 알고리즘 • 타원곡선암호
|
|
영지식증명
|
영지식 상호 증명(ZKIP) • 영지식 스나크 • 영지식 스타크 • 영지식증명
|
|
양자암호
|
BB84 프로토콜 • E91 프로토콜 • B92 프로토콜 • 비밀키 오류율 • 안전성 증명 • 양자난수생성기 • 양자내성암호 • 양자암호 • 양자얽힘 • 양자역학 • 양자중첩 • 양자컴퓨터 • 양자키 • 양자키분배 • 양자통신 • 연속 변수 프로토콜
|
|
암호해독
|
기지평문공격(KPA) • 선택암호문공격(CCA) • 선택평문공격(CPA) • 암호공격 • 암호문 단독공격(COA) • 암호해독
|
|
암호학 인물
|
라이언 플레이페어 • 레너드 애들먼 • 로널드 리베스트 • 마틴 헬만 • 블레즈 드 비즈네르 • 아디 샤미르 • 앨런 튜링 • 웨슬리 피터슨 • 찰스 휘트스톤 • 휫필드 디피
|
|
위키 : 자동차, 교통, 지역, 지도, 산업, 기업, 단체, 업무, 생활, 쇼핑, 블록체인, 암호화폐, 인공지능, 개발, 인물, 행사, 일반
|
|