HMAC(Hashed MAC)

HMAC은 CMAC과 더불어 자주 쓰이는 메시지 인증 코드 생성 방법입니다. 메시지 인증 코드(MAC : Message Authentication Code)에 대해서는 지난 포스팅을 참고하시기 바랍니다.

 

HMAC은 2번의 Hash 함수와 1개의 대칭키(또는 비밀키라고 하지요)를 사용합니다. 대칭키를 사용하였으니 메시지의 출처를 인증할 수 있겠네요. 왜냐면 key는 단 둘만 알고 있는 비밀이기 때문입니다. 그러니 메시지의 인증이 가능한 메시지 인증 코드입니다. 

 

HMAC의 과정은 아래의 그림이 간략하게 보여줍니다. 

 

 

이 그림에 ipad인지 opad인지 모르는 녀석들도 섞여있네요. 이제 글과 함께 위의 그림을 같이보도록 합시다. 

 

 

HMAC의 크기: n

메시지 블록의 크기: m 

 

1. 메시지 블록의 크기를 나눈다

우선 메시지를 일정한 크기(256 bit(32 byte)이던 512 bit(64 byte)이던)로 나눕니다. 이 일정한 메시지 블록의 크기를 m이라고 합시다. 

 

2. 비밀키를 패딩으로 채운다.

비밀키는 최종적으로 나오는 HMAC, 즉 n의 크기 이상을 권장합니다. 만약 비밀키가 m비트 이하라면 왼쪽에 0을 덧붙여 비밀키를 m비트의 크기로 채웁니다.

 

3. 그렇게 나온 비밀키와 ipad(input pad)와 XOR 연산을 한다. 

ipad는 m/8번의 연속된 이진열로 0011 0110(0x36)으로 이루어져있습니다. 자, 그럼 여기서 m은 8의 배수로 이루어져있어야 m/8이 정수가 되겠네요. 만약 m이 16비트라면 ipad는 0011 0110 0011 0110인 ipad가 될것이고 패딩된 키와 XOR 연산이 될 것입니다.

 

4. 3의 연산된 값을 메시지 블록 맨 앞에 놓는다.

이렇게 되면 총 N+1개의 메시지 블록이 생겨납니다.

 

5. 해쉬 함수로 메시지 다이제스트를 n비트 생성한다.

4에서 연산된 N+1개의 메시지 블록 전체를 해쉬 함수로 해쉬 값을 생성해냅니다. 생성된 값은 중간 HMAC이라고 합니다.

 

6. 중간 HMAC을 m비트로 만들기 위해 0으로 채운다.

이 중간 HMAC을 다시 해쉬 함수를 만들기 위해 m비트로 맞춥니다.

 

7. 다시 패딩된 비밀키와 opad(output pad)를 XOR한다.

opad는 m/8번의 연속된 이진열 0101 1100(0x5C)로 이루어져있습니다.

 

8. 7의 결과값을 중간 HMAC 앞에 놓는다.

최종적인 HMAC을 만들기 위해서 7번의 결과와 HMAC을 합칩니다.

 

9. 마지막으로 중간 HMAC을 만든 동일한 해쉬 함수를 통해 최종 HMAC을 생성해낸다.

 

10. 결과적으로 나온 HMAC을 메시지 뒤에 붙여 상대방에게 전송하면 HMAC의 과정은 끝이납니다.

 

이상으로 HMAC에 대한 설명과 어떻게 만들어지는지에 대한 과정 설명을 마칩니다.

 

 

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,

 

 

 

 

흔히 우리가 문서가 변조 또는 위조되었는지 확인하기 위해서 핑거프린트(finger frint)를 사용하지요. 디지털에서는 어떻게 위조되었는지 알 수 있을까요?

디지털 메시지를 다룰때 우리는 그 메시지가 변경이 되었는지 또는 이 메시지가 내가 알고 있는 그 사람에게 왔는지 확인해야할 필요가 있는데 메시지 변경 감지 코드(MDC:Modification Detection Code)메시지 인증 코드(Message Authentication Code)가 그 역할을 합니다.

 

MDC(Modification Detection Code)

