Rivest–Shamir–Adleman-Germain[crypto]

2024. 12. 1. 20:56ยท๐Ÿฆ– Private/CTF Wriet-Up

1. ๋ฌธ์ œ ์„ค๋ช…

rsa ์•”ํ˜ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ์„ฑ๋œ ๊ฐ’์„ ๋ณตํ˜ธํ™”ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ๊ฐ™๋‹ค.

(RSA ์ž˜ ์ •๋ฆฌ๋œ ๋ธ”๋กœ๊ทธ: https://gngsn.tistory.com/96)


2. ๋ฌธ์ œ ๋ถ„์„

import os
from Crypto.Util.number import getPrime
from Crypto.Util.number import isPrime
from Crypto.Util.number import bytes_to_long

 

 

<์†Œ์ˆ˜ ์ƒ์„ฑ ํ•จ์ˆ˜: generate_primes()>

def generate_primes():
    while True:
    #512 bits ์†Œ์ˆ˜ p ๊ทธ๋ฆฌ๊ณ  p๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ q,r,s ์ƒ์„ฑ
        p = getPrime(512), 
        q = (2*p) + 1
        r = (2*q) + 1
        s = (2*r) + 1

		#q, r, s๊ฐ€ ๋ชจ๋‘ ์†Œ์ˆ˜์ด๋ฉด while ๋ฌดํ•œ๋ฃจํ”„ ์ข…๋ฃŒ
        if isPrime(q) and isPrime(r) and isPrime(s): 
            break
            
    #p,q,r,s ๊ฐ’ ๋ฐ˜ํ™˜
    return (p, q, r, s)

getPrime() ํ•จ์ˆ˜๋Š” ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜์ด๊ณ , isPrime() ํ•จ์ˆ˜๋Š” ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์†Œ์ธ์ˆ˜๋ถ„ํ•ด ๋ฌธ์ œ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ์‚ฌ์‹ค์— ๊ธฐ๋ฐ˜ํ•œ RSA ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€, ํ‚ค๋ฅผ ์•Œ์•„๋‚ด๊ธฐ ์–ด๋ ต๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํฐ ์†Œ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํฐ ์ˆ˜์˜ ์†Œ์ˆ˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

ํ˜„์žฌ 512 bits์˜ ์†Œ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์—์„œ ํ•ด๋‹น rsa ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ ์ปดํ“จํŒ… ํŒŒ์›Œ๋กœ 1024 bits ์ดํ•˜์˜ ์†Œ์ˆ˜๋Š” ์˜ˆ์ธก์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

<๋ฉ”์ธ ํ•จ์ˆ˜>

def main() -> int:
	#gernerate_primes() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด p,q,r,s๋ฅผ ์ƒ์„ฑ
    #p,q,r,s๋ฅผ ์ด์šฉํ•ด ๊ฐœ์ธํ‚ค์˜ ์ผ๋ถ€์ธ N์„ ์ƒ์„ฑ
    (p, q, r, s) = generate_primes()
    N = p * q * r * s
    e = 0x10001 

    with open("flag.txt", "r") as flag_file:
    
    #read()๋ฅผ ํ†ตํ•ด ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฝ์–ด์˜ค๊ณ , strip()์„ ์‚ฌ์šฉํ•ด ์–‘์ชฝ ๋ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•œ๋‹ค
        flag = flag_file.read().strip()
	
	#pow() ์ œ๊ณฑ๊ทผ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์•”ํ˜ธ๋ฌธ CT๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
    CT = pow(bytes_to_long(flag.encode()), e, N)

    print(f"{N = }")
    print(f"{CT = }")

e-> 16์ง„์ˆ˜: 0x10001, 10์ง„์ˆ˜: 65537, 8์ง„์ˆ˜: 20001, 2์ง„์ˆ˜: 10000000000000001


3. ๋ฌธ์ œ ํ’€์ด

<์‹œ๋„ 1>

output.txt ํŒŒ์ผ์— N๊ฐ’๊ณผ CT(์•”ํ˜ธ๋ฌธ)๊ฐ’์ด ์ฃผ์–ด์ ธ์žˆ๋‹ค. 

N = 489654925303072532553659432557377999607856370197579144782976005904927235244321459117898721690940319487769632950077647476152880207627385231603017537961906244964117707813500615680799967895028255666319186794462243666159201392490299439947399915406223652423977002396844720487588735149486903743362109592536081726574342051928022071576485169655694281378301551060632699138055044915993078059902577590451519251321215765308977494770310317350866241246677761542212605478044672014913289740381478940929584556588858045439572693806615268502627912952686133840081188641597461343817750411035667135310831687533531094008308185320371643348451
CT = 58535947031303233853656030097871859886777764034955095086618901763996192727846608049414977429851683454541344096765319691912454768331685486037922533236779909508856486986528041125267338846421238077083738092020495236946742989769815669001100361743526446503248639704900983287986142636083524250650662602975802778548032518674346903013262799229594298599457623347987250272218522320743415393958131916181915804368140008312975210397791293701839101635851486434802271100141743496402698229558250485987421664294229816166263965806962242894230766553316312608696594536239328785792283453559549564751529321240567418095487324718881437825650

 

1. ์ถฉ๋ถ„ํžˆ ํฐ ์†Œ์ˆ˜  p์™€ q ์„ค์ •

ํ˜„์žฌ p์™€ q๋Š” ์•Œ์ง€ ๋ชปํ•œ๋‹ค.

 

2. N ๊ตฌํ•˜๊ธฐ

ํ˜„์žฌ N์˜ ๊ฐ’์ด ์ฃผ์–ด์ ธ์žˆ๊ณ , p๊ฐ€ 512bits์ด๊ธฐ ๋•Œ๋ฌธ์— p๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

from sympy import isprime

def factorize_n(n):
    # 512๋น„ํŠธ ์†Œ์ˆ˜์˜ ๋ฒ”์œ„ ๊ณ„์‚ฐ
    min_p = 2**511
    max_p = 2**512 - 1

    # 512๋น„ํŠธ ๋ฒ”์œ„ ๋‚ด์—์„œ ์†Œ์ˆ˜ `p` ์ฐพ๊ธฐ
    for p in range(min_p, max_p + 1):
        if n % p == 0:  # `p`๊ฐ€ `N`์˜ ์ธ์ˆ˜๋ผ๋ฉด
            q = n // p  # `q` ๊ณ„์‚ฐ
            if isprime(q):  # `q`๊ฐ€ ์†Œ์ˆ˜์ธ์ง€ ํ™•์ธ
                return p, q
    return None, None  # ์‹คํŒจ ์‹œ ๋ฐ˜ํ™˜

# ์ฃผ์–ด์ง„ `N` ๊ฐ’
N = 489654925303072532553659432557377999607856370197579144782976005904927235244321459117898721690940319487769632950077647476152880207627385231603017537961906244964117707813500615680799967895028255666319186794462243666159201392490299439947399915406223652423977002396844720487588735149486903743362109592536081726574342051928022071576485169655694281378301551060632699138055044915993078059902577590451519251321215765308977494770310317350866241246677761542212605478044672014913289740381478940929584556588858045439572693806615268502627912952686133840081188641597461343817750411035667135310831687533531094008308185320371643348451

# ์†Œ์ธ์ˆ˜๋ถ„ํ•ด ์‹คํ–‰
p, q = factorize_n(N)

if p and q:
    print(f"p = {p}")
    print(f"q = {q}")
else:
    print("์†Œ์ธ์ˆ˜๋ถ„ํ•ด ์‹คํŒจ")

-> ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด p๊ฐ’์„ ๊ตฌํ•˜๋ ค ํ–ˆ๋Š”๋ฐ, N๊ฐ’์ด ๋„ˆ๋ฌด ์ปค์„œ ์ƒ๊ฐ ์ด์ƒ์œผ๋กœ ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜๊ฑธ๋ฆฐ๋‹ค...3์‹œ๊ฐ„ ์ด์ƒ ์ฝ”๋“œ๋ฅผ ๋Œ๋ ธ์ง€๋งŒ ๊ฐ’์ด ๋‚˜์˜ค์ง€ ์•Š์•„ ๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

 

 

 

 

<์‹œ๋„ 2-write up ์ฐธ๊ณ >

(์ฐธ๊ณ ํ•œ ๋ผ์ดํŠธ์—…: https://johan6337.github.io/posts/write-up-glacierctf-2024/)

N์˜ ๊ฐ’์ด ์ฃผ์–ด์กŒ์œผ๋‹ˆ, p๋ฅผ ์•Œ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ ์•”ํ˜ธ๋ฌธ์„ ๋ณตํ˜ธํ™”ํ•˜๋ฉด flag๊ฐ€ ๋‚˜์˜ฌ๊ฒƒ์ด๋‹ค.์ฐธ๊ณ ํ•œ ๋ผ์ดํŠธ์—…์—์„œ๋Š” sage๋ฅผ ์‚ฌ์šฉํ•ด ๋ฌธ์ œ๋ฅผ ํ’€์ดํ–ˆ๋Š”๋ฐ, ๋‚˜๋Š” ๋‹ค๋ฅธ ํŒŒ์ด์ฌ ๋ชจ๋“ˆ๋กœ sage๋ฅผ ๋Œ€์ฒดํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

SageMath
SageMath ๋˜๋Š” Sage๋Š” ์ปดํ“จํ„ฐ์šฉ ์ˆ˜ํ•™ ์†Œํ”„ํŠธ์›จ์–ด ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์–ด ์žˆ๊ณ , Python ์œ„์—์„œ ๋™์ž‘ํ•˜๋„๋ก ๊ตฌํ˜„๋œ ์†Œํ”„ํŠธ์›จ์–ด์ด๋ฉฐ ์ž์ฒด์ ์ธ ๋ฌธ๋ฒ•์ด Python๊ณผ ์œ ์‚ฌํ•˜์—ฌ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
from sympy import symbols, Eq, solve
from Crypto.Util.number import inverse, long_to_bytes

N = 489654925303072532553659432557377999607856370197579144782976005904927235244321459117898721690940319487769632950077647476152880207627385231603017537961906244964117707813500615680799967895028255666319186794462243666159201392490299439947399915406223652423977002396844720487588735149486903743362109592536081726574342051928022071576485169655694281378301551060632699138055044915993078059902577590451519251321215765308977494770310317350866241246677761542212605478044672014913289740381478940929584556588858045439572693806615268502627912952686133840081188641597461343817750411035667135310831687533531094008308185320371643348451
CT = 58535947031303233853656030097871859886777764034955095086618901763996192727846608049414977429851683454541344096765319691912454768331685486037922533236779909508856486986528041125267338846421238077083738092020495236946742989769815669001100361743526446503248639704900983287986142636083524250650662602975802778548032518674346903013262799229594298599457623347987250272218522320743415393958131916181915804368140008312975210397791293701839101635851486434802271100141743496402698229558250485987421664294229816166263965806962242894230766553316312608696594536239328785792283453559549564751529321240567418095487324718881437825650

# ๋ณ€์ˆ˜ ์ •์˜. sympy ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜ x๋ฅผ ์ •์˜ํ•œ๋‹ค.
x = symbols('x')

# ๋‹คํ•ญ์‹ ์ •์˜. f๊ฐ€ 0์ด ๋˜๋Š” ๊ฐ’์„ ์ฐพ๋Š”๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค. ์ฆ‰ x(=p)๋ฅผ ์ฐพ๋Š” ๋ถ€๋ถ„์ด๋‹ค.
f = x * (2 * x + 1) * (2 * (2 * x + 1) + 1) * (2 * (2 * (2 * x + 1) + 1) + 1) - N

# ๊ทผ ๊ตฌํ•˜๊ธฐ
roots = solve(Eq(f, 0), x) #Eq(f,0)=f๊ฐ€ 0์ธ ๊ฒฝ์šฐ. ์ฆ‰ f๊ฐ€ 0์ด ๋˜๋Š” x๋ฅผ ์ฐพ๋Š”๋‹ค.
p = int(roots[0]) #์ •์ˆ˜๋กœ ํ˜•๋ณ€ํ™˜

phi = (p - 1) * 2 * p * 2 * (2 * p + 1) * 2 * (2 * (2 * p + 1) + 1)

# ๊ณต๊ฐœํ‚ค & ๋น„๋ฐ€ํ‚ค ๊ณ„์‚ฐ
e = 0x10001 #๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง
d = inverse(e, phi) #e์™€ phi๊ฐ’์„ ๊ฐ€์ง€๊ณ  ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.

# ๋ณตํ˜ธํ™”
PT = pow(CT, d, N)
print(long_to_bytes(int(PT)))
gctf{54dly_50ph13_63rm41n_pr1m35_wh3r3_n07_u53d_53curly}

'๐Ÿฆ– Private > CTF Wriet-Up' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Fuzzybytes[Web]  (0) 2024.12.01
Welcom-Pawn [misc]  (1) 2024.11.29
'๐Ÿฆ– Private/CTF Wriet-Up' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Fuzzybytes[Web]
  • Welcom-Pawn [misc]
SONOTREE
SONOTREE
@-@
  • SONOTREE
    SONOTRI
    SONOTREE
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (73)
      • ๐ŸŒฒ Dreamhack (19)
        • System Hacking (2)
        • Web Hacking (4)
        • Reverse Engineering (11)
        • Digital Forensics (2)
      • ๐Ÿฆ– Private (20)
        • C Language (2)
        • Java Language (6)
        • LinuxMaster (1)
        • webhacking.kr (3)
        • bandit (4)
        • CTF Wriet-Up (3)
        • GoN Club Study (1)
      • ๐Ÿ  Public (13)
        • Development (2)
        • web (8)
        • forensic (0)
        • elif (3)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
SONOTREE
Rivest–Shamir–Adleman-Germain[crypto]
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”