Fix
This commit is contained in:
parent
79c64b0b41
commit
91588a8dd7
|
@ -71,56 +71,244 @@ ECC에서 사용하는 타원 곡선의 종류에 따라 암호화 알고리즘
|
|||
ECC는 개인키, 공개키 발급 방식 중 하나이고, DH과 ECC를 엮어서 만든 암호화 방식이 ECDH이며, ECC와 서명 알고리즘을 엮은 것이 ECDSA이다.
|
||||
|
||||
|
||||
### **블록 암호화 알고리즘. (Block Cipher Algorithms)**
|
||||
|
||||
### **블록 암호화 알고리즘.**
|
||||
#### 1. DES (Data Encryption Standard)
|
||||
|
||||
#### 1. DES
|
||||
DES는 64비트 블록을 사용하는 대칭키 블록 암호 알고리즘이다. 암호화 과정은 16 라운드의 Feistel 구조를 기반으로 한다. 각 라운드에서는 데이터는 48비트 서브키(subkey)를 사용하여 변형된다.
|
||||
|
||||
본문
|
||||
Key Schedule Algorithm:
|
||||
- 초기 64비트 키에서 parity check bits를 제외해 56비트로 압축한다.
|
||||
- 압축된 키는 28비트로 두 개의 반으로 나뉜다. $( C_0, D_0 )$
|
||||
- 각 라운드마다 $C_i$와 $D_i$는 라운드에 따라 정해진 수만큼 왼쪽으로 이동(rotated)한다.
|
||||
- 회전 후의 $C_i$와 $D_i$는 결합되어 56비트가 되고, 48비트 서브키를 생성하기 위해 압축 퍼뮤테이션이 적용된다.
|
||||
|
||||
#### 2. AES
|
||||
Encryption Operation:
|
||||
- 초기 평문은 Initial Permutation (IP)을 통해 재배치된다.
|
||||
- 재배치된 평문은 32비트의 두 부분인 $L_0$과 $R_0$으로 나뉜다.
|
||||
- 각 라운드에서 $L_{i+1} = R_i$과 $R_{i+1} = L_i \oplus f(R_i, K_i)$를 계산한다. 여기서 $\oplus$는 bitwise XOR 연산자이고, $f$는 Feistel function, $K_i$는 $i$번째 라운드의 서브키다.
|
||||
- 마지막 라운드 후, 결과는 $R_{16}L_{16}$ 순서로 조합되고 Final Permutation (FP)을 통해 최종 암호문을 생성한다.
|
||||
|
||||
본문
|
||||
Feistel Function:
|
||||
- $f(R_i, K_i)$는 확장 퍼뮤테이션으로 시작하여 $R_i$를 48비트로 확장한다.
|
||||
- 확장된 $R_i$는 서브키 $K_i$와 XOR 연산된다.
|
||||
- 결과는 S-box lookup table을 통해 각각 6비트가 4비트로 변환된다.
|
||||
- S-box 변환 후 32비트 나온 결과에 비선형 변환이 P-box permutation으로 수행된다.
|
||||
|
||||
DES의 보안은 같은 키를 사용해서 여러 데이터를 암호화하는 경우와 56비트 키 길이가 가지는 제한된 키 공간 때문에 줄어들었다.
|
||||
|
||||
#### 2. AES (Advanced Encryption Standard)
|
||||
|
||||
AES는 128, 192, 혹은 256비트 키를 사용하여 128비트 데이터 블록을 암호화한다. AES의 구조는 Rijndael 암호에 기초를 두고 있으며, 라운드 수는 키 길이에 따라 달라진다 (10, 12, 또는 14 라운드).
|
||||
|
||||
Key Expansion:
|
||||
- 라운드 키 생성에 사용되는 Rijndael 키 스케줄은 $W[i-1]$ 에 비선형 변환과 상수의 XOR 연산을 적용하여 $W[i]$ 를 생성한다.
|
||||
- 라운드 상수는 $RC[j]$로 표현되며, 이는 $x$의 멱도로 구성된다. $x$는 갈루아 체 $GF(2^8)$의 생성원이다.
|
||||
|
||||
$$
|
||||
W[i] = W[i-Nk] \oplus \text{SubWord}(W[i-1]) \oplus RC[j]
|
||||
$$
|
||||
|
||||
여기서 $Nk$ 는 키 길이에 따른 워드 수 (4, 6, 또는 8), $RC[j]$ 는 라운드 상수, $\text{SubWord}()$ 는 S-box 변환을 적용한 함수이다.
|
||||
|
||||
Encryption Process:
|
||||
- 평문은 AddRoundKey 스텝을 통해 초기 라운드 키와 XOR 연산된다.
|
||||
- 각 중간 라운드에서는 SubBytes (byte 치환), ShiftRows (행 이동), MixColumns (열 혼합), AddRoundKey (라운드 키 가산) 연산이 순차적으로 수행된다.
|
||||
- 마지막 라운드에서는 MixColumns 스텝이 생략된다.
|
||||
|
||||
SubBytes:
|
||||
- 비선형 S-box 변환은 각 바이트를 갈루아 체 $GF(2^8)$ 의 역원을 구한 후, 아핀 변환을 적용하여 새로운 바이트로 치환한다.
|
||||
|
||||
$$
|
||||
\text{SubBytes}(a) = \text{Affine}(\text{MultiplicativeInverse}(a))
|
||||
$$
|
||||
|
||||
ShiftRows:
|
||||
- 행 별 이동은 사이클릭 퍼뮤테이션을 적용하여 암호화 과정에 확산성을 부여한다.
|
||||
|
||||
MixColumns:
|
||||
- 각 열은 다음 다항식과의 $\text{mod}\ x^4 + 1$ 에서 곱셈 연산을 통해 변환된다.
|
||||
|
||||
$$
|
||||
\begin{bmatrix}
|
||||
02 & 03 & 01 & 01\\
|
||||
01 & 02 & 03 & 01\\
|
||||
01 & 01 & 02 & 03\\
|
||||
03 & 01 & 01 & 02
|
||||
\end{bmatrix}
|
||||
\cdot
|
||||
\begin{bmatrix}
|
||||
b_0\\
|
||||
b_1\\
|
||||
b_2\\
|
||||
b_3
|
||||
\end{bmatrix}
|
||||
$$
|
||||
|
||||
여기서 $b_0, b_1, b_2, b_3$은 현 열의 바이트이며, 행렬 연산은 $GF(2^8)$ 상에서 수행된다.
|
||||
|
||||
AddRoundKey:
|
||||
- 각 라운드 키는 현재 상태와 다음과 같이 XOR 연산된다.
|
||||
|
||||
$$
|
||||
\text{State} \oplus \text{RoundKey}
|
||||
$$
|
||||
|
||||
AES는 모듈러 산술과 갈루아 체(Galois field)를 사용하여 비선형 및 확산적 특성을 갖는다.
|
||||
|
||||
#### 3. SEED
|
||||
|
||||
본문
|
||||
SEED는 한국 인터넷진흥원(KISA)에 의해 개발된 128비트 블록 암호 방식으로, 128비트 키를 사용하며 16 라운드의 Feistel 구조를 따른다.
|
||||
|
||||
Encryption Process:
|
||||
- 128비트 키는 16개의 64비트 서브키로 확장된다.
|
||||
- 초기 평문 블록은 키와 Feistel 네트워크를 통해 가공된다.
|
||||
- 각 라운드의 결과는 두 반으로 이뤄져 있고, 지정된 함수를 통해 연산된 다음, 키와 XOR 연산된다.
|
||||
- 키 확장 과정에서 사용되는 상수는 일련의 알고리즘을 통해 생성되며, 이는 SEED의 보안성을 향상시킨다.
|
||||
|
||||
$$
|
||||
K_i = f(K_{i-1}), \quad \text{where } i = 1, 2, \ldots, 16
|
||||
$$
|
||||
|
||||
여기서 $f()$ 는 키 확장 함수, $K_i$ 는 $i$번째 라운드의 서브키이다.
|
||||
|
||||
Feistel Function:
|
||||
- SEED의 Feistel 함수는 S-box를 통한 비선형 변환과 $GF(2^{32})$에서의 변환을 결합하여 사용한다. S-box의 비선형 특성과 더불어 선형 변환은 암호화 과정에 확산성과 혼돈성을 주입한다.
|
||||
|
||||
각 라운드에서의 연산은 다음과 같은 수학적 표현으로 이루어진다.
|
||||
|
||||
$$
|
||||
\text{left} = \text{right}
|
||||
$$
|
||||
$$
|
||||
\text{right} = \text{left} \oplus F(\text{right}, K_i)
|
||||
$$
|
||||
|
||||
여기서 $F()$ 는 Feistel 함수, $K_i$ 는 라운드 서브키이며, $\text{left}$와 $\text{right}$는 데이터 블록의 두 부분을 의미한다.
|
||||
|
||||
SEED는 높은 보안성과 우수한 성능으로 인해 South Korea 전자정부 및 인터넷 은행 거래에 사용된다.
|
||||
|
||||
#### 4. PRINCE
|
||||
|
||||
PRINCE 블록암호는 AES와 마찬가지로 여러 개의 라운드로 구분되는 블록암호이다. Mix Column부터 ShiftBits까지 AES와 매우 비슷하지만, 연산을 더욱 간단화하고 라운드 수를 줄여 저성능 프로세서에서도 많은 비용과 시간을 들이지 않고도 암호화, 복호화를 진행할 수 있도록 한 암호화 방식이다. 기초적인 것들은 AES와 비슷하므로 바로 암호화, 복호화 과정을 살펴보자. 여기서는 PRINCE-64/128을 기준으로 설명할 것이다. 128bit 비밀키를 이용하여 64비트 키로 분할하여 사용한다는 의미이다.
|
||||
PRINCE는 저전력 환경에 최적화된 경량 블록암호로 AES와 마찬가지로 여러 개의 라운드로 구분된다. Mix Column부터 ShiftBits까지 AES와 매우 비슷하지만, 연산을 더욱 간단화하고 라운드 수를 줄여 저성능 프로세서에서도 많은 비용과 시간을 들이지 않고도 암호화, 복호화를 진행할 수 있도록 한 암호화 방식이다. 기초적인 것들은 AES와 비슷하므로 바로 암호화, 복호화 과정을 살펴보자. 여기서는 PRINCE-64/128을 기준으로 설명할 것이다. 128bit 비밀키를 이용하여 64비트 키로 분할하여 사용한다는 의미이다.
|
||||
|
||||
먼저, 당연하게도 비트열 개수를 맞춰 가공하고, 키의 길이를 확장하는 과정이 필요하다. 그래서 가장 첫단계는 Key Expansion 과정이 있다. 그 후, 화이트닝 과정을 거치고 키를 더하고 라운드 상수를 더하고 S-box연산을 하고, SB연산을 하고 M`연산을 하고 그 역연산을 하고 키를 더 더하고 라운드 상수를 더 더하는 순서로 진행된다. AES의 축소판이라 해도 무방할 만큼 비슷하게 구성된다.
|
||||
PRINCE의 구조는 12 라운드로 구성되며, 상호 역변환되는 라운드 함수를 사용한다.
|
||||
|
||||
1) Key Expansion
|
||||
Encryption/Decryption Process:
|
||||
- PRINCE 알고리즘은 암호화와 복호화 과정이 매우 유사하며, 라운드 키 스케줄이 역순으로 구성된다.
|
||||
- PRINCEcore는 중심 라운드로, 여기에서 상태는 여섯 개의 서브 라운드를 계속 거친다.
|
||||
- 암호화와 복호화는 대칭적인 알파(reflection) 구조를 갖는다. 즉, 전반부와 후반부 라운드가 서로 역변환된다.
|
||||
|
||||
2) Whitening
|
||||
Key Schedule:
|
||||
- 키 스케줄에서, 128비트 키는 두 개의 64비트 부분 키로 나뉘며, 알파 상수를 사용하여 변형된다.
|
||||
|
||||
3) Round I
|
||||
S-box-based Nonlinear Layer:
|
||||
- PRINCE 알고리즘은 비선형성을 부여하기 위해 S-box를 사용한다.
|
||||
|
||||
4) Round II
|
||||
M-Layer (Linear Transformation Layer):
|
||||
- 이 선형 변환층은 확산을 증대시키기 위해 사용된다.
|
||||
|
||||
5) M-Layer
|
||||
위 과정을 통해서 암호화하는 알고리즘을 4-Round 알고리즘이라 하며, 표준 Prince알고리즘은 총 12-Round를 사용한다. 이처럼 연산의 용이성을 위해 라운드를 줄인 Prince를 Round-Reduced Prince라고 한다.
|
||||
PRINCE 알고리즘은 그것의 반사성(reflection property) 덕분에, 암호화 구조가 복호화 구조를 간단하게 반전시키는 방식으로 구현될 수 있다는 점에서 하드웨어 구현 시에 에너지 효율성을 높여준다. 하지만, 4-Round PRINCE-64/128 나 6-Round PRINCE-64/128는 고정키 대입 공격등 Side-Channel 공격에 면역이 없기 때문에 IoT나 소형 기기에서는 적당히 타협하여 12-Round PRINCE-64/128를 사용 한다.
|
||||
|
||||
6) Round III
|
||||
|
||||
7) Round IV
|
||||
### **해시 알고리즘. (Hash Algorithms)**
|
||||
|
||||
8) Whitening
|
||||
#### 1. MD5 (Message-Digest Algorithm 5)
|
||||
|
||||
위 과정을 통해서 암호화하는 알고리즘을 4-Round 알고리즘이라 하며, 표준 Prince알고리즘은 총 12-Round를 사용한다. 이처럼 연산의 용이성을 위해 라운드를 줄인 Prince를 Round-Reduced Prince라고 한다. 4-Round PRINCE-64/128 나 6-Round PRINCE-64/128는 고정키 대입 공격등 Side-Channel공격에 면역이 없기 때문에 IoT나 소형 기기에서는 적당히 타협하여 12-Round PRINCE-64/128를 사용하거나 한다고 한다.
|
||||
MD5는 512비트 메시지 블록을 다루고 128비트 해시 값을 생성한다. MD5의 구성은 다음과 같다:
|
||||
|
||||
### **해시 알고리즘.**
|
||||
Process:
|
||||
- 입력 메시지는 512비트 블록으로 나뉜다.
|
||||
- 각 블록은 압축 함수와 초기 해시 값(또는 이전 블록의 결과)에 의해 처리된다.
|
||||
- 압축 함수는 네 개의 사이클을 사용해서 각 블록을 처리한다.
|
||||
|
||||
#### 1. MD5
|
||||
Compression Function:
|
||||
- 각 사이클은 S-box와 비선형 함수를 사용하며 메시지 블록과 현재 해시 값을 기반으로 연산을 수행한다.
|
||||
- 출력은 이전 해시 상태와 더해진다.
|
||||
|
||||
본문
|
||||
MD5는 충돌 공격에 취약하기 때문에 현재 보안이 중요한 용도에는 권장하지 않는다.
|
||||
|
||||
#### 2. SHA
|
||||
#### 2. SHA (Secure Hash Algorithm)
|
||||
|
||||
본문
|
||||
SHA 패밀리는 다양한 해시 함수들을 포함한다 (SHA-0, SHA-1, SHA-2).
|
||||
|
||||
#### 3. HMAC (?)
|
||||
SHA-1 Process:
|
||||
- 메시지는 512비트 블록으로 나뉘고 블록마다 압축 함수를 사용해 160비트 해시를 계산.
|
||||
- 각 블록은 특정한 비선형 기능과 함께 반복된다.
|
||||
|
||||
본문
|
||||
SHA-2 Variants (SHA-256, SHA-512 등):
|
||||
- SHA-2는 무결성 보장 목적에 사용, 더 긴 해시 값과 변형된 알고리즘을 포함.
|
||||
- SHA-256은 32비트 워드, SHA-512는 64비트 워드를 사용한다.
|
||||
|
||||
Compression Function:
|
||||
- 체인화된 값과 야수 상수를 사용한 라운드 함수.
|
||||
- 메시지 스케줄, 라운드 상수, 라운드 함수, 중간 상태 갱신을 통한 해시 생성.
|
||||
|
||||
SHA 알고리즘들은 다양한 애플리케이션에서 널리 사용되며, 특히 SHA-256과 SHA-3은 현재 많이 사용된다.
|
||||
|
||||
#### SHA-1
|
||||
|
||||
SHA-1 해시 함수는 메시지 $ M $을 160비트의 해시 값으로 매핑한다.
|
||||
|
||||
Initialization:
|
||||
- 초기 해시 값 $ H^{(0)} $는 5개의 32비트 워드 $ H_0^{(0)}, H_1^{(0)}, H_2^{(0)}, H_3^{(0)}, H_4^{(0)} $로 설정된다.
|
||||
|
||||
Message Preprocessing:
|
||||
- 입력 메시지 $ M $은 512비트 블록들로 나누어지고, 패딩과 길이 인코딩을 거쳐 $ L $ 비트의 메시지가 된다.
|
||||
- 각 블록에 대해, 80개의 32비트 워드 $ W $로 확장된 메시지 스케줄이 생성된다.
|
||||
|
||||
Hash Computation:
|
||||
- 각 라운드 $ t $에서 다음의 연산을 수행한다:
|
||||
$$ T = (H_0 \lll 5) + f_t(H_1, H_2, H_3) + H_4 + W_t + K_t $$
|
||||
$$ H_4 = H_3 $$
|
||||
$$ H_3 = H_2 $$
|
||||
$$ H_2 = H_1 \lll 30 $$
|
||||
$$ H_1 = H_0 $$
|
||||
$$ H_0 = T $$
|
||||
여기서 $ f_t $는 라운드에 따라 변하는 논리 함수이며, $ K_t $는 라운드 상수이다.
|
||||
|
||||
#### SHA-256
|
||||
|
||||
Initialization:
|
||||
- 초기 해시 값 $ H $는 $ H_0 $부터 $ H_7 $까지의 8개의 32비트 워드로 구성되며, 이는 특정 소수의 제곱근에서 파생된다.
|
||||
|
||||
Message Preprocessing:
|
||||
- 입력 메시지 $ M $은 512비트 블록들로 나누어지며, 패딩 및 길이 인코딩을 거쳐 메시지 스케줄 $ W $로 변환된다.
|
||||
- $ W $는 64개의 32비트 워드로 확장되며, 각 $ W_t $는 $ M $의 해당 부분과 앞선 워드들의 비선형 함수 $ f $에 의해 계산된다.
|
||||
|
||||
Hash Computation:
|
||||
- 메인 루프는 $ H $를 업데이트하기 위해 64회의 라운드를 수행한다.
|
||||
- 각 $ t $번째 라운드에서, 다음과 같은 수학적 연산이 수행된다:
|
||||
$$ T_1 = H_7 + \Sigma_1(H_4) + \text{Ch}(H_4, H_5, H_6) + K_t + W_t $$
|
||||
$$ T_2 = \Sigma_0(H_0) + \text{Maj}(H_0, H_1, H_2) $$
|
||||
여기서 $ \Sigma_0, \Sigma_1 $은 각각 회전 및 오른쪽 시프트 연산으로 정의되며, $ \text{Ch} $와 $ \text{Maj} $는 입력 워드들의 비트를 선택하는 논리 함수이다.
|
||||
- 그 후, 중간 해시 값 $ H $는 다음과 같이 업데이트된다:
|
||||
$$ H_7 = H_6 $$
|
||||
$$ H_6 = H_5 $$
|
||||
$$ H_5 = H_4 $$
|
||||
$$ H_4 = H_3 + T_1 $$
|
||||
$$ H_3 = H_2 $$
|
||||
$$ H_2 = H_1 $$
|
||||
$$ H_1 = H_0 $$
|
||||
$$ H_0 = T_1 + T_2 $$
|
||||
|
||||
SHA-256의 모든 수학적 변환은 $ \text{GF}(2^{32}) $상에서 수행되며, $ K_t $는 각 라운드에 고유한 상수이다. SHA 알고리즘은 입력 메시지의 아주 작은 변화도 출력 해시 값에 큰 변화를 가져오는 "avalanche effect"를 만들어내는 설계 원리를 가지고 있다.
|
||||
|
||||
#### 3. HMAC (Hash-Based Message Authentication Code)
|
||||
|
||||
HMAC은 해시 알고리즘 위에 구축된 메시지 인증 코드 (MAC) 프로토콜이며, 키와 메시지 모두를 기반으로 한 인증 태그를 생성한다.
|
||||
|
||||
HMAC Process:
|
||||
- 키와 함께 초기화 벡터(IV)를 사용하여 해시 함수에 입력.
|
||||
- 두 단계 과정:
|
||||
- 내부 해시($H(K \oplus ipad \parallel m)$)는 입력 메시지 m과 패딩이 적용된 키 K를 사용.
|
||||
- 외부 해시($H(K \oplus opad \parallel inner)$)는 내부 해시 결과에 다시 패딩이 적용된 키 K를 사용.
|
||||
|
||||
여기에서 $ipad$, $opad$는 특정한 패딩 값을 가리키고, $H$는 해시 함수, $K$는 비밀 키, $\parallel$는 이어붙이기 연산자다.
|
||||
|
||||
- 주어진 메시지 $ M $과 비밀 키 $ K $에 대해, HMAC은 다음과 같이 계산된다:
|
||||
$$ \text{HMAC}(K, M) = H((K' \oplus opad) \concat H((K' \oplus ipad) \concat M)) $$
|
||||
여기서 $ H $는 해시 함수, $ K' $는 원래 키 $ K $를 내부 블록 크기에 맞게 조정한 것, $ opad $와 $ ipad $는 각각 외부 및 내부 패딩이다.
|
||||
|
||||
HMAC은 키와 긴 메시지를 사용한 메시지 인증, 데이터 무결성, 데이터 출처 인증에 사용된다.
|
Loading…
Reference in New Issue