# 보안 레이어와 암호화 기술

#### SSH 프로토콜의 보안 개요

SSH(Secure Shell) 프로토콜은 클라이언트와 서버 간의 안전한 통신을 제공하기 위해 여러 보안 레이어를 사용한다. 이 보안 레이어는 주로 세 가지 중요한 기능을 제공한다:

1. **기밀성(Confidentiality):** 네트워크를 통해 전송되는 데이터가 도청되지 않도록 암호화한다.
2. **무결성(Integrity):** 전송된 데이터가 중간에서 변조되지 않도록 보장한다.
3. **인증(Authentication):** 클라이언트와 서버가 상호 신뢰할 수 있는 방법으로 서로를 확인한다.

이러한 보안 목표를 달성하기 위해 SSH 프로토콜은 여러 암호화 알고리즘과 해시 함수, 그리고 키 교환 알고리즘을 사용한다. SSH 프로토콜의 보안 구조는 크게 세 가지 단계로 나눌 수 있다:

* **키 교환(Key Exchange)**
* **암호화(Encryption)**
* **메시지 인증 코드(Message Authentication Code, MAC)**

#### 키 교환

키 교환은 클라이언트와 서버 간에 안전하게 비밀 키를 공유하기 위한 방법이다. 키 교환 과정은 SSH 보안의 핵심 요소 중 하나로, 세션 암호화에 사용되는 비밀 키를 협상하는 과정에서 암호화 알고리즘을 사용한다.

SSH는 **Diffie-Hellman** 키 교환 알고리즘을 주로 사용하며, 이를 통해 안전하게 공유 비밀을 계산한다. 이때 클라이언트와 서버는 서로에게 임의의 공개 값을 주고받으며, 이 공개 값으로부터 동일한 비밀 키를 생성한다.

**Diffie-Hellman 키 교환 과정**

키 교환 알고리즘의 흐름은 다음과 같다:

1. 클라이언트와 서버는 서로 사전에 합의된 소수 $p$와 원시근 $g$을 공유한다.
2. 클라이언트는 비밀 값 $a$를 임의로 선택하고, $g^a \mod p$를 서버에 보낸다.
3. 서버는 비밀 값 $b$를 임의로 선택하고, $g^b \mod p$를 클라이언트에 보낸다.
4. 클라이언트는 $(g^b \mod p)^a \mod p$를 계산하여 공유 비밀 $K$를 생성한다.
5. 서버는 $(g^a \mod p)^b \mod p$를 계산하여 동일한 공유 비밀 $K$를 생성한다.

이 때, 공유된 비밀 $K$는 다음과 같이 표현된다:

$$
K = (g^b \mod p)^a \mod p = (g^a \mod p)^b \mod p
$$

이를 통해 클라이언트와 서버는 안전하게 동일한 비밀 키를 공유하게 된다.

#### 암호화

키 교환이 완료된 후, SSH 프로토콜은 세션 암호화를 위해 다양한 대칭 키 암호화 알고리즘을 사용한다. 주로 사용되는 암호화 알고리즘은 다음과 같다:

* **AES (Advanced Encryption Standard)**
* **Triple DES (3DES)**
* **ChaCha20-Poly1305**

이러한 알고리즘은 클라이언트와 서버 간에 주고받는 모든 데이터를 암호화하여 도청을 방지한다. 대칭 키 암호화에서는 클라이언트와 서버가 같은 비밀 키를 사용하여 데이터를 암호화하고 복호화한다.

**AES 알고리즘**

AES는 SSH에서 가장 많이 사용되는 암호화 알고리즘이다. AES는 128비트, 192비트, 256비트 길이의 키를 사용하여 데이터를 블록 단위로 암호화한다. AES 알고리즘은 라운드 함수로 구성되며, 각 라운드는 다음 네 가지 주요 단계를 포함한다:

1. **SubBytes:** 각 바이트를 고정된 S-box를 사용하여 치환한다.
2. **ShiftRows:** 행 단위로 바이트를 좌측으로 이동시킨다.
3. **MixColumns:** 열 단위로 데이터를 선형 변환한다.
4. **AddRoundKey:** 라운드 키와 현재 상태를 XOR 연산한다.

