IT/암호학

[Hash Function, MDC, MAC, Digital Signature]

kykyky 2023. 12. 31. 22:26

해시함수 란?

 

일반적인 양방향 암호기법 (대칭키, 공개키 암호기법 등)과 달리, 단방향 암호기법이며, key를 사용하지 않는다.

    - 복호화가 사실상 불가능함을 의미.

 

입력으로는 임의의 크기가 들어갈 수 있지만, 출력은 크기가 고정되어 있다.

 

암호학적 관점에서 안전한 해시함수의 성질은 아래와 같다. 

(H: 해시함수)
1. 역상 저항성: H(x)가 주어졌을 때, x를 찾기 어렵다.
2. 제2 역상 정항성: x가 주어졌을 때, H(y) = H(x)인 y를 찾기 어렵다.
3. 충돌 저항성: H(x) = H(y)인 (x, y) 쌍을 찾기 어렵다.

 

 

이러한 암호학적 해시함수의 설계 방식으로는 Merkle-Damgard 구조가 있다.

(f: 압축 함수)

 

f_i = f(m_i, f_i-1) (i = 2~n)

 


MDC (Modification Detection Code) 란?

 

이 글에선 단순한 해시함수 형태의 MDC를 다룹니다.

 

활용되는 과정

 

(A: Alice, B: Bob)

A: M, MDC를 B에게 보낸다.

B: 받은 M의 MDC를 직접 구해본다.
       (이 결과를 MDC'라 하자. 그림 상에서는 Bob 네모의 회색 MDC이다.)

     MDC와 MDC'가 동일한지 여부를 확인하여,
     동일하면 정상적으로 Accept,
     동일하지 않으면 Reject한다.
          - M이 Insecure channel을 통해 전달되는 과정에서 변조된 경우 (이를 M'이라 하자),
            H(M)과 H(M')은 다르게 되므로, 즉 MDC가 달라져, 동일하지 않은 것이다. 

 

 

메시지의 무결성을 제공한다. 

근원인증은 제공하지 못한다. 

      사실 공격자도, M에 대한 정당한 MDC를 만들어낼 수는 있기에

      (Insecure channel에서 오고가는 M을 탈취한 뒤, 이것의 해시함수값만 구하면 이것이 정당한 MDC임), 

 

      정당한 MDC를 만들어냈다 해서, 이것이 "송신자가 공격자가 아님"을 인증해주진 못함. 

 


MAC (Message Authentication Code) 란?

 

단순한 해시함수 형태인 MDC와는 다릅니다. (생성 과정은 아래에서 다뤄집니다.)

 

활용되는 과정

 

(A: Alice, B: Bob)

A, B: 우선 K를 공유한다.

A: M + MAC를 B에게 보낸다.

B: 받은 M + MAC에서 M을 가져와, 이것의 MAC를 직접 구해본다.
       (이 결과를 MAC'라 하자. 그림 상에서는 Bob 네모의 회색 MAC이다.)

     MAC와 MAC'가 동일한지 여부를 확인하여,
     동일하면 정상적으로 Accept,
     동일하지 않으면 Reject한다.

 

메시지의 무결성 뿐만 아니라 근원인증도 제공한다.

정당한 MAC을 만들 수 있는 것은, K를 알고 있는 송/수신자 뿐이기 때문이다. 

 

부인방지는 제공하지 못한다.

   B도 정단한 MAC을 만들 수 있기 때문에, 

   A는 자신이 MAC을 만들어냈다는 사실을 부인할 수 있다. 

 

생성 방법에 따른 분류

 

▶ HMAC(Hashed MAC)

 

- key를 두 개 사용하는 이유

   한 개만 사용하는 경우, Length Extension Attack에 취약해진다.

 

▶ CBC-MAC

 

- 주의점: 송/수신자는 '고정된 길이의' 평문만을 주고받아야 함 

     평문 길이가 가변적인 경우, Length Extension Attack에 취약해진다.

 

 

▶ CMAC(Cipher-based MAC)

바로 위의 CBC-MAC에다가 마지막 단계에 새로운 key를 추가함으로써, 가변 길이의 평문을 사용이 안전해짐 (Length Extension Attack을 방지함)

 


전자서명 이란?

 

과정

증명자 (Alice): m, Sig_sk(m) = s을 검증자에게 보낸다.

검증자 (Bob): Ver_pk(s)을 구한다.
                     
                     이것이 m과 동일한지를 확인함으로써 검증을 완료한다.

 

 

만약 RSA를 활용한 전자 서명인 경우,

 

 

RSA에서 했던 방식 그대로 public & private key (n, e, d)을 만든 뒤,
 
Sig_sk(m) = m^d mod n이며, (이것을 s라 하자.)
    (sk는 즉 d이다.)

Ver_pk(s) = s^e mod n이다.
    (pk는 즉 e이다.)

 

 

실제로는 서명 생성 시 m 대신 H(m)을 사용한다.

    m을 그대로 사용할 경우 다양한 취약점들이 있는데, H(m)을 사용하면 해시함수의 역상 저항성으로 인해 안전해지며,

    m의 길이가 길 경우, H(m)으로써 압축하면 훨씬 효율적이기 때문

 

메시지 무결성, 근원인증, 부인방지를 제공한다.


▶ 무결성: 도중에 m을 m'으로 변조하여 Sig_sk(h(m'))을 만들어냈다면,
                이것은 Sig_sk(h(m))과 다름 (∵ h()의 충돌 저항성) 

                → 변조 여부를 확인 가능
▶ 근원인증: 정당한 sk를 이용한 서명만이 Ver_pk(Sig_sk(h(m))) = h(m) 만족
▶ 부인방지: sk를 아는 건 증명자밖에 없으므로, Sig_sk(h(m))은 증명자만이 만들어낼 수 있음 

'IT > 암호학' 카테고리의 다른 글

[ElGamal] in Public-key cryptosystem  (0) 2023.12.27
[RABIN] in Public-key cryptosystem  (2) 2023.12.27
[RSA] in Public-key cryptosystem  (2) 2023.12.27