Hack The Planet

๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค, cyalume์˜ ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

cryptography/study note

[์ •์ˆ˜๋ก ] ๋– ๋จน์—ฌ์ฃผ๋Š” ์œ ํด๋ฆฌ๋“œ/ํ™•์žฅ ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

cyalume 2024. 8. 11. 03:36

์•ˆ๋…•ํ•˜์„ธ์š”, ์ „๋„์—ฐ์ž…๋‹ˆ๋‹ค.

 

์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํ™•์žฅ ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ฒ˜์Œ ๊ณต๋ถ€ํ•˜๋ฉด ์ดํ•ด๊ฐ€ ์–ด๋ ต๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ๋•Œ์—๋Š” ์ˆ˜ํ•™์  ๊ด€๊ณ„๋ฅผ ์ค‘์ ์ ์œผ๋กœ ์‚ดํŽด๋ณด๋ฉด ์ดํ•ด์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋ณธ๋ฌธ์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃฐ ํ„ฐ์ด๋‹ˆ ์ดํ•ด์— ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

 

1. Euclidean Algorithm


์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•)์€ ๋‘ ์ˆ˜์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ์‚ฌ์‹ค์— ๊ธฐ๋ฐ˜์„ ๋‘ก๋‹ˆ๋‹ค.


1. $gcd(a, b) == gcd(b, r)$ ($r = a\: mod \: b$, $a > b > 0$์ธ ์ •์ˆ˜)
2. $gcd(a, 0) = a$


$gcd(a, b) = gcd(b, a \mod b)$ ์ฆ๋ช…


๊ท€๋ฅ˜๋ฒ•์„ ์‚ฌ์šฉํ•ด 1์˜ ์‹์ด ์ฐธ์ด ๋จ์„ ์ฆ๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

[Proof]
gcd(a, b) == gcd(b, r) (r = a%b, a > b > 0)

g  = gcd(a, b)
g' = gcd(b, r)

1. Assume that g > g' > 0
(1) r  = a - kb (k๋Š” ์ •์ˆ˜)
a, b๋Š” ๋ชจ๋‘ g์˜ ๋ฐฐ์ˆ˜์ด๋ฏ€๋กœ ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๋‚˜ํƒ€๋‚ด๋ฉด
(2) r = g * (a/g) - k * g * (b/g)
(3) r = g ( a/g - k * (b/g) )
๋”ฐ๋ผ์„œ r์€ g์˜ ๋ฐฐ์ˆ˜์ด๋‹ค.
(4) r, b๋Š” ๋ชจ๋‘ g์˜ ๋ฐฐ์ˆ˜์ด๊ณ , gcd(r, b) = g' ์ด๋ฏ€๋กœ g' >= g ์ž„์ด ์„ฑ๋ฆฝ.
(5) ์ด๋Š” ๊ฐ€์ •์— ๋ชจ์ˆœ.