AES의 암호화 과정은 다음과 같이 표현할 수 있다:

$$
\mathbf{C} = E(\mathbf{K}, \mathbf{P})
$$

여기서,

* $\mathbf{C}$는 암호문,
* $E$는 암호화 함수,
* $\mathbf{K}$는 대칭 키,
* $\mathbf{P}$는 평문이다.

AES는 블록 단위로 데이터를 처리하므로, 평문의 길이가 블록 크기(128비트)의 배수가 아니면 **패딩(padding)** 기법을 사용하여 평문의 길이를 맞춘다.

#### 메시지 인증 코드 (MAC)

SSH 프로토콜에서 \*\*메시지 인증 코드(MAC)\*\*는 데이터의 무결성을 확인하는 데 사용된다. MAC은 전송된 데이터가 도중에 변조되지 않았음을 보장한다. 클라이언트와 서버는 데이터를 송수신할 때 각각 데이터를 암호화한 후, MAC을 계산하여 이 데이터를 함께 전송한다. 수신 측에서는 같은 방식으로 MAC을 계산하여 두 값이 일치하는지 확인함으로써 데이터의 무결성을 확인한다.

MAC 계산을 위한 일반적인 과정은 다음과 같다:

$$
\mathbf{MAC} = H(\mathbf{K}\_{mac}, \mathbf{M})
$$

여기서,

* $\mathbf{MAC}$은 계산된 메시지 인증 코드,
* $H$는 해시 함수,
* $\mathbf{K}\_{mac}$는 MAC용 비밀 키,
* $\mathbf{M}$은 송수신되는 메시지이다.

이때, SSH에서 자주 사용하는 해시 함수는 \*\*HMAC (Hashed Message Authentication Code)\*\*이다. HMAC는 해시 함수(예: SHA-256, SHA-512)를 사용하여 메시지 인증 코드를 생성하며, 이를 통해 메시지의 변조 여부를 확인한다.

**HMAC의 작동 원리**

HMAC는 다음과 같은 방식으로 작동한다:

1. 메시지 $\mathbf{M}$과 MAC용 비밀 키 $\mathbf{K}\_{mac}$가 입력된다.
2. 내부 해시 계산을 위한 패딩된 키와 메시지가 결합된다.
3. 해시 함수 $H$를 사용하여 MAC을 계산한다.

HMAC는 기본적으로 해시 함수를 두 번 사용하는 구조로 설계되었다:

$$
HMAC(\mathbf{K}*{mac}, \mathbf{M}) = H((\mathbf{K}*{mac} \oplus \mathbf{opad}) \parallel H((\mathbf{K}\_{mac} \oplus \mathbf{ipad}) \parallel \mathbf{M}))
$$

여기서,

* $\oplus$는 XOR 연산,
* $\mathbf{opad}$는 외부 패딩(0x5c가 반복된 값),
* $\mathbf{ipad}$는 내부 패딩(0x36가 반복된 값),
* $\parallel$는 문자열 연결을 의미한다.

이 과정을 통해 수신 측은 전송된 메시지와 함께 전달된 MAC 값을 검증하여 데이터의 무결성을 확인한다.

#### SSH 암호화 알고리즘의 상호작용

SSH 프로토콜에서 보안 계층들은 키 교환, 암호화, MAC이 조화를 이루어 작동한다. 전체 보안 통신 과정은 다음과 같은 단계로 이루어진다:

1. **키 교환:** 클라이언트와 서버는 Diffie-Hellman과 같은 알고리즘을 사용하여 공유된 비밀 키를 생성한다.
2. **암호화:** 공유된 비밀 키를 사용하여 대칭 키 암호화 알고리즘(AES, 3DES 등)을 통해 데이터를 암호화한다.
3. **무결성 검증:** MAC을 사용하여 전송된 데이터의 무결성을 확인한다.

각 단계는 독립적으로 작동하는 것이 아니라, 서로 밀접하게 연계되어 클라이언트와 서버 간의 안전한 통신을 보장한다.
