키 관리

비밀키 분배의 어려움

▶ 물리적인 방법으로 전달
 • 링크 암호화에서 적용 가능
 • 단대단 암호화에서 적용 어려움


▶ 이전의 키를 사용하여 암호화된 새로운 키를 전송
 • 링크 암호화나 단대단 암호화 모두 적용 가능
 • 공격자가 어떤 한 키를 안다면 이후의 모든 키가 노출


▶ 제 3자(키 분배 센터)를 통하여 키 분배
 • 단대단 암호화에서 널리 채택
 • 사용자는 키 분배 센터와 유일한 키를 공유

 

▶ KDC를 이용한 키분배 방법 (Kerboros)

전제조건

각 사용자 A, B는 KDC에서 분배한 마스터 키 1개씩 소유하고 있다.

 

1. Request || ID(A), A, B

- 발신자 A는 응답자 B와 통신하기위해 KDC에 Request 보낸다. 

- 요청에는 자신의 신원정보 ID(A)와 B와 통신할 세션키를 요청한다. (*세션키=비밀키)

 

2.Eka[SK, ID(B), T]

- KDC는 발신자 A에게 B와 통신할 세션키, B의 신원정보 ID(B), 난수(T)를 응답한다. 

- 응답시 KDC는 A의 마스터키로 암호화해 A에게 보낸다. (KDC는 A, B의 마스터키를 가지고 있다.)

 

2. Ekb[SK, ID(A), T]

- KDC는 발신자 B에게 세션키와 A의 신원정보 ID(A), 난수(T)를 B의 마스터 키로 암호화해서 보낸다.

 

3. Esk[ID(A), T]

- A가 자신의 신원정보 ID(A)와 난수 (T)를 세션키로 암호화해서 B에게 전송한다.

- B는 A의 난수(T)와 A의 신원정보 ID(A)를 통해 A의 신원을 확인한다.

 

4. Esk[ID(B), T+1]

- B는 자신의 신원정보 ID(B)와 난수(T+1)를 연산하여 세션키로 암호화해 A에게 전송한다.

- A는 난수(T+1)에 연산된 것을 확인해 B의 신원을 확인한다.

 

통신 종료

- 통신이 종료되면 발급받은 세션키는 폐기된다.

- 다시 통신하려면 세션키를 KDC에 요청한다.

 

▶ 공개키 기관에 의한 세션키 분배 (SESAME) 

전제 조건

- A는 자신의 공개키(KUa)와 개인키(KRa)를 각각 소유한다.

  A는 공개키 기관에 자신의 공개키(KUa)를 등록한다.

  공개키 기관은 공개키 기관의 공개키인 (KUau)를 나눠준다.

- B는 자신의 공개키(KUb)와 개인키(KRb)를 각각 소유한다.

  B는 공개키 기관에 자신의 공개키 (KUb)를 등록한다.

  공개키 가관은 공개키 기관의 공개키인 (KUau)를 나눠준다.

 

1. Request || Time1

- A가 B와 통신하기 위해 B의 공개키를 공개키 기관에 요청한다.

- 이때 Request를 구분하기 위한 난수(Time1)를 같이 보낸다. (공개키 기관인지 알기 위해)

 

2. E(KRau)[KUb||Request||Time1]

- 공개키 가관은 요청 메시지와 공개키 기관에 등록된 B의 공개키(KUb)를 공개키 기관의 개인키 (KRau)로 암호화해 A에게 응답한다.  -  A는 공개키 기관이 보낸 것을 공개키 기관의 공개키(KUau)로 복호화해 확인하여 B의 공개키 (KUb)를 얻는다.

→ A는 B의 공개키를 얻게 된다.

 

3. E(KUb)[ID(A)||N1]

- A가 자신의 신원정보 ID(A)와 N1(난수)를 B의 공개키(KUb)로 암호화해 B에게 전송한다.

  (ID(A): 자신이 누군지 알리기 위함 / N1: B인지 확인하기 위함)

- A가 B의 공개키로 암호화하여 전송한 것을 B가 개인키로 복호화하기에 기밀성이 보장된다.

 

4. Request||Time2

B는 자신의 개인키로 복호화하고 A의 공개키가 없으므로 공개키 기관에 Time2와 함께 요청한다.

 

5. E(KRau)[KUa||Request||Time2]

- 공개키 기관은 요청 메시지와 A의 공개키를 공개키 기관의 개인키로 암호화해 응답한다.

- 공개키 기관이 공개키 기관의 개인키(E(KRau))로 암호화하여 전송한 것을 B가 공개키 기관의 공개키로 복호화해 A의 공개키라는 것을 확인하고 얻는다.

→ B는 A의 공개키를 얻게 된다.

 

6. E(KUa)[N1||N2]

- B는 N1, N2 난수를 A의 공개키(KUa)로 암호화하여 전송한다. 

  (N1: B인것을 확인하기 위해 A가 전송, N2: A인지 확인하기 위해 B가 전송)

- B가 A의 공개키로 암호화하여 전송한 것을 A가 개인키로 복호화해 기밀성이 보장된다.

 

7. E(KUb)[N2]

- A는 N2라는 응답을 보내 자신이 A라고 응답한다.

- A가 B의 공개키로 암호화하혀 전송한 것을 B가 자신의 개인키로 복호화해 기밀성이 보장된다.

 

8. E(KUb)[E(KRa)[Ks]]

- A는 세션키(Ks)를 자신의 개인키로 암호화해 B의 공개키로 암호화하여 B에게 전송한다.

- B는 자신의 개인키로 복호화하고 A의 공개키로 복호화해 세션키를 획득한다. (기밀성 보장)

 

통신 종료

- 통신이 종료되면 세션키는 버려진다.

- 다시 통신하려면 8번 과정이 진행된다. (1-7 과정 진행X)

- A, B는 서로 공개키 기관으로부터 받은 안전한 공개키를 소유하고 있다고 생각하기 때문이다.


해시함수

- 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수

- 메시지 인증 코드에 대한 변형

- 메지시의 모든 비트들에 대한 함수

- 임의의 길이(M)을취해 정해진 크기 h의 메시지 Digest를 만드는 일방향 함수

- 해시의 목적 : 무결성 확보

▶ 해시함수의 요구조건

• 어떤 크기의 메시지 M에도 적용 가능
• H는 고정된 크기의 hash code를 만듦
• H(M)은 어떤 주어진 M에 대해서도 계산하는 것이 쉽다. (해시함수는 비밀키 암호 시스템보다 빠름
• 주어진 hash code h에 대해, H(M) = h인 M을 찾는 것이 계산적으로 실행불가능(one-way)

  → 해시코드 사용 이유: 계산방법이 없고 무작위로 대입하기때문(생일공격)
• 어떤 주어진 블록 M에 대해서, H(M’) = H(M) 인 M과 M’가서로 다른 것을 찾는 것이 계산적으로 실행 불가능
• H(M’) = H(M)인 어떤 (M, M’) 쌍을 찾는 것이 계산적으로 실행 불가능(collision-free)

 

 

단순 해시 함수

: 메시지를 n 비트 블록으로 m개로 나누어 블록끼리 XOR하여 출력되는 블록을 해쉬로 함

▶ 해시함수의 종류

 

+ Recent posts