오래 못 할 짓 하지 않기

[ 컴퓨터 보안 ] 14. Cryptography : Asymmetric Key - SHA 본문

3학년 2학기/컴퓨터 보안(Computer Security)

[ 컴퓨터 보안 ] 14. Cryptography : Asymmetric Key - SHA

쫑알bot 2024. 11. 8. 18:28
728x90

SHA
Secure Hash Algorithm

 

다양한 버전이 있지만, 요새는 SHA-512 를 사용하고 이에 대해 알아볼 예정

 

 

- Inverse할 일이 없어서 그냥 Hash만 시키면 된다.

 

 

1,2단계 )

1024 bits 단위로 Block을 구성하기 때문에 모자라면 Padding을 붙인다.

 

 

문제) 2590 비트의 원본 메시지가 있을 때 Padding bits의 수는?

더보기

➡️ 1024 단위여야 함, 2048보다는 많고 3072보다는 적다.

[ 원본 메시지의 길이 + Padding + 128 (메타데이터 느낌) ] = 3072

= 2590 + Padding + 128 = 3072

Padding = 354 bits

 

대신 Padding 은 가장 앞 비트만 1이고 나머지는 0이기 때문에

1*1개+ 0*353개

 


 

 

1 word = 8bytes = 64 bits

 

1024 단위로 하나의 블록을 만들면

16 words가 나온다.

 

우리는 SHA-512 알고리즘이므로 이 1024bits 짜리 블록을 512 bits로 Digest할 것이다.

방법은 아래 사진과 같다. 

 

 

 

우선 1024 bits, 즉 16 words ➡️ 80 words 로 확장시킨다.

 

- 0~15개 bits = 그대로 씀

- 16~80 개는 이전에 만들었던 Word 4개를 가져와서 사용한다.

   i 번째 Word = ( i-16번째 , i-15번째 , i-7번째 , i-2번째 ) 로 만들어진다.  

ex) 16번째 Word = W0 , W1 , W9 , W14 로 만든다.

 

식 보면 알 수 있듯이 엄청 섞음

 

 


 

Step 1,2에서 봤던 Digest 값들은 초기에 이렇게 세팅이 되어있음

이 초기 세팅이 Step5에 들어가는 곳에서 쓰임

 


 

 

 

[ 8 Word Initialized Words ] + [ Extended 80 Words ] + [ Key ] 가

한 세트로 Round에 들어간다.

 

첫 단계만 Initialization 이 들어가고 그 이후로는 전 단계의 결과값이 들어간다.

 

그 Round 안을 한 번 들여다보자

 

 

 

[ Majority

 

 

[ Rotate 

 

[ Conditional 

 

 

 

📌 분석

- Collision

: 다른 메시지로부터  같은 Digest값을 나오는 것

 

이에 대해 아직은 Collision Resistant하다고 보인다.

같을 확률 = 1/ 2^512

 


Message Authentication

 

 

Digest와 비슷하지만 목적이 다르다.

+ Sender와 Receiver는 서로 Secret Key를 가지고 있어야 한다.

 

📌 목적

- Message 의 Integrity를 보호하기 위해

   ➡️ Active Attack ( Ex) Modification) 을 감지할 수 있음.

 

- Sender가 Validate한 사람인지 확인하기 위해

 

 

* 하지만 Symmetric Encryption만으로는 Data Auth에 적합하진 않다.

 

 

📌 기밀성없이 메시지 인증을 하는 경우

 

 

1) 브로드캐스트 메시지(Broadcast message)

   > 특정 수신자가 아닌 다수에게 전송되는 메시지

 

2) 네트워크를 사용할 수 없는 메시지( network unavailable message)

   > 네트워크 장애로 인해 기밀성 있는 메시지 전송이 불가능한 경우

 

3) 복호화할 시간이 없는 메시지(One side has heavy load and cannot afford the time to decrypt all incoming messages)

   > 시스템 과부하로 인해 모든 수신 메시지를 복호화할 수 없는 경우

 

4) 컴퓨터 프로그램의 평문 인증(Authentication of computer program in plaintext)

    > 프로그램 코드 자체를 평문으로 인증하여 무결성과 출처를 확인하는 경우

 

 


인증 매커니즘

Message Digest는 Sender에 대한 Authenticate를 해주지 않는다.

➡️ Alice는 자신이 메시지를 보내고 있다는 것을 인증해야한다.

 

