도구스개발

RSA 키 생성·암복호 시연기

작은 소수 두 개로 n·φ(n)·공개키·개인키를 구하고 숫자 하나를 실제로 암호화·복호화해 봅니다. 서명과 검증, 그리고 작은 키가 얼마나 쉽게 인수분해되는지도 함께 보여 줍니다.

교육용입니다. 실제 보안에 쓰지 마세요. 여기서 다루는 소수는 너무 작아 몇 밀리초 만에 인수분해됩니다. 실제 RSA는 2,048비트(십진수 617자리) 이상을 쓰고 OAEP 패딩을 함께 씁니다.

0으로 두면 φ(n)과 서로소인 값을 자동으로 고릅니다. 실제로는 65537을 많이 씁니다.

n보다 작아야 합니다. 크면 n으로 나눈 나머지로 다룹니다.

공개키 (n, e) / 개인키 (n, d)

(3,233, 17) / (3,233, 2,753)

12비트 키 · φ(n) = 3,120

n = p × q61 × 53 = 3,233
φ(n) = (p−1)(q−1)60 × 52 = 3,120
공개 지수 e17 (φ와 서로소)
개인 지수 d — e·d ≡ 1 (mod φ)2,753
확인: e × d mod φ1
암호화 c = m^e mod n65 → 2,790
복호화 m = c^d mod n2,790 → 65
원래 값으로 돌아왔는가
서명 s = m^d mod n588
검증 s^e mod n65
왜 되돌아오는지는 오일러 정리에 있습니다. e·d = 1 + kφ(n)이므로 c^d = (m^e)^d = m^(1+kφ(n)) = m · (m^φ(n))^k이고, m^φ(n) ≡ 1 (mod n)이라 m만 남습니다. m이 p나 q의 배수여서 n과 서로소가 아닐 때도 중국인의 나머지 정리로 같은 결론이 나오므로, 0 이상 n 미만인 모든 m이 되돌아옵니다.
서명은 순서를 뒤집은 것뿐입니다. 암호화는 공개키로 잠그고 개인키로 열지만, 서명은 개인키로 만들고 공개키로 확인합니다. 식은 똑같이 «거듭제곱해서 나머지»이고 쓰는 지수만 반대입니다. 지금 m = 65에 대한 서명이 588이고, 공개키로 다시 올리면 65로 돌아와 «이 사람이 만든 것»임이 확인됩니다.
지금 n = 3,23352번만 나눠 봐도 갈라집니다. √n까지 차례로 나눠 보기만 하면 p와 q가 그대로 나오고, p·q를 알면 φ(n)이 나오고, φ를 알면 d가 나옵니다. RSA의 안전은 오직 «큰 수를 인수분해하기 어렵다»에 기대고 있습니다. 이 키는 12비트인데 실제로 쓰이는 것은 2,048비트 이상입니다 — 비트가 하나 늘 때마다 후보가 두 배가 되므로 그 차이는 상상하기 어려울 만큼 큽니다.
e는 아무 수나 되지 않습니다. φ(n)과 서로소여야 d가 존재하기 때문입니다. 지금 φ(n) = 3,120이고 e = 17의 최대공약수가 1이라 d를 구할 수 있습니다. 실제 RSA가 e로 65537을 즐겨 쓰는 이유는 2¹⁶+1이라 이진수로 1이 두 개뿐이어서 거듭제곱이 빠르면서도, 3처럼 작지 않아 짧은 메시지가 그대로 드러나는 문제를 피할 수 있기 때문입니다.
패딩이 없어 이대로는 위험합니다. 같은 평문이 언제나 같은 암호문이 되어 «같은 답을 보냈다»는 것이 드러나고, m이 작으면 m^e가 n을 넘지 않아 그냥 e제곱근을 구하는 것만으로 풀립니다. 실제로는 OAEP 패딩으로 무작위성을 섞고, 긴 메시지는 RSA로 직접 암호화하지 않고 대칭키를 RSA로 감싸는 방식을 씁니다.

사용 방법

  1. 1소수 두 개(p, q)를 고릅니다. 예시 조합을 눌러도 됩니다.
  2. 2공개 지수 e를 넣거나 0으로 두어 자동으로 고릅니다.
  3. 3n·φ(n)·개인 지수 d가 어떻게 나오는지 확인합니다.
  4. 4숫자 하나를 넣어 암호화·복호화·서명·검증이 실제로 맞아떨어지는지 봅니다.

자주 묻는 질문

소수 두 개 p·q를 곱해 n을 만들고, φ(n) = (p−1)(q−1)을 구한 뒤 φ와 서로소인 e를 고르고, e·d ≡ 1 (mod φ(n))인 d를 확장 유클리드로 구합니다. 공개키는 (n, e), 개인키는 (n, d)입니다. p = 61, q = 53, e = 17이면 n = 3233, φ = 3120, d = 2753이 됩니다.

오일러 정리 때문입니다. e·d = 1 + kφ(n)이므로 c^d = (m^e)^d = m·(m^φ(n))^k이고, m^φ(n) ≡ 1 (mod n)이라 m만 남습니다. m이 p나 q의 배수여서 n과 서로소가 아닐 때도 중국인의 나머지 정리로 같은 결론이 나와, 0 이상 n 미만인 모든 m이 되돌아옵니다.

2¹⁶+1이라 이진수로 1이 두 개뿐이어서 거듭제곱이 빠르기 때문입니다. 동시에 3처럼 작지 않아, 짧은 메시지의 m^e가 n을 넘지 않아 그대로 e제곱근으로 풀리는 문제를 피할 수 있습니다. 물론 φ(n)과 서로소여야 한다는 조건이 먼저입니다.

쓰는 열쇠의 순서만 반대입니다. 암호화는 공개키로 잠그고 개인키로 열지만, 서명은 개인키로 만들고(s = m^d mod n) 공개키로 확인합니다(m = s^e mod n). 개인키를 가진 사람만 만들 수 있고 누구나 확인할 수 있다는 점이 «서명»이라는 이름의 이유입니다.

절대 안 됩니다. 여기 다루는 소수는 너무 작아 √n까지 나눠 보는 것만으로 몇 밀리초 만에 인수분해되고, p와 q를 알면 개인키가 바로 나옵니다. 패딩도 없어 같은 평문이 언제나 같은 암호문이 됩니다. 실제 RSA는 2048비트 이상에 OAEP 패딩을 함께 씁니다.

전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.

알아두면 좋은 점

  • 교육용 시연입니다. 여기서 만든 키를 실제 통신이나 저장에 쓰면 안 됩니다.
  • 거듭제곱은 BigInt로 계산합니다. 배정밀도 실수로는 곱셈 도중 2⁵³을 넘어 값이 어긋납니다.
  • 소수는 100,000 이하만 받습니다. 그보다 크면 인수분해 시연이 느려지고, 어차피 이 크기에서는 «쉽게 깨진다»는 요점이 그대로입니다.
  • p와 q가 같으면 φ(n) = p(p−1)로 식이 달라지므로 거절합니다. 실제 RSA에서도 두 소수는 충분히 떨어져 있어야 합니다 — 가까우면 페르마 인수분해로 쉽게 갈라집니다.
  • 실제 구현은 φ(n) 대신 카마이클 함수 λ(n) = lcm(p−1, q−1)을 써서 더 작은 d를 얻기도 합니다. 어느 쪽으로 구해도 복호는 똑같이 됩니다.

함께 보면 좋은 도구

마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.