Try   HackMD

PolyPKC - SCTF 2018 final

tags: Crypto

Attachments

Attachments are uploaded on gist.

A brief description

key generation

RSA처럼

N=pq λ₯Ό μž‘λŠ”λ°,
51 | Ο•(N)
을 λ§Œμ‘±ν•˜λŠ” μ†Œμˆ˜
p,q (512 bits)
λ₯Ό μ„ νƒν•œλ‹€.
κ·Έ λ‹€μŒ λžœλ€ν•œ
r
에 λŒ€ν•΄ λΉ„λ°€ν‚€
t≑rΟ•(N)/51 (mod N)
λ₯Ό μ–»λŠ”λ‹€.
μ—¬κΈ°μ„œ
t51≑1 (mod N)
을 λ§Œμ‘±ν•˜κ²Œ λœλ‹€.

κ³΅κ°œν‚€λŠ” μ°¨μˆ˜κ°€ 50인 닀항식

f(x)=c0β‹…x0+c1β‹…x1+...+c50β‹…x50 의 κ³„μˆ˜λ“€μ˜ λ¦¬μŠ€νŠΈμ΄λ‹€.
κ³„μˆ˜λ“€μ€
0≀ci<N
의 λ¬΄μž‘μœ„ λ‚œμˆ˜λ‘œ μ •ν•˜κ³ ,
c0
λ₯Ό μ λ‹Ήνžˆ μ‘°μ •ν•΄μ„œ
f(t)≑0 (mod N)
이 λ˜λ„λ‘ ν•œλ‹€.

encryption

poly_mul ν•¨μˆ˜λ₯Ό μ•„λž˜ μ½”λ“œμ²˜λŸΌ μ •μ˜ν•œλ‹€.

def poly_mul(self, p, q):
    res = [0 for _ in range(self.order)]
    for i in range(self.order):
        for j in range(self.order):
            k = (i + j) % self.order
            res[k] = (res[k] + (p[i] * q[j])) % self.N
    return res

κ·Έ λ’€ μ°¨μˆ˜κ°€ λ§ˆμ°¬κ°€μ§€λ‘œ 50이고

0≀di<N 의 λ¬΄μž‘μœ„ λ‚œμˆ˜λ₯Ό κ³„μˆ˜λ‘œ ν•˜λŠ”
r(x)
λ₯Ό μž‘λŠ”λ‹€.
이제 λ©”μ‹œμ§€
m
이 μ£Όμ–΄μ‘Œμ„ λ•Œ, μ•”ν˜Έλ¬Έ
c(x)=poly_mul(f(x),r(x))+m
이닀.

decryption

λΉ„λ°€ν‚€

tλ₯Ό μ‚¬μš©ν•΄μ„œ
c(t)≑m (mod N)
처럼 λ³΅ν˜Έν™”ν•œλ‹€.
일반적으둜
poly_mul(f1(x),f2(x))|x=k≠f1(k)⋅f2(k)
μ΄μ§€λ§Œ,
k51≑0 (mod N)
인
k
λŠ” μ˜ˆμ™ΈλΌλŠ” 것을 μ•Œ 수 μžˆλ‹€.

λ”°λΌμ„œ

c(t)≑poly_mul(f(t),r(t))+m≑f(t)β‹…r(t)+m≑0β‹…r(t)+m≑m (mod N)
이 μ„±λ¦½ν•œλ‹€.

Finding out private key
t

  1. f(t)≑0 (mod N)
    이닀.
  2. κ³΅κ²©μžκ°€ μž‘μ€ 랜덀 닀항식
    s(x)
    에 λŒ€ν•΄
    poly_mul(f(x),s(x))|x=tmodN
    λ˜ν•œ
    0
    이닀.
  3. λ”°λΌμ„œ
    f(x)
    와
    poly_mul(f(x),s(x))
    에 λŒ€ν•΄
    gcd
    λ₯Ό ν•˜λ©΄
    xβˆ’t
    λ₯Ό 얻을 수 μžˆλ‹€.
  4. m≑c(t) (mod N)

Nκ³Ό μ„œλ‘œ μ†Œκ°€ μ•„λ‹Œ μˆ˜λ“€μ€
p+qβˆ’1
κ°œλ°–μ— μ—†κΈ° λ•Œλ¬Έμ—
gcd
λ₯Ό 톡해 1μ°¨μ‹κΉŒμ§€ μ•ˆμ „ν•˜κ²Œ λ‚΄λ €κ°ˆ 수 μžˆλ‹€.
μ•ˆ 되면 λ‹€λ₯Έ
s(x)
λ₯Ό μž‘μ•„μ„œ 돌리면 λœλ‹€.