2. Assume that g' > g > 0
(1) a = k*b + r
b, r์€ ๋ชจ๋‘ g'์˜ ๋ฐฐ์ˆ˜์ด๋ฏ€๋กœ ์ด๋ฅผ ์‚ฌ์šฉํ•ด ๋‚˜ํƒ€๋‚ด๋ฉด
(2) a = k * g' * (b/g') + g' * (r/g')
(3) a = g' * (k * (b/g') + (r/g'))
๋”ฐ๋ผ์„œ a๋Š” g'์˜ ๋ฐฐ์ˆ˜์ด๋‹ค.
(4) a, b๋Š” ๋ชจ๋‘ g'์˜ ๋ฐฐ์ˆ˜์ด๊ณ , gcd(a, b) = g ์ด๋ฏ€๋กœ g >= g' ์ž„์ด ์„ฑ๋ฆฝ.
(4) ์ด๋Š” ๊ฐ€์ •์— ๋ชจ์ˆœ.

๋”ฐ๋ผ์„œ g = g' ์ž„์ด ์ฆ๋ช…๋˜์—ˆ๋‹ค.


gcd() ํ•จ์ˆ˜์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๊ฐ€ 0์ด ๋  ๋•Œ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ๋˜๋Š”๋ฐ, ๋‘ ๋ฒˆ์งธ ์ธ์ž๊ฐ€ 0์ผ ๋•Œ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๊ฐ€ ์ฒ˜์Œ ๋‘ ์ˆ˜์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ๋ฅผ ์ข€ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

40๊ณผ 32์˜ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” gcd(40, 32)์˜ ๊ฒฝ์šฐ๋ฅผ ํ†ตํ•ด์„œ์š”.

 

1. gcd(40, 32) ํ˜ธ์ถœ

2. gcd(32, 40%32) == gcd(32, 8) ํ˜ธ์ถœ

3. gcd(8, 32%8) == gcd(8, 0) ํ˜ธ์ถœ. ๋‘ ๋ฒˆ์งธ ์ธ์ž๊ฐ€ 0์ด๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ 8์ด ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ์ดํ•ดํ•˜๋ฉด ์ •๋ง ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„์€ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์žฌ๊ท€ ํ•จ์ˆ˜๋กœ Euclidean Algorithm ๊ตฌํ˜„ํ•˜๊ธฐ


def gcd(a, b):
	if(b == 0):
		return a
	else:
		return gcd(b, a%b)


while ๋ฌธ์œผ๋กœ Euclidean Algorithm ๊ตฌํ˜„ํ•˜๊ธฐ


def gcd(a, b):
	while b != 0:
    		a, b = b, a % b
    return a

 

ํ‹ฐ์Šคํ† ๋ฆฌ indent๊ฐ€ ์ข€ ์ด์ƒํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ ์–‘ํ•ด ๋ฐ”๋ž๋‹ˆ๋‹ค.

 


2. Extended Euclidean Algorithm (xgcd)


ํ™•์žฅ ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒ ์ฃผ ํ•ญ๋“ฑ์‹ $ax+by=gcd(a, b)$ ๋ฅผ ๋งŒ์กฑํ•˜๋Š” $x$, $y$๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

($gcd(a, b) = 1$ , ์ฆ‰ $a$์™€ $b$๊ฐ€ ์„œ๋กœ์†Œ์ธ ๊ฒฝ์šฐ ์ด๋“ค์˜ modulo inverse ๋˜ํ•œ xgcd๋ฅผ ํ†ตํ•ด ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

xgcd๋Š” gcd ๊ณ„์‚ฐ ๊ณผ์ •์„ ๋”ฐ๋ผ๊ฐ€๋ฉด์„œ๋„ ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’๋“ค์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ธฐ๋กํ•จ์œผ๋กœ์จ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„, ์‹์„ ๋งŒ์กฑํ•˜๋Š” $x$, $y$๋Š” ์œ ์ผํ•˜์ง€ ์•Š์ง€๋งŒ ์ด ๊ธ€์—์„œ๋Š” ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ตœ์†Œ ์ •์ˆ˜๋กœ ํ•œ์ •ํ•˜๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

$gcd(a, b) = gcd(b, r) = g$ ๋ผ๋Š” ์‹์„ ํ†ตํ•ด ํ™•์žฅ ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜ ๊ฐ’ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์‚ดํŽด๋ด…์‹œ๋‹ค.

๋จผ์ € $r$์„ $a, b$์— ๋Œ€ํ•ด ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
$r =  a - bq$, ($q = a//b$)

๋”ฐ๋ผ์„œ $gcd(b, r) = b*x_1 + r*y_1$ ์ด๋ผ๋Š” ๋ฒ ์ฃผ ํ•ญ๋“ฑ์‹์€ ์•„๋ž˜์˜ ์‹์œผ๋กœ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
$gcd(b, r) = b * x_1 + (a - bq) * y_1$

๊ทธ ๋‹ค์Œ, $gcd(a, b)$๋ฅผ $x_2$์™€ $y_2$๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋ฒ ์ฃผ ํ•ญ๋“ฑ์‹ ํ˜•ํƒœ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$gcd(a, b) = a * x_2 + b * y_2$

์ด๋•Œ $gcd(a, b) = gcd(b, r)$ ์ด๋ฏ€๋กœ ๋‘ ์‹์„ ๋“ฑํ˜ธ๋กœ ๋ฌถ์–ด ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
$a * x_2 + b * y_2 = b * x_1 + (a - bq) * y_1$
์ ์ ˆํžˆ $a$, $b$๋กœ ๋ฌถ์–ด ์ •๋ฆฌํ•œ ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
$a * x_2 + b*y_2 = a * y_1 + b (x_1-q*y_1)$

๋”ฐ๋ผ์„œ $x_2 = y_1$์ด๊ณ , $y_2 = (x_1 - q * y_1)$์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

xgcd๋Š” gcd์˜ ์žฌ๊ท€ ํ˜ธ์ถœ ํ๋ฆ„์„ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
gcd์˜ ํ˜ธ์ถœ ํ๋ฆ„์ด $gcd(5, 2) -> gcd(2, 1) -> gcd(1, 0)$ ๊ณผ ๊ฐ™์€ ์‹์ด๋ผ๋ฉด, xgcd๊ฐ€ ๋ฒ ์ฃผ ํ•ญ๋“ฑ์‹์„ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’์„ ๊ตฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์‹์€ $gcd(1, 0) -> gcd(2, 1) -> gcd(2, 5)$ ์ด๋Ÿฐ ์ˆœ์„œ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋‹น์—ฐํ•œ ์ด์•ผ๊ธฐ์ง€๋งŒ $gcd(5, 2)$์—์„œ ๋ฐ”๋กœ $x$, $y$ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉด ์ด ๊ณ ์ƒ์„ ํ•˜์ง€ ์•Š์•˜์„ ๊ฒ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ๊ธˆ ์˜ˆ์‹œ๋ฅผ ๋“  $gcd(a, b) = gcd(b, r)$์˜ ๊ฒฝ์šฐ๋ฅผ ๋”ฐ์ ธ๋ณด์ž๋ฉด, $gcd(b, r)$๋กœ๋ถ€ํ„ฐ $x_1$, $y_1$์„ ๋จผ์ € ๊ตฌํ•ด๋‚ธ ๋’ค $gcd(a, b)$์—์„œ $x_2$, $y_2$๋ฅผ ๊ตฌํ•ด๋‚ด๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ์ด์ „ ๋‹จ๊ณ„ ($gcd(b, r)$)์—์„œ ๊ตฌํ•œ $y$ ๊ฐ’์€ ๋‹ค์Œ ๋‹จ๊ณ„ ($gcd(a, b)$)์˜ $x$ ๊ฐ’์œผ๋กœ ์“ฐ์ด๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์—ฐ์‡„์  ํŠน์„ฑ์„ ์ด์šฉํ•ด gcd์˜ ํ๋ฆ„์„ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉฐ ์ตœ์ข…์ ์ธ $x$, $y$ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด xgcd ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

๊ณ„์‚ฐ ๊ณผ์ •์„ ์˜ˆ๋กœ ๋“ค์–ด ์‚ดํŽด๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๋”์šฑ ์‰ฌ์šธ ๊ฒ๋‹ˆ๋‹ค.

 

Example. $xgcd(5, 17)$


$xgcd(5, 17)$๋กœ $5x + 17y = gcd(5, 17) = 1$์˜ ์‹์„ ๋งŒ์กฑํ•˜๋Š” $x$, $y$ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ด…์‹œ๋‹ค.
$gcd(5, 17)$์„ ์žฌ๊ท€์ ์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค๋ฉด ํ˜ธ์ถœ ํ๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$gcd(5, 17)$ -> $gcd(17, 5)$ -> $gcd(5, 2)$ -> $gcd(2, 1)$ -> $gcd(1, 0)$ -> yield $1$

$gcd(1, 0)$๋ถ€ํ„ฐ ํ๋ฆ„์„ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ $gcd(a, b) = ax + by$ ํ˜•์‹์˜ ๋ฒ ์ฃผ ํ•ญ๋“ฑ์‹์„ ์ž‘์„ฑํ•ด๋ด…์‹œ๋‹ค.

$gcd(1, 0) = 1 = 1*x_1 + 0*y_1$
์ด๋•Œ $x_1$๋Š” 1์ด์–ด์•ผ ํ•˜๊ณ , $y_1$์€ ์•„๋ฌด ๊ฐ’์ด๋‚˜ ๋“ค์–ด์™€๋„ ๋งŒ์กฑํ•˜์ง€๋งŒ ์Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ตœ์†Œ ์ •์ˆ˜๋ฅผ ๊ตฌํ•  ๊ฒƒ์ด๋ฏ€๋กœ $y_1$์€ 0์ž…๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ, $1 = 1 * 1 + 0 * 0$ ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฒ ์ฃผ ํ•ญ๋“ฑ์‹์ž…๋‹ˆ๋‹ค.

$gcd(2, 1) = 1 = 2*x_2 + 1*y_2$
์ด๋•Œ $x_2$๋Š” ์ด์ „ ๊ณ„์‚ฐ์—์„œ ๊ตฌํ•œ $y_1$์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ $x_2 = 0$์ด๊ณ , $y_2 = 1$์ž…๋‹ˆ๋‹ค.

$gcd(5, 2) = 1 = 5*x_3 + 2*y_3$
$x_3 = 1$์ด๋ฏ€๋กœ $y_3 = (1 - 5*x_3)/2 = (1-5*y_2)/2 = -2$ ์ž…๋‹ˆ๋‹ค.

$gcd(17, 5) = 1 = 17*x_4 + 5*y_4$
$x_4 = -2$์ด๋ฏ€๋กœ $y_4$ ์—ญ์‹œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. $y_4 = (1 - 17*x_4)/5 = (1 - 17*y_3)/5 = 7$

$gcd(5, 17) = 1 = 5*x_5 + 17*y_5$
$x_5 = y_4$, $y_5 = -2$ ์ž…๋‹ˆ๋‹ค.

์ด๋กœ์จ $xgcd(5, 17)$์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$1 = 5*7 + 17*(-2)$

 

์žฌ๊ท€ ํ•จ์ˆ˜๋กœ Extended Euclidean Algorithm ๊ตฌํ˜„ํ•˜๊ธฐ


xgcd()๋ฅผ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

def xgcd(a, b):
	if(b == 0):
		# ์ตœ์ข… ๋‹จ๊ณ„ gcd(a, 0) = a*1 + 0*0 ์ด๋ฏ€๋กœ.
		return (a, 1, 0)
	else:
		g, x1, y1 = xgcd(b, a%b)  
		# ์ด์ „ ๋‹จ๊ณ„์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ g(์ตœ๋Œ€๊ณต์•ฝ์ˆ˜), x1 (์ด์ „ ๋‹จ๊ณ„์˜ x๊ฐ’), y1(" y๊ฐ’) ์— ์ €์žฅ
		x, y = y1, (g - a * y1)//b
		# ์ด์ „ ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ด๋ฒˆ ๋‹จ๊ณ„์˜ x, y ๊ฐ’์„ ๊ตฌ์„ฑํ•œ ๋’ค ๋ฐ˜ํ™˜
		return (g, x, y)


์ƒ๊ฐ๋ณด๋‹ค ์ •๋ง ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‚˜์š”

๊ทธ๋Ÿผ ๊ฑด์Šน์„ ๋น•๋‹ˆ๋‹ค