도구스개발

몽고메리 곱셈 계산기

나눗셈 없이 모듈러 곱셈을 하는 몽고메리 방식의 중간값을 단계별로 보여 줍니다. n′과 R²를 어떻게 미리 구하는지, T + m·n이 왜 R로 나누어떨어지는지, 마지막 조건부 뺄셈이 왜 필요한지를 함께 확인할 수 있습니다.

홀수여야 합니다. 짝수면 R = 2ᵏ와 서로소가 아닙니다.

2ᵏ가 n보다 커야 하므로 7 이상이어야 합니다. R = 2^7

a·b mod n

35

곧이곧대로 계산한 값 35과 같습니다. REDC를 세 번(들어가기 2번, 곱하기 1번) 쓰고 나오면서 한 번 더 썼습니다.

미리 구해 두는 값

R = 2^k128
n′ = −n⁻¹ mod R95
R² mod n88
R⁻¹ mod n72

이 셋은 모듈러스가 정해지면 한 번만 구해 두고 계속 씁니다. 그래서 준비 비용이 곱셈마다 드는 것이 아닙니다.

단계별 중간값

단계Tm = T·n′ mod R(T + m·n) ÷ R결과
ā 만들기440725858
b̄ 만들기616242323
ā·b̄ 줄이기1,334101818
나오기18463535

(−n) 표시가 붙은 줄은 몫이 n 이상이라 마지막에 한 번 뺀 것입니다. 어느 줄에서도 나눗셈은 R = 2^7로만 했고, 그것은 7비트 시프트 한 번입니다.

몽고메리 영역

a5
ā = a·R mod n58
b7
b̄ = b·R mod n23
REDC(ā·b̄) = (a·b)·R mod n18
REDC로 나온 값35
곧이곧대로 (a·b) mod n35

a^e mod n. 지수가 클수록 진입·이탈 비용이 묻혀 몽고메리가 이깁니다.

a^e mod n14
곧이곧대로 구한 값14
몽고메리 곱셈 횟수18번
진입·이탈에 쓴 REDC3번 (a, 1, 결과)

곱셈 18번에 준비 비용이 3번뿐입니다. 한 번 곱하려고 쓰면 3번을 위해 3번을 더 쓰는 셈이라 손해지만, 이만큼 되풀이하면 비용이 묻힙니다.

나눗셈이 시프트로 바뀌는 것이 전부입니다. REDC(T) = (T + (T·n′ mod R)·n) ÷ R에서 나누는 것은 언제나 R = 2ᵏ뿐이고, 2의 거듭제곱으로 나누는 것은 시프트라 사실상 공짜입니다. 하드웨어에서 나눗셈이 곱셈보다 열 배 넘게 느린 것을 피하려는 것입니다.
T + m·n이 R로 나누어떨어지는 이유는 한 줄입니다. m = T·n′ mod R이고 n′ = −n⁻¹ mod R이므로 T + m·n ≡ T + T·n′·n ≡ T − T ≡ 0 (mod R)입니다. n′을 그렇게 되도록 고른 것이며, n이 홀수여야 하는 이유도 여기 있습니다 — 짝수면 R과 서로소가 아니라 n⁻¹이 없습니다.
한 번 곱하려고 쓰면 손해입니다. 값을 몽고메리 표현으로 바꿔 넣고 되돌리는 비용이 있어 곱셈 한 번에 REDC를 네 번이나 쓰게 됩니다. 거듭제곱처럼 같은 모듈로 수백·수천 번 곱할 때라야 진입·이탈이 묻히고 이깁니다 — RSA가 딱 그 경우입니다.
마지막 조건부 뺄셈이 부채널의 빌미가 됩니다. 몫이 n보다 작다는 보장이 없고 2n보다 작다는 것까지만 보장되어 한 번 빼야 하는데, «뺐는가 안 뺐는가»가 실행시간으로 새어 나갑니다. 실제 암호 구현은 늘 빼되 결과를 상수시간으로 고르는 식으로 처리합니다.

사용 방법

  1. 1모듈러스 n을 넣습니다. 홀수여야 합니다 — 짝수면 R = 2ᵏ와 서로소가 아닙니다.
  2. 2R의 비트 수 k를 고릅니다. 2ᵏ가 n보다 커야 합니다.
  3. 3곱할 두 수 a와 b를 넣습니다.
  4. 4몽고메리 영역에 들어가고, 곱하고, 나오는 세 단계의 중간값이 모두 나옵니다.
  5. 5곧이곧대로 계산한 (a·b) mod n과 같은지 확인합니다.

자주 묻는 질문

하드웨어에서 나눗셈이 곱셈보다 열 배 넘게 느리기 때문입니다. RSA 하나를 계산하려면 모듈러 곱셈을 수천 번 되풀이해야 하는데, 그때마다 나눗셈을 하면 그 비용이 전부를 좌우합니다. 몽고메리 방식은 나눗셈을 2ᵏ로만 하도록 바꾸는데, 2의 거듭제곱으로 나누는 것은 시프트라 사실상 공짜입니다.

n′을 그렇게 되도록 골랐기 때문입니다. m = T·n′ mod R이고 n′ = −n⁻¹ mod R이므로 T + m·n ≡ T + T·n′·n ≡ T − T ≡ 0 (mod R)입니다. 한 줄이면 끝나는 이야기인데, 이 한 줄이 나눗셈을 시프트로 바꿉니다.

(T + m·n)/R이 n보다 작다는 보장이 없고 2n보다 작다는 것까지만 보장되기 때문입니다. 그래서 n 이상이면 한 번 빼면 됩니다. 다만 이 분기가 «뺐는가 안 뺐는가»를 실행시간으로 흘려 부채널 공격의 빌미가 되기도 해서, 실제 암호 구현은 늘 빼되 결과를 상수시간으로 고르는 식으로 처리합니다.

아닙니다. 오히려 손해입니다. 값을 몽고메리 표현 ā = a·R mod n으로 바꿔 넣고 나중에 되돌리는 비용이 있어서, 곱셈 한 번을 위해 REDC를 세 번이나 하게 됩니다. 거듭제곱처럼 같은 모듈로 수백·수천 번 곱할 때라야 진입·이탈 비용이 묻히고 이깁니다 — RSA가 딱 그 경우입니다.

R = 2ᵏ와 서로소여야 n⁻¹ mod R이 존재하기 때문입니다. n이 짝수면 n과 R이 2를 공약수로 가져 역원이 없고, n′을 만들 수 없으므로 방법 자체가 성립하지 않습니다. 암호에서 쓰는 모듈러스는 큰 소수이거나 소수의 곱이라 언제나 홀수여서 실제로는 걸림돌이 되지 않습니다.

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

알아두면 좋은 점

  • BigInt로 계산하므로 64비트를 넘는 수도 정확합니다. R은 512비트까지 다룹니다.
  • 설명을 위한 계산기입니다. 실제 암호 구현은 워드 단위로 쪼갠 CIOS 같은 방식을 쓰고, 조건부 뺄셈도 상수시간으로 처리합니다.
  • REDC는 넣는 값 T가 n·R보다 작을 때만 결과가 n 미만임이 보장됩니다. 그보다 크면 합동이기는 해도 줄어들지 않습니다.
  • 무작위 곱셈 5000건에서 곧이곧대로 계산한 (a·b) mod n과 대조했고, T + m·n이 R로 나누어떨어지는 것도 3000건에서 확인했습니다.

함께 보면 좋은 도구

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