메세지 인증코드 MAC
- 기밀성은 필요없고 무결성만 필요할때

코드를 보낼때 MAC 코드를 붙여서 보냄.
메세지와 수신측에서 받은 MAC 이 같나 다른가로 봄.
공격자는 키를 모르기때문에 똑같은 MAC 을 만들 수 없다.
간단한 예시
Alice와 Bob이 "비밀 키 K"를 공유하고 있다고 가정합니다.
Alice가 메시지 M을 Bob에게 보내려고 합니다.
Alice는 M과 K를 사용하여 MAC을 계산합니다: MAC = F(K, M)
Alice는 메시지 M과 MAC을 함께 Bob에게 보냅니다.
Bob은 받은 메시지 M을 사용하여 자신이 가진 비밀 키 K로 MAC을 다시 계산합니다.
계산된 MAC이 Alice로부터 받은 MAC과 일치한다면 메시지는 무결하고, Alice로부터 왔음이 검증됩니다.
특징
- 비밀 키를 사용하기 때문에 발신자의 신뢰성 + 무결성 제공.
단방향 해시함수
- 해시 값은 H(M)
- MAC과 달리 키가 없다. 누구나 공개 검증 가능
HMAC(대칭 암호 MAC) VS 디지털서명(공개키 MAC)
HMAC

- MAC =HMAC(Key,Msg)
- 대칭키 사용 MAC 대비 빠른속도
- 모두 비밀 키를 공유
- MAC 알고리즘(예: HMAC)을 적용하여 MAC을 계산합니다. 그러면 동일한 비밀 키를 알고 있는 수신자가 MAC을 확인하여 메시지의 진위 여부와 무결성을 확인할 수 있습니다.
- ex) SSL/TLS 및 IPsec과 같은 많은 프로토콜

디지털 서명

- 발신자만 개인 키를 사용하여 메시지 또는 메시지의 해시에 서명
- 수신자는 발신자의 공개 키를 사용하여 진위 여부를 확인합니다.
- ex) 문서 서명, 인증서 확인 및 블록체인 거래
비밀값 사용 메세지 인증

-
메시지를 비밀 값과 직접 결합한 다음 그 결과를 해싱하는 방식.
-
H(비밀 || 메시지), 여기서 H는 해시 함수
-
똑같은 값을 가지고 해쉬를 구한거니까 일치해야해.
-
보안적으로는 HMAC 이 낫다.
안전한 해시 함수 요건

일방향 성질(one-way property)
약한 충돌 저항성(weak collision resistance)

-
h(x) = h(y)가 중복된 해쉬값을 갖게 하면 안됨!
-
특정 알려진 입력에 한정
-
공격자가 합법적인 문서나 메시지를 알고 있는 경우 합법적인 문서나 메시지와 동일한 해시를 생성하는 악성 문서나 메시지를 만들 수 없도록 합니다.
-
5천과 5 를 넣었을 때 똑같은 해쉬가 나왔을때.
ex) 해쉬 길이가 10 비트만 써서 1024개일때, 1024번만 돌리면 동일한 해쉬 알 수 있어.
-
브루트포스 시 2^n 비용
강한 충돌 저항성(strong collision resistance)
- x1과 x2에서 h(x1) = h(x2)가 되는 값을 찾는 것이 계산적으로 불가능해야.
- 시작점이 주어지지 않더라도 동일한 값으로 해시되는 서로 다른 두 개의 입력을 찾는 것이 거의 불가능해야 한다는 뜻입니다.
-
랜덤 공격시도로 두개 값이 일치하는것을 찾음.
-
브루트포스 시 위 쌍을 찾는 것 ( Collision ) 은 2^n 이 아닌 2^(n/2) 만에 가능.
-
대칭키는 256비트면 됨. but 해쉬에서는 512를 써야해.(반절만에 강한 충돌 저항성에서 뚤리니까)
약한 충돌 VS 강한 충돌
약한 충돌
- 하나의 입력이 고정되어 주어졌을 때 충돌을 찾는 것이고
- x와 그 해시 h(x)가 주어진 경우, 동일한 해시를 생성하는 다른 입력 y를 찾을 수 없어야 함
강한 충돌
- 모든 가능한 입력 중에서 충돌을 전혀 찾지 않는 것입니다.
SHA-512
- 암호 알고리즘 없고 비밀 키와 메시지를 사용하여 해시 값을 계산
블록체인
등장 배경
- 노드가 스스로 확인 할 수 없는것
• A->B 송금 이후 A->C 송금 즉 double spending이 수신되
었을 때, 어느 것이 진짜 먼저 만들어진 것인지?
=> 블록체인이 해결방안
블록체인 합의
- 노드는 어떤 트랜잭션이 유효한지 결정하기 위해 투표 메커니즘에 의존
- 시빌 공격이 들어올 수 있기 때문에 작업증명(Pow)로 투표권을 얻음.
- Pow 를 사기 치는 것보다 정직하게 했을때 보상을 더 크게줌.
PROOF OF WORK (POW)
- 특정 해시값 찾기 (브루트 포스로)
- N=1 이면 2번 시도, N=8 이면 2^8= 256번 시도