EdDSA ์๊ณ ๋ฆฌ์ฆ Ed25519 ๊ณผ Ed448์ ๊ดํ์ฌ
์ด ๊ธ์ [์ถ์ฒ] Practical Cryptographiy for Developer ์์ ๋์ค๋ EdDSA ์ Ed25519 ์ ๊ดํ๊ธ์ ๋ฒ์ญ ํ ๊ฒ์ด๋ค.
EdDSA(Edwards-curve Digital Signature Algorithm)๋
255๋นํธ ๊ณก์ ๋ฐ 448๋นํธ ๊ณก์ ๊ณผ ๊ฐ์ ์ฑ๋ฅ ์ต์ ํ ํ์ ๊ณก์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ๋์ ์ด๊ณ ์์ ํ ๋์งํธ ์๋ช
์๊ณ ๋ฆฌ์ฆ์
๋๋ค.
EdDSA ์๋ช
์ ๊ฐ๊ฐ edwards25519 ๋ฐ edwards448์ธ ํ์ ๊ณก์ ์ Edwards ํ์(์ฑ๋ฅ์์ ์ด์ ๋ก)์ ์ฌ์ฉํฉ๋๋ค.
EdDSA ์๊ณ ๋ฆฌ์ฆ์ ECDLP ๋ฌธ์ ์ ๋์ด๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ ์ด์ ์์กดํฉ๋๋ค.
EdDSA ์๋ช ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ทธ ๋ณํ์ธ Ed25519 ๋ฐ Ed448์ RFC8032 ์ ๊ธฐ์ ์ ์ผ๋ก ์ค๋ช ๋์ด ์์ต๋๋ค.
EdDSA ํค ์์ฑ
Ed25519 ๋ฐ Ed448์ ์์ ๊ฐ์ธ ํค(๊ฐ๊ฐ 32 ๋๋ 57๋ฐ์ดํธ), ์์ ๊ณต๊ฐ ํค(32 ๋๋ 57๋ฐ์ดํธ) ๋ฐ
์์ ์๋ช
(64 ๋๋ 114๋ฐ์ดํธ)์ ๋์์ ๋์ ๋ณด์ ์์ค(๊ฐ๊ฐ 128๋นํธ ๋๋ 224๋นํธ)์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
EdDSA ์๊ณ ๋ฆฌ์ฆ์ ํ์ ๊ณก์ ์๋ ์์ฑ๊ธฐ ์ G์ G์์ ์์ฑ๋ EC ์ ์ ๋ํ ํ์ ๊ทธ๋ฃน ์ฐจ์ q๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
EdDSA ํค ์์ ๋ค์์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ๊ฐ์ธ ํค(์ ์): privKey
- ๊ณต๊ฐ ํค(EC ํฌ์ธํธ): pubKey = privKey * G
๊ฐ์ธ ํค๋ ์๋(๊ณก์ ์์์ ๊ฐ์ด ๋นํธ ๊ธธ์ด๊ฐ ์ ์ฌํด์ผ ํจ)๋ก ์๋ ค์ง ์์์ ์ ์์์ ์์ฑ๋ฉ๋๋ค.
์๋๊ฐ ๋จผ์ ํด์๋ ๋ค์ ๊ณก์ cofactor(Ed25519์ ๊ฒฝ์ฐ 8, X448์ ๊ฒฝ์ฐ 4)์ ํด๋นํ๋ ๋ง์ง๋ง ๋ช ๋นํธ๊ฐ ์ง์์ง ๋ค์ ๊ฐ์ฅ ๋์ ๋นํธ๊ฐ ์ง์์ง๊ณ ๋ ๋ฒ์งธ๋ก ๋์ ๋นํธ๊ฐ ์ค์ ๋ฉ๋๋ค.
์ด๋ฌํ ๋ณํ์ ๊ฐ์ธ ํค๊ฐ ํญ์ ๊ณก์ ์ ๋์ผํ EC ์ง์ ํ์ ๊ทธ๋ฃน์ ์ํ๊ณ ๊ฐ์ธ ํค๊ฐ ํญ์ ์ ์ฌํ ๋นํธ ๊ธธ์ด๋ฅผ ๊ฐ๋๋ก ๋ณด์ฅํฉ๋๋ค(ํ์ด๋ฐ ๊ธฐ๋ฐ ์ฌ์ด๋ ์ฑ๋ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธ).
Ed25519์ ๊ฒฝ์ฐ ๊ฐ์ธ ํค๋ 32๋ฐ์ดํธ์
๋๋ค. Ed448์ ๊ฒฝ์ฐ ๊ฐ์ธ ํค๋ 57๋ฐ์ดํธ์
๋๋ค.
๊ณต๊ฐ ํค pubKey๋ EC ํฌ์ธํธ ๊ณฑ์
: pubKey = privKey * G(๊ณก์ ์ ๋ํด ์์ฑ๊ธฐ ํฌ์ธํธ G๋ฅผ ๊ณฑํ ๊ฐ์ธ ํค)๋ก ๊ณ์ฐ๋๋ ํ์ ๊ณก์ ์ ํ ์ ์
๋๋ค.
๊ณต๊ฐ ํค๋ x ์ขํ์ ์ตํ์ ๋นํธ(ํจ๋ฆฌํฐ)์ ๊ฒฐํฉ๋ y ์ขํ์ธ ์์ถ๋ EC ํฌ์ธํธ๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค. Ed25519์ ๊ฒฝ์ฐ ๊ณต๊ฐ ํค๋ 32๋ฐ์ดํธ์ ๋๋ค. Ed448์ ๊ฒฝ์ฐ ๊ณต๊ฐ ํค๋ 57๋ฐ์ดํธ์ ๋๋ค.
EdDSA ์๋ช
EdDSA ์๋ช ์๊ณ ๋ฆฌ์ฆ()์ ๋ฌธ์ ๋ฉ์์ง msg + ์๋ช ์์ EdDSA ๊ฐ์ธ ํค privKey๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์ ์ ์ {R, s}๋ฅผ ์ถ๋ ฅ์ผ๋ก ์์ฑํฉ๋๋ค. EdDSA ์๋ช ์ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค(์ฝ๊ฐ ๋จ์ํ๋จ).
EdDSA_sign(msg, privKey) --> { R, s }
- Calculate pubKey = privKey * G
- ๊ฒฐ์ ๋ก ์ ์ผ๋ก ๋น๋ฐ ์ ์ r = hash(hash(privKey) + msg) mod q๋ฅผ ์์ฑํฉ๋๋ค(์ฝ๊ฐ ๋จ์ํ๋จ).
- ๊ณก์ ์์ฑ๊ธฐ๋ฅผ ๊ณฑํ์ฌ r ๋ค์ ์๋ ๊ณต๊ฐ ํค ํฌ์ธํธ๋ฅผ ๊ณ์ฐํฉ๋๋ค. R = r * G
- Calculate h = hash(R + pubKey + msg) mod q
- Calculate s = (r + h * privKey) mod q
- ์๋ช ๋ฆฌํด { R, s }
์์ฑ๋ ๋์งํธ ์๋ช
์ Ed25519์ ๊ฒฝ์ฐ 64๋ฐ์ดํธ(32 + 32๋ฐ์ดํธ), Ed448์ ๊ฒฝ์ฐ 114๋ฐ์ดํธ(57 + 57๋ฐ์ดํธ)์
๋๋ค.
์์ถ๋ ์ง์ R + ์ ์ s๋ฅผ ๋ณด์ ํฉ๋๋ค(์๋ช
์๊ฐ msg ๋ฐ privKey๋ฅผ ์๊ณ ์์์ ํ์ธ).
EdDSA ์๋ช ๊ฒ์ฆ
EdDSA ์๋ช
ํ์ธ ์๊ณ ๋ฆฌ์ฆ()์ ํ
์คํธ ๋ฉ์์ง msg + ์๋ช
์์ EdDSA ๊ณต๊ฐ ํค pubKey + EdDSA ์๋ช
{R, s}๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์
boolean ๊ฐ(์ ํจ ๋๋ ๋ฌดํจ ์๋ช
)์ ์ถ๋ ฅ์ผ๋ก ์์ฑํฉ๋๋ค.
EdDSA ํ์ธ์ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค(์ฝ๊ฐ ๋จ์ํ๋จ).
EdDSA_signature_verify(msg, pubKey, signature { R, s } ) --> ์ ํจ/๋ฌดํจ
- Calculate h = hash(R + pubKey + msg) mod q
- Calculate P1 = s * G
- Calculate P2 = R + h * pubKey
- Return P1 == P2
How Does it Work?
ํ์ธํ๋ ๋์ ์ P1์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐ๋ฉ๋๋ค. P1 = s * G.
์๋ช
ํ๋ ๋์ s = (r + h * privKey) mod q. ์ด์ ์ ๋ฐฉ์ ์์์ s๋ฅผ ๋ฐ๊ฟ๋๋ค.
- P1 = s * G = (r + h * privKey) mod q * G = r * G + h * privKey * G = R + h * pubKey
์๋ ์ ํํ ๋ค๋ฅธ ์ P2์
๋๋ค.
P1๊ณผ P2 ํฌ์ธํธ๊ฐ ๋์ผํ EC ํฌ์ธํธ๋ผ๋ฉด ๊ฐ์ธ ํค๋ก ๊ณ์ฐํ P1 ํฌ์ธํธ์
ํด๋น ๊ณต๊ฐ ํค๋ก ์์ฑํ ํฌ์ธํธ P2๊ฐ ์ผ์นํจ์ ์ฆ๋ช
ํฉ๋๋ค.
ECDSA ๋ EdDSA
EdDSA์ ์๋ช
๋ฐ ๊ฒ์ฆ์ ๋น๊ตํ๋ฉด EdDSA๊ฐ ECDSA๋ณด๋ค ๊ฐ๋จํ๊ณ ์ดํดํ๊ณ ๊ตฌํํ๊ธฐ ์ฝ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋ ์๋ช
์๊ณ ๋ฆฌ์ฆ์ ํค ๊ธธ์ด๊ฐ ๋น์ทํ ๊ณก์ ์ ๋ํด ์ ์ฌํ ๋ณด์ ๊ฐ๋๋ฅผ ๊ฐ์ง๋๋ค.
๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๊ณก์ (์: edwards25519 ๋ฐ edwards448)์ ๊ฒฝ์ฐ
EdDSA ์๊ณ ๋ฆฌ์ฆ์ ECDSA๋ณด๋ค ์ฝ๊ฐ ๋น ๋ฅด์ง๋ง ์ฌ์ฉ๋ ๊ณก์ ๊ณผ ํน์ ๊ตฌํ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋๋ค.
ECDSA์ ๋ฌ๋ฆฌ EdDSA ์๋ช
์ ์๋ช
๋ฐ ๋ฉ์์ง์์ ์๋ช
์์ ๊ณต๊ฐ ํค๋ฅผ ๋ณต๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก EdDSA๋ ๋๋ถ๋ถ์ ์ต์ ์ฑ์ ๊ถ์ฅ๋๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
๋ง๋ฌด๋ฆฌ
EdDSA ๊ฒฝ์ฐ ๋น๊ต์ ์ํ์ ์ผ๋ก ๋จ์ํ๊ณ ํจ์จ์ ์ด๋ผ๊ณ ํ๋ค.
์ฐธ๊ณ ๋ก ์ผ๋ฐ์ ์ผ๋ก ์ ์์๋ช
์์ ํด์ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ ํ ํ๋๋ฐ ํด์ฌ ์ ํ๋ ์๋ค.
Ed25519 ๊ฒฝ์ฐ SHA-512 ๊ณ ์ ์ด๊ตฌ Ed448 ๊ฒฝ์ฐ๋ SHAKE-256 ๊ณ ์ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
ํค ๊ธธ์ด๊ฐ ECDSA ๋งํผ ์งง์ ๊ธธ์ด๋ฅผ ๊ฐ์ง๊ณ ํจ์จ์ ์ด๋ผ๊ณ ํ๋ ์ข์ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ ์๊ฐํ๋ค.
์ฌ์ค ์์ง EdDSA ๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๋๊ฒ์ ๋ง๋์ง๋ ๋ชปํ๋ค.
ํ์ง๋ง CertMan ๊ณผ BerEditor ์์ OpenSSL ์ ์ด์ฉํด ์ด ์๊ณ ๋ฆฌ์ฆ๋ ์ง์ ํ ๊ณํ์ด๋ผ(์ญ์ OpenSSL)
๊ด๋ จ ๋ด์ฉ์ ๋ฒ์ญํด์ ์ ๋ฆฌํด ๋ณด์๋ค.
๋ฒ์ญ์ด์ง ๋ด๊ฐ ์์ ํ ์ดํด ํ๊ฑด ์๋๋ค ( ์ํ ์ด๋ ค์ T.T )
์ฐธ๊ณ
์๋ ๋งํฌ๋ ๊ฐ๋ฐ์ ์ฐธ์กฐ ํ ๋ ค๊ตฌ ๊ฑธ์ด ๋
OpenSSL Man Ed25519
OpenSSL Man Ed448
EdDSA:Sign/Verify - Examples