PromleeBlog
sitemap
aboutMe
Menu
Welcome to
✨ Promlee Blog ✨
View 📈
Total: -
Today: -
추천 포스트
개인학습
정보보호이론
디지털 서명
서명 스키마
서명 스키마
Signature Schemes
📅
🚀 RSA 서명
✅ 키 생성
✅ 서명
✅ 검증
✅ 정확성
🚀 RSA 패딩: 확률론적 서명 표준
🚀 ElGamal 서명
✅ 키 생성
✅ 서명
✅ 검증
✅ 정확성
✅ 보안성
🚀 DSA 서명
✅ 키 생성
✅ 서명
✅ 검증
✅ 정확성
🚀
RSA 서명 (RSA Signature)
🔗
✅
키 생성 (RSA)
🔗
두 소수
p
,
q
p, q
p
,
q
를 무작위로 선택,
N
=
p
q
N = pq
N
=
pq
로 설정
무작위 공개 지수
e
∈
Z
ϕ
(
N
)
∗
e \in \mathbb{Z}^*_{\phi(N)}
e
∈
Z
ϕ
(
N
)
∗
를 선택
d
⋅
e
≡
1
(
m
o
d
ϕ
(
N
)
)
d \cdot e \equiv 1 \pmod{\phi(N)}
d
⋅
e
≡
1
(
mod
ϕ
(
N
))
를 만족하는
d
d
d
를 계산
공개 키
p
k
=
(
N
,
e
)
pk = (N, e)
p
k
=
(
N
,
e
)
, 개인 키
s
k
=
d
sk = d
s
k
=
d
를 반환
✅
서명 (RSA)
🔗
메시지
M
M
M
에 대해
s
=
M
d
(
m
o
d
N
)
s = M^d \pmod{N}
s
=
M
d
(
mod
N
)
을 계산하여 서명
σ
=
(
M
,
s
)
\sigma =(M, s)
σ
=
(
M
,
s
)
를 생성
✅
검증 (RSA)
🔗
σ
=
(
M
,
s
)
\sigma = (M, s)
σ
=
(
M
,
s
)
가 주어졌을 때,
s
e
=
?
M
(
mod
N
)
s^e \stackrel{?}{=} M \ (\text{mod} \ N)
s
e
=
?
M
(
mod
N
)
을 확인한다. 이 조건이 성립하면 1을 반환하고, 그렇지 않으면 0을 반환한다.
✅
정확성 (RSA)
🔗
s
e
=
(
M
d
)
e
=
M
e
d
=
M
1
+
k
ϕ
(
N
)
=
M
(
mod
N
)
s^e = (M^d)^e = M^{ed} = M^{1 + k\phi(N)} = M \ (\text{mod} \ N)
s
e
=
(
M
d
)
e
=
M
e
d
=
M
1
+
k
ϕ
(
N
)
=
M
(
mod
N
)
이 오일러 정리에 의해 성립한다.
🚀
RSA 패딩: 확률론적 서명 표준 (RSA Padding: Probabilistic Signature Standard)
🔗
이전 공격을 방지하기 위해 특정 메시지 형식만 허용
확률론적 서명 표준(PSS)
임의의 값
s
a
l
t
salt
s
a
lt
를 생성
고정 패딩 8개의 0x00 바이트, 해시 값
m
H
a
s
h
=
Hash
(
M
)
mHash = \text{Hash}(M)
m
H
a
s
h
=
Hash
(
M
)
,
s
a
l
t
salt
s
a
lt
를 이어붙여 문자열
M
′
M'
M
′
을 생성
M
′
=
0x00
∥
0x01
∥
m
H
a
s
h
∥
salt
M' = \text{0x00} \mathbin\Vert \text{0x01} \mathbin\Vert mHash\mathbin\Vert \text{salt}
M
′
=
0x00
∥
0x01
∥
m
H
a
s
h
∥
salt
H
=
Hash
(
M
′
)
H = \text{Hash}(M')
H
=
Hash
(
M
′
)
를 계산
고정 패딩
P
S
PS
PS
,
0
x
01
0x01
0
x
01
,
s
a
l
t
salt
s
a
lt
를 이어붙여 문자열
D
B
DB
D
B
을 생성
D
B
=
PS
∥
0x01
∥
salt
DB = \text{PS} \mathbin\Vert \text{0x01} \mathbin\Vert \text{salt}
D
B
=
PS
∥
0x01
∥
salt
m
a
s
k
e
d
D
B
=
MGF
(
H
)
⊕
D
B
maskedDB = \text{MGF}(H) \oplus DB
ma
s
k
e
d
D
B
=
MGF
(
H
)
⊕
D
B
고정 패딩
T
F
TF
TF
를 위해 인코딩된 메시지
E
M
EM
EM
을 생성
E
M
=
m
a
s
k
e
d
D
B
∥
H
∥
T
F
EM = maskedDB \mathbin\Vert H\mathbin\Vert TF
EM
=
ma
s
k
e
d
D
B
∥
H
∥
TF
➡️
정리 (RSA PSS)
🔗
RSA PSS는 확률론적 서명 표준으로,
이전 공격
을 방지하기 위해 특정 메시지 형식만 허용한다.
RSA PSS는 메시지
M
M
M
에 대해
s
a
l
t
salt
s
a
lt
를 이용하여
M
′
M'
M
′
을 생성하고,
M
′
M'
M
′
에 대한 해시값
H
H
H
를 계산한다.
H
H
H
를 이용하여
D
B
DB
D
B
를 생성하고,
D
B
DB
D
B
에 대한 마스킹된 값
m
a
s
k
e
d
D
B
maskedDB
ma
s
k
e
d
D
B
를 계산한다.
m
a
s
k
e
d
D
B
maskedDB
ma
s
k
e
d
D
B
를 이용하여 인코딩된 메시지
E
M
EM
EM
을 생성한다.
🚀
ElGamal 서명 (ElGamal Signature)
🔗
✅
키 생성 (ElGamal)
🔗
큰 소수
p
p
p
와
Z
p
∗
\mathbb{Z}_p^*
Z
p
∗
의 큰 subgroup 생성자
g
g
g
를 선택
임의의 정수
x
∈
{
2
,
3
,
…
,
p
−
2
}
x \in \{2, 3, \ldots, p-2\}
x
∈
{
2
,
3
,
…
,
p
−
2
}
를 선택
X
=
g
x
(
m
o
d
p
)
X = g^x \pmod{p}
X
=
g
x
(
mod
p
)
를 계산
공개 키
p
k
=
(
p
,
g
,
X
)
pk = (p, g, X)
p
k
=
(
p
,
g
,
X
)
, 개인 키
s
k
=
x
sk = x
s
k
=
x
를 반환
✅
서명 (ElGamal Signature)
🔗
비밀 키
s
k
=
x
sk = x
s
k
=
x
와 메시지
M
M
M
이 주어졌을 때
Z
p
−
1
∗
\mathbb{Z}_{p-1}^*
Z
p
−
1
∗
에서 임의의 원소
k
k
k
를 선택
r
=
g
k
(
m
o
d
p
)
r = g^k \pmod{p}
r
=
g
k
(
mod
p
)
와
s
=
(
M
−
x
r
)
k
−
1
(
m
o
d
p
−
1
)
s = (M - xr)k^{-1} \pmod{p-1}
s
=
(
M
−
x
r
)
k
−
1
(
mod
p
−
1
)
을 계산
서명
σ
=
(
M
(
r
,
s
)
)
\sigma = (M(r, s))
σ
=
(
M
(
r
,
s
))
를 반환
✅
검증 (ElGamal Signature Verification)
🔗
공개 키
p
k
=
(
p
,
g
,
X
)
pk = (p, g, X)
p
k
=
(
p
,
g
,
X
)
와 메시지
M
M
M
에 대한 서명
σ
=
(
M
,
r
,
s
)
\sigma = (M, r, s)
σ
=
(
M
,
r
,
s
)
가 주어졌을 때
t
=
X
r
⋅
r
s
(
m
o
d
p
)
t = X^r \cdot r^s \pmod{p}
t
=
X
r
⋅
r
s
(
mod
p
)
를 계산
t
=
?
g
M
(
m
o
d
p
)
t \stackrel{?}{=} g^M \pmod{p}
t
=
?
g
M
(
mod
p
)
를 확인한다. 이 조건이 성립하면 1을 반환하고, 그렇지 않으면 0을 반환한다.
✅
정확성 (ElGamal Signature correctness)
🔗
t
=
X
r
⋅
r
s
=
(
g
x
)
r
⋅
(
g
k
)
s
=
(
g
x
)
⋅
(
g
k
)
(
M
−
r
x
)
k
−
1
=
g
x
r
+
M
−
r
x
=
g
M
(
mod
p
)
t = X^r \cdot r^s = (g^x)^r \cdot (g^k)^s \\= (g^x) \cdot (g^k)^{(M-rx)k^{-1}} \\= g^{xr+M-rx} \\= g^M \ (\text{mod} \ p)
t
=
X
r
⋅
r
s
=
(
g
x
)
r
⋅
(
g
k
)
s
=
(
g
x
)
⋅
(
g
k
)
(
M
−
r
x
)
k
−
1
=
g
x
r
+
M
−
r
x
=
g
M
(
mod
p
)
✅
보안성 (ElGamal Signature Security)
🔗
이산 로그 문제가 풀기 어려운 만큼 비밀 키
x
x
x
를 복구하기 어렵다.
존재적 위조 공격 (Existential Forgery Attack)
정수
i
,
j
i, j
i
,
j
를 선택하고 여기서
gcd
(
j
,
p
−
1
)
=
1
\gcd(j, p-1) = 1
g
cd
(
j
,
p
−
1
)
=
1
이어야 함
r
=
g
i
⋅
X
j
(
mod
p
)
r = g^i \cdot X^j \ (\text{mod} \ p)
r
=
g
i
⋅
X
j
(
mod
p
)
를 계산한다.
s
=
−
r
j
−
1
(
mod
p
−
1
)
s = -rj^{-1} \ (\text{mod} \ p-1)
s
=
−
r
j
−
1
(
mod
p
−
1
)
를 계산한다.
M
=
s
i
(
mod
p
−
1
)
M = si \ (\text{mod} \ p-1)
M
=
s
i
(
mod
p
−
1
)
를 계산한다.
σ
=
(
M
,
(
r
,
s
)
)
\sigma = (M, (r, s))
σ
=
(
M
,
(
r
,
s
))
를 출력한다.
⇒ 그러면
t
=
X
r
⋅
r
s
(
mod
p
)
t = X^r \cdot r^s \ (\text{mod} \ p)
t
=
X
r
⋅
r
s
(
mod
p
)
이 성립하며
t
=
g
M
(
mod
p
)
t = g^M \ (\text{mod} \ p)
t
=
g
M
(
mod
p
)
이므로
t
=
X
r
⋅
r
s
=
(
g
x
)
r
⋅
(
g
i
⋅
g
x
j
)
s
=
g
x
r
+
s
i
−
r
j
−
1
x
j
=
g
s
i
=
g
M
(
mod
p
)
t = X^r \cdot r^s = (g^x)^r \cdot (g^i \cdot g^{xj})^s \\= g^{xr + si - rj^{-1}xj} = g^{si} = g^M \ (\text{mod} \ p)
t
=
X
r
⋅
r
s
=
(
g
x
)
r
⋅
(
g
i
⋅
g
x
j
)
s
=
g
x
r
+
s
i
−
r
j
−
1
x
j
=
g
s
i
=
g
M
(
mod
p
)
따라서
σ
=
(
M
,
(
r
,
s
)
)
\sigma = (M, (r, s))
σ
=
(
M
,
(
r
,
s
))
가 유효하다.
🚀
DSA 서명 (DSA Signature)
🔗
✅
키 생성 (DSA)
🔗
순환 부분군
G
\mathbb{G}
G
생성
소수
p
p
p
선택
Z
p
∗
\mathbb{Z}_p^*
Z
p
∗
는 소수
p
p
p
에 대한 유한체의 곱셈 군
Z
p
∗
\mathbb{Z}_p^*
Z
p
∗
의 순서란 이 군에 속하는 모든 원소의 개수:
p
−
1
p-1
p
−
1
q
q
q
는
p
−
1
p-1
p
−
1
의 소인수 중 하나인 소수
원소 개수가
q
q
q
인 부분군
G
\mathbb{G}
G
를 생성
부분군
G
\mathbb{G}
G
의 임의의 생성자
g
g
g
선택
Z
q
\mathbb{Z}_q
Z
q
에서 임의의
x
x
x
선택 후
X
=
g
x
(
m
o
d
p
)
X = g^x \pmod{p}
X
=
g
x
(
mod
p
)
계산
공개 키
p
k
=
(
p
,
q
,
g
,
X
)
pk = (p, q, g, X)
p
k
=
(
p
,
q
,
g
,
X
)
, 개인 키
s
k
=
x
sk = x
s
k
=
x
를 반환
✅
서명 (DSA Signature)
🔗
비밀 키
s
k
=
x
sk = x
s
k
=
x
와 메시지
M
M
M
이 주어졌을 때
Z
q
∗
\mathbb{Z}_q^*
Z
q
∗
에서 임의의
k
k
k
선택
r
=
(
g
k
(
m
o
d
p
)
)
(
m
o
d
q
)
r = (g^k \pmod{p}) \pmod{q}
r
=
(
g
k
(
mod
p
))
(
mod
q
)
계산
s
=
k
−
1
(
H
(
M
)
+
x
r
)
(
m
o
d
q
)
s = k^{-1}(H(M) + xr) \pmod{q}
s
=
k
−
1
(
H
(
M
)
+
x
r
)
(
mod
q
)
계산
서명
σ
=
(
M
,
(
r
,
s
)
)
\sigma = (M,(r, s))
σ
=
(
M
,
(
r
,
s
))
를 반환
✅
검증 (DSA Signature Verification)
🔗
공개 키
p
k
=
(
p
,
q
,
g
,
X
)
pk = (p, q, g, X)
p
k
=
(
p
,
q
,
g
,
X
)
와 메시지
M
M
M
에 대한 서명
σ
=
(
M
,
(
r
,
s
)
)
\sigma = (M, (r, s))
σ
=
(
M
,
(
r
,
s
))
가 주어졌을 때
0
<
r
<
q
,
0
<
s
<
q
0 < r < q, 0 < s < q
0
<
r
<
q
,
0
<
s
<
q
를 확인
w
=
s
−
1
(
m
o
d
q
)
w = s^{-1} \pmod{q}
w
=
s
−
1
(
mod
q
)
를 계산
u
1
=
H
(
M
)
⋅
w
(
m
o
d
q
)
u_1 = H(M) \cdot w \pmod{q}
u
1
=
H
(
M
)
⋅
w
(
mod
q
)
,
u
2
=
r
w
(
m
o
d
q
)
u_2 = rw \pmod{q}
u
2
=
r
w
(
mod
q
)
를 계산
v
=
(
g
u
1
X
u
2
(
m
o
d
p
)
)
(
m
o
d
q
)
v = (g^{u_1}X^{u_2} \pmod{p}) \pmod{q}
v
=
(
g
u
1
X
u
2
(
mod
p
))
(
mod
q
)
를 계산
v
=
?
r
v \stackrel{?}{=} r
v
=
?
r
를 확인한다. 이 조건이 성립하면 1을 반환하고, 그렇지 않으면 0을 반환한다.
✅
정확성 (DSA Signature correctness)
🔗
v
=
g
u
1
X
u
2
=
g
u
1
+
x
u
2
v = g^{u_1}X^{u_2} = g^{u_1+xu_2}
v
=
g
u
1
X
u
2
=
g
u
1
+
x
u
2
=
g
w
(
H
(
M
)
+
x
r
)
= g^{w(H(M)+xr)}
=
g
w
(
H
(
M
)
+
x
r
)
=
g
k
(
H
(
M
)
+
x
r
)
−
1
(
H
(
M
)
+
x
r
)
= g^{k(H(M)+xr)^{-1}(H(M)+xr)}
=
g
k
(
H
(
M
)
+
x
r
)
−
1
(
H
(
M
)
+
x
r
)
=
g
k
(
mod
p
)
→
(
∵
s
=
k
−
1
(
H
(
M
)
+
x
r
)
)
= g^{k} \ (\text{mod} \ p) \rightarrow (\because s = k^{-1}(H(M)+xr))
=
g
k
(
mod
p
)
→
(
∵
s
=
k
−
1
(
H
(
M
)
+
x
r
))
⟹
r
(
m
o
d
q
)
=
g
k
(
m
o
d
q
)
=
g
u
1
X
u
2
(
m
o
d
q
)
=
v
\Longrightarrow r \pmod{q} = g^k \pmod{q} = g^{u_1}X^{u_2} \pmod{q} = v
⟹
r
(
mod
q
)
=
g
k
(
mod
q
)
=
g
u
1
X
u
2
(
mod
q
)
=
v