누가 보낸 건지, 추가로 언제 보낸 건지 확인할 수 있다.
서명이 생성될 당시, 메시지의 내용에 대한 확인할 수 있다.
제3자가 분쟁을 해결할 수 있음을 보장한다.
보낸 사람이 보낸 사실을 부인/위조할 수 없어야 한다.
서명 생성 및 확인이 쉬워야 한다.
private key가 없으면 서명 생성은 어려워야 한다.
기존 디지털 서명을 가지고 새 메시지를 구성하거나, 특정 메시지에 대한 사기 디지털 서명을 구성하여 디지털 서명을 위조하는 것은 계산상 불가능해야 한다.
사용자 인증 프로토콜
단순히 똑같은 비밀번호를 입력하는 것이 아니라, 주어진 질문에 대해 계산을 해서 답하는 방식
내가 비밀번호를 입력하는 것을 옆에서 누가 몰래 봐도 안전
이 경우, 상대방(나를 인증하는 쪽)이 내 비밀번호(private key)를 알고 있어야 하는 거 아닌가?
상대방이 나에 대해 얻어가는 정보는 없다.
이걸 증명하는게 "zero-knowledge proof"
Bob이 만들어낼 질문, 즉 r이 무엇인지 미리 안다면 Alice가 아닌 다른 사람도 이 테스트를 통과할 수 있다.
이 문제를 해결하기 위해 다음과 같이 바꿀 수 있다.
원래는 r을 받아서 Γ를 만들어 냈는데, 이제는 처음부터 Alice가 Γ를 만들어 Bob에게 보낸다.
Bob은 M(message)와 Γ를 넣고 hash를 돌려서 r을 만들어 냄 -> r = H(M||y)
결과적으로, Alice는 Bob에게 (Γ, y) 쌍을 보내는 것
Γ 먼저 정하고, Hash에 의해서 r을 생성하기 때문에, a를 가진 Alice만 이 테스트를 통과할 수 있다.
Verifier
r = H(M||y) 계산
y = α^y * v^r mod p 증명
Proof가 (Γ, y)로 구성되는 것이 아니라, M: (r, y)로 구성됨 <- 서명
Verifier
y' = α^y * v^r mod p 계산
r = H(M||y')
출처
https://hororolol.tistory.com/477?category=897521
[Cryptography and Network Security: Principles and Practices]