암호학 (5)키 관리&hash 함수

2020. 1. 16. 11:43Security/알고리즘&암호학

* 비밀키 분배의 어려움

물리적인 방법으로 전달
- 링크 암호화에서 적용 가능(인공위성) 
- 단대단 암호화에서 적용 어려움

 

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

 

제 3자(키 분배 센터(KDC))를 통하여 키 분배

- 단대단 암호화에서 주로 사용 
- 사용자는 키 분배 센터와 유일한 키를 공유

- 대표적으로 KERBEROS가 있음

 

* KDC를 이용한 비밀키 분배

KERBEROS를 이용한 키 분배 방법

- client-server 모델(A가 client, B가 server이다). 여기서 client는 프로세스이다. 

- A는 KDC와 비밀키(마스터키)를, B는 KDC와 비밀키(마스터키)를 나눠 가짐.

- 속도 지연이 거의 없다.

 

1. Request || ID(A),A,B : 나(A)의 신원정보(ID(A)), 내가 누구와 통신하고 싶은지 알려주고 KDC에게 세션 키를 요청

2. EKA[SK,ID(B),T] : KDC가 SK, ID(B), T를 보낼때 SK와 T는 노출되면 안되기 때문에 KA로 암호화해서 보내준다.

3. EKB[SK,ID(A),T] : KDC가 SK, ID(A), T를 보낼때 SK와 T는 노출되면 안되기 때문에 KB로 암호화해서 보내준다.

4. ESK[ID(A),T] : T는 응답자가 진짜 B인지 확인하기 위해서 보냄. SK는 내가 A임을 알려주기 위해서 보냄

5. ESK[ID(B),T+1] : T+1일과 ID(B)를 통해서 A는 B의 신원을 확인.

6. 서로의 신원이 확인 되었기때문에 세션키를 가지고 암호화 통신을 시작, 통신이 완료될 경우 SK는 버린다. 

 

- ID(n) : n을 식별할 수 있는 고유 정보. IP일수도 있고 상황에 따라 다르다

- KA : A의 마스터 키

- KB : B의 마스터 키

- SK : 세션키. A와 B가 통신하기 위해 필요하며 항상 비밀키이다. 세션키를 나눠 가지는 것이 키분배의 궁극적인 목적.

- 1은 난수를 받았을때 하기로 약속된 연산을 의미. 네트워크에 같은 암호문이 계속해서 통신되는 것을 방지하고 싶어서 약속된 연산을 더 해준다. 

 

SESAME를 이용한 키 분배 방법

- A, B가 공개키 기관의 가입자(신원정보와 공개키가 등록되어있는)인 경우에만 인증이 가능

- 가입자들도 공개키 기관의 공개키를 가지고 있어야 함.

- 공개키는 네트워크 상에 공개되어 있을 수 있지만 진짜 그 사람의 공개키인지 확신할수 없기에 공개키 기관이 필요

 

(1) Request || Time1 : A가 공개키 기관에 B의 공개키를 보내달라고 요청

 

(2) E(PRau[PUb || Request || Time1]) : 공개키 기관의 개인키로 B의 공개키를 암호화해서 전송. A가 공개키 기관의 공개키로 암호문을 풀어서 근원지 증명(암호문이 공개키 기관이 수신자임을 확인)을 한다. 

 

(3) E(PUb[IDA || N1]) : B의 공개키로 A의 ID(a)와 N1을 암호화해서 전송. N1은 진짜 B인지 확인하기 위해 보낸다.

 

(4) Request || Time2 : B가 공개키 기관에 A의 공개키를 보내달라고 요청

 

(5) E(PRau[PUa || Request || Time2]) : 공개키 기관의 개인키로 A의 공개키를 암호화해서 전송. B가 공개키 기관의 공개키로 암호문을 풀어서 근원지 증명(암호문이 공개키 기관이 수신자임을 확인)을 한다.

 

(6) E(PUa[N1 || N2]) : A의 공개키로 N1와 N2를 전송. 이때 A는 개인키를 통해서 메세지를 보낸 이가 B임을 확인하며 동시에 N2는 진짜 A인지 확인하기 위해 보낸다. 

 

(7) E(PUb[N2]) : A가 개인키로 암호문을 푼뒤 B의 공개키로 N2암호화해서 B에게 보낸다.(자신이 A임을 증명)

 

(8) E(PUb[EPRa [Ks]]) : 세션키를 A의 비밀키로 암호화, 다시 B의 공개키로 암호화해서 B에게 전송해서 세션키를 나눠갖는다. 

 

여기까지 서로의 신원을 확인했기 때문에 이후 세션키를 가지고 암호화 통신을 시작한다. 

 

PU : 공개키

PR : 개인키

Time1: 로그 및 시간 정보.

au : 공개키

ID : 신원정보

N : 난수

Ks : 세션키. 세션키로 사용하는 것은 전부 비밀키이다. 

 

* Hash 함수

해쉬 함수의 이해

- 임의의 길이(M)를 취해서 정해진 크기(h)의 Message Digest를 만드는 one-way function(H)(일방향 함수).

- 일방향 함수이기때문에 복호화가 불가능. M이 바뀌면 h가 바뀌는데 전혀 예상할 수 없다. 전혀 예상할 수 없기때문에 우연히 같은 값이 나올 수도 있다.

- 메시지 인증 코드에 대한 변형, 메시지의 모든 비트들에 대한 함수

- 디지털서명, 인증, 등의 서비스 제공.

- 원문에 대한 무결성을 확인할때 사용. 

 

해쉬함수의 요구 조건

- 어떤 크기의 메시지 M에도 적용 가능 
- H는 정해진 크기의 hash code를 만듦.
- H(M)은 어떤 주어진 M에 대해서도 계산하는 것이 쉽다. 
- 주어진 hash code h에 대해, H(M) = h인 M을 찾는 것이 계산적으로 실행불가능(one-way). 즉, 해시코드만으로 원문을 알아낼 수 없다. 

 

단순 hash함수

메시지를 n비트 블록으로 m개로 나눈 뒤에, 나눈 블록끼리 XOR하여 출력되는 블록을 해쉬로 함. 딱 나눠떨어지지 않는 경우가 대부분이기때문에 패딩을 하면 된다. 

 

hash 함수의 종류

- 같은 결과값의 문자열이 나오는 충돌문제가 있지만 주로 MD5를 사용.

- SHA-1의 메시지 다이제스트 길이인 160비트는 통상적으로 길다고 판단되어 사용하지 않는다.