=  Key를 서로 주고받아서 Decrypt가 되면 인증 성공

 

- MDC ( Modification Detection Code )      = Digest 를 통해 데이터가 중간에 변형되었는지 판단하는 것 

- MAC ( Message Authentication Code )    = Sender에 대한 Message Authentication을 해주는 것 

 

 

📌MDC ( 변형 감지 코드)

 

Alice(=Sender) 가 M을 Hash 로 돌려서 MDC를 생성한다.

 

- M : 털릴 수도 있는 통로로 보냄 

- MDC : 절대 안전한 통로로 보냄 (나중에 비교할 때 써야하니까)

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

Bob(=Receiver) 가 M과 MDC를 받았다.

 

- M : 받은 M을 가지고 Alice가 돌린 Hash와 같은 함수를 돌려 MDC From Bob을 만든다.

- MDC : 안전한 통로로 받아서 변형이 100퍼 생기지 않은 MDC를 가지고 있는다.

 

if ( MDC == MDC From Bob ) 을 비교하여 같다면 Accept , 다르면 Reject

 

이는 전송 과정에서 메시지가 변형되었는지 확인해준다.

= Message의 Integrity 보장

 

 

‼️‼️여기서 의문점 ‼️‼️ 

: 그럼 MDC 주고 받은 통로로 Message 주고받으면 되지않나? 그렇게 안전한데

> 100퍼센트 안전한 통로를 만들 수 없기 때문에 이 방법말고 MAC을 사용한다.

 

 


📌MAC ( 메시지 인증 코드 )

 

이 방법은 [ Message의 Integrity + Data origin Authentication ] 모두 보장한다.

따라서 우리는 MDC를 MAC으로 바꿔서 사용한다.

+ 100% 안전한 Channel 이 없다는 것을 인정함

+ Sender 와 Receiver는 같은 KEY를 가지고 있다.

 

[ Alice ] 

- M : 그냥 전송될 준비중

- MAC = Hash ( Message , Key )  로 만들어진다.

 

이 두 개를 한 번에 묶어서 보낸다.

 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

[ Bob ]

Message 와 MAC 묶음을 받음

 

- M : Key와 함께 Hash를 돌려서 MAC From Bob를 만든다.

- MAC : 받는다.

 

if( MAC == MAC From Bob ) 을 비교한다.

같다면 Accept , 다르면 Reject

 

둘 중에 하나라도 변조되었다면 바로 탐지가 가능하다. 

 

📌 MAC의 장점

- Message가 Modified 되지 않는 것을 보장해준다. = Integrity 

- Message가 Sender에게 왔다는 것을 보장해준다. = Confidential

- 추가적으로 Message에 Sequence 번호를 부여하면, 순서도 보장받을 수 있다.

 

하지만 한계점으로는 

 

Key의 Size가 짧다면 때려맞출 수도 있음

 

 

추가 구현으로는 Nested MAC이 있다.

Hash (Hash (Message, Key) , Key) 한 값을 MAC으로 사용하는 것이다.

 


📌 HMAC

 

- Step 1 : Key의 길이는 b와 같아야 한다

- Step 2: S1 = K   XOR   ipad

- Step 3: Step2에서 만든 S1과 원본 메시지를 합친다.

- Step 4: 그렇게 합친 걸 Digest해서 H로 만든다. => h(S1+M) = H

- Step 5: Step 2처럼  S2 = K   XOR   opad

- Step 6: Step 5에서 구한 S2와 Step 4에서 구한 H를 붙인다.

- Step7 : h(S2+H) = MAC 을 만든다.

 

- Step 1 : Key의 길이는 b와 같아야 한다

 

1) Key == b ➡️ 냅둔다

2) Key len > b ➡️ Hash 를 돌려서 b까지 줄인다.

3) Key len < b  ➡️ 0 으로 Padding 

 

 

 

- Step 2: S1 = K   XOR   ipad

 

 

 

- Step 3: Step2에서 만든 S1과 원본 메시지를 합친다.

 

 

 

- Step 4: 그렇게 합친 걸 Digest해서 H로 만든다. => h(S1+M) = H

 

 

 

- Step 5: Step 2처럼  S2 = K   XOR   opad

 

 

 

- Step 6: Step 5에서 구한 S2와 Step 4에서 구한 H를 붙인다.

 

 

- Step7 : h(S2+H) = MAC 을 만든다.

 

 

(출처)

한동대학교 컴퓨터 보안