메시지 변경 감지 코드는 메시지의 변경이 일어났는지 아닌지를 확인합니다. 즉, 데이터의 무결성을 판단하게 됩니다.

 

송신자 : 송신자는 원본의 메시지는 그대로 보내고 그 메시지를 암호학적 해쉬 함수를 통해 해쉬값을 만든게 MDC인데, 안전한 채널로 보내게 됩니다. 이때 안전한 채널로 외부로부터 변경이 되지 않는다는 보장이 되어야합니다.


암호학적 해쉬 함수 : 암호학적 해쉬 함수는 메시지의 해쉬 값을 만드는 함수로 일방향 함수여야합니다. 그러니까 해쉬값을 만드는 것은 되지만 해쉬값으로부터 원본 값을 알 수 없어야하고 메시지와 해쉬값이 1:1이 되어야합니다. 암호학적 해쉬함수의 기준은 3가지 저항성을 충족시켜야합니다. 
1) preimage resistance
2) second preimage resistance
3) collision resistance

한마디로 깨기 어려워야한다는 것이고, 저도 암호학적 해쉬함수에 해박한 지식은 없으므로 이정도하고 넘어갑시다.

수신자 : 수신자는 전달받은 메시지를 MDC로 다시 만들며 전달받은 MDC와 비교하여 이 둘이 같다면 변경이 되지 않은 것이고 변경이 되었다면 이 메시지는 변경되었다고 판단합니다.

 

MAC(Message Authentication Code), TCP/IP 2계층 아님.

메시지가 내가 원하는 바로 그 사람으로부터 왔는지 판단하려면 어떻게 하면 좋을까요? 서로만 아는 사실 하나만 추가하면 됩니다. 바로 키만 섞어주면 되죠.

 

송신자 : 송신자는 수신자와 미리 공유된 키를 가지고 메시지 해쉬값을 만들어 냅니다. 이것이 우리가 이야기하는 메시지 인증 코드, MAC입니다. 이것을 메시지와 함께 보냅니다.

수신자 : 송신자로부터 받은 MAC과 메시지를 키와 함께 해쉬값을 만든 후 비교합니다. 같다면 원하는 송신자로 온것이 확인이 되고 아니라면 메시지가 변경이 되었거나, 누군가가 임의로 보낸거겠죠? 

 

 

MAC은 이처럼 무결성과 인증을 같이 제공합니다. 

CMAC

메시지는 일반적으로 큰 경우가 많기 때문에 이 메시지를 한번에 MAC으로 만들 수는 없습니다. 그래서 메시지를 일정 비트 단위로 쪼개서 MAC을 만들어가는데 그 중 한가지가 CMAC입니다.

CMAC은 CBCMAC과 같은 의미로 불리는데 블록 암호에서 CBC와 유사한 방법을 사용하기 때문입니다.  CMAC을 진행하기 전에 송신자와 수신자는 key를 공유한 상황이어야합니다.

 

CMAC은 다음의 과정을 거치게 됩니다. 

 

1) 메시지를 m bit씩 n개로 쪼갭니다.

2) 만약 마지막 메시지 블록이 m bit가 못된다면 나머지 첫비트는 1, 다른 비트는 전부 0으로 채워버립니다. 패딩이라고 하지요.

3) 이제 앞의 메시지 블록부터 차례대로 사전에 공유된 키, key로 암호화하고 암호화한 값을 이 후의 블록과 xor을 진행합니다.

이 과정을 마지막 블록까지 진행합니다.

4) 마지막 블록에는  k와 xor 연산을 진행한 후 마지막 암호화를 진행합니다.  k는 마지막에 한번만 xor연산을 위해 사용되는데 key로부터 파생된 값입니다. m bit의 메시지 블록을 xor하기 위해서는 k도 m bit의 크기를 갖고 있어야겠지요.

5) 그 결과를 왼쪽의 n비트를 뽑아서 메시지에 붙여서 보냅니다.

 

 

 

이상으로 메시지 변경 감지 코드, 메시지 인증 코드, 메시지 인증 코드의 CMAC 방식을 알아보았습니다.

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,