[목차]

 

 

1. SSH 통신 과정 패킷 분석 (내용 생략)

2. HTTP/HTTPS 통신과정 패킷 분석 (내용 생략)

3. SSL Descryption (내용 생략)

4. HMAC 실습

5. CMAC 실습

5. 디지털 서명

 

 


 

 

 

[HMAC(Hash-based Message Authentication Code)]

 

 

 

HMAC(Hash-based MAC)

CMAC(Cipher-based MAC)

poly1305(Stream Cipher-based)

 

 

HMAC(Hash-based Message Authentication Code)

https://pycryptodome.readthedocs.io/en/latest/src/hash/hmac.html

RFC2104, FIPS-198

 

HMAC의 강도는 다음에 따라 다르다.

해시 알고리즘의 강도(the strength of the hash algorithm)

비밀 키의 엔트로피(the entropy of the secret key)

 

 

 HMAC-SHA256 HMAC 인증 및 MAC 유효성 검사

HMAC-SHA256.py

from Crypto.Hash import HMAC, SHA256

# Sender


secret = b'Takudaddy'
message = b'Genius Takudaddy'

mac = HMAC.new(secret, digestmod=SHA256)
mac.update(message)
print(mac.hexdigest())

send_msg = message
send_mac = mac.hexdigest()

# Receiver

recv_msg = send_msg
recv_mac = send_mac
secret = b'Takudaddy'

mac2 = HMAC.new(secret, digestmod=SHA256)
mac2.update(recv_msg)

try:
    mac2.hexverify(recv_mac)
    print('Authentic')
except Exception as e:
    print('Error:', e)

 

 

 


 

 

 

[CMAC(Cipher-based Message Authentication Code)]

 

 

CMAC(Cipher-based Message Authentication Code)

https://pycryptodome.readthedocs.io/en/latest/src/hash/cmac.html

NIST SP 800-38B, RFC 4493

블록 암호를 사용하여 구성된 MAC이다. (: AES-CMAC)

 

 

 AES-CMAC 

CMAC-AES.py

 HMAC-SHA256 HMAC 인증 및 AES-CMAC 유효성 검사

HMAC-SHA256.py

from Crypto.Hash import CMAC
from Crypto.Cipher import AES

secret = b'sixteen byte key'
message = b'takudaddy genius'

# Sender Side

cmac = CMAC.new(secret, ciphermod=AES)
cmac.update(message)
print("Send MAC: ", cmac.hexdigest())

send_msg = message
send_mac = cmac.hexdigest()

# Reciever side

recv_msg = send_msg
recv_mac = send_mac
secret = b'sixteen byte key'

cmac2 = CMAC.new(secret, ciphermod=AES)
cmac2.update(recv_msg)
try:
    cmac2.hexverify(recv_mac)
    print('Authentic')
except Exception as e:
    print('Error:', e)
    print('Not Authentic')

 

 


 

 

 

 

[디지털 서명]

 

 

 

* 공개키 암호: 암호화(public key) -> 복호화(private key)

* 공개키 서명: 암호화(private key) -> 복호화(public key)

 

 

■ 앨리스 차용서

■ 메시지 인증코드에서 디지털 서명으로

■ 서명 작성과 서명 검증

■ 공개 키 암호와 디지털 서명

 

 

1. 앨리스의 차용서

 

차용서를 이메일로 보내면 어떨까?

메일을 누군가가 변경했을 수 있다.

처음부터 앨리스인 것처럼 거짓 행세를 한 누군가가 보낸 것인지도 모른다.

나중에 앨리스가 "그런 차용서 난 몰라"라고 부인할 수도 있다.

 

 

 

2. 메시지 인증 코드에서 디지털 서명으로

 

메시지 인증 코드의 한계

메시지 인증 코드를 사용하면 메시지의 변경과 거짓 행세를 검출할 수 있다.

메시지 인증 코드는 부인 방지에는 도움이 되지 않는다.

 

디지털 서명(digital signature)을 이용한 해결

앨리스가 사용하는 키는 앨리스만이 알고 있는 개인적인 것

앨리스는 메시지 송신 시에 그 개인적인 키를 써서 "서명"을 작성

수신자 밥은 앨리스의 키와는 다른 키를 써서 "서명"을 검증

 

 

 

3. 서명 작성과 서명 검증

 

메시지의 서명을 작성하는 행위

디지털 서명에서는 "서명용 키"(private key) "검증용 키"(public key)가 나누어져 있어서 검증용 키로 서명을 작성할 수는 없다.

 

메시지의 서명을 검증하는 행위

"서명용 키"는 서명을 하는 사람만이 가지고 있지만, "검증용 키"는 서명을 검증하는 사람이라면 누구라도 가질수 있다.

 

 

 

■ 공개키 암호와 디지털 서명

 

공개 키 암호(암호화(pub) -> 복호화(pri))

암호키와 복호키가 나누어져 있어 암호키로 복호화를 행할 수 없다.

복호키는 복호화를 행하는 사람만이 가지고 있지만, 암호키는 암호화를 행하는 사람이라면 누구나 가질 수 있다.

 

디지털 서명(공개 키 서명, 암호화(pri) -> 복호화(pub))

디지털 서명은 공개 키 암호를 "역으로 사용" 함으로써 실현

 

 

 

■ 공개키 암호와 디지털 서명 키 사용방법

 

개인키

공개키

공개 키 암호

수신자가 복호화에 사용

송신자들이 암호화에 사용

디지털 서명

서명자가 서명 작성에 사용

검증자들이 서명 검증에 사용

키는 누가 갖는가?

개인이 갖는다.

필요한 사람은 아무나 가짐



 

4. 공개 키 암호와 디지털 서명

 

메시지를 개인 키로 암호화하는 것이 서명 작성에 해당

암호문을 공개 키로 복호화하는 것이 서명 검증에 해당

 

 

 


 

 

 

[디지털 서명 방법]

 

 

 

■ 디지털 서명 특징

■ 디지털 서명 요구 조건

■ 메시지에 직접 서명하는 방법

■ 메시지의 해시 값에 서명하는 방법

 

 

 

 

1. 디지털 서명 특징

 

위조 불가(Unforgeable) : 서명자만이 서명문을 생성 가능

서명자 인증(Authentic) : 서명문의 서명자를 확인 가능

재사용 불가(Not Reusable) : 서명문의 서명은 다른 문서의 서명으로 사용 불가능

변경 불가(Unalterable) : 서명된 문서의 내용 변경 불가능

부인 불가(Nonrepudiation) : 서명자는 후에 서명한 사실을 부인 불가능

 

 

 

2. 디지털 서명 요구 조건

 

서명은 메시지에 의존하는 비트 형태이어야 한다.

위조와 부인 방지 위해, 송신자의 유일한 정보 비트를 이용해야 한다.

서명문을 만들기 쉬워야 한다.

서명문을 인식, 확인 하기가 쉬워야 한다.

서명문을 위조하는 것이 계산적으로 실행 불가능 해야 한다.

기억장소에 서명문의 복사본을 유지하는 것이 실용적이어야 한다.

 

 

 

3. 메시지에 직접 서명하는 방법

 

① 앨리스는 자신의 개인키로 메시지를 암호화한다.

② 앨리스는 메시지와 서명을 밥에게 송신한다.

③ 밥은 수신한 서명을 앨리스의 공개 키로 복호화한다.

④ 밥은 이제 서명을 복호화해서 얻어진 메시지와 앨리스로 부터 직접 수신한 메시지를 비교한다.

 

 

 

 

728x90

+ Recent posts