샤미르 비밀 분산 계산기
비밀 하나를 n개 조각으로 나누고 그중 k개가 모여야 복원되게 합니다. 소수 체 위의 다항식과 라그랑주 보간으로 어떻게 되는지 보이고, 조각이 하나 모자랄 때 어떤 비밀이든 똑같이 그럴듯하다는 것을 표로 확인할 수 있습니다.
아래 소수보다 작은 0 이상의 정수여야 합니다.
이 소수로 나눈 나머지 세계에서 계산합니다. 비밀보다 커야 합니다.
이만큼 모여야 풀립니다.
조각 5개 가운데 3개면 풀립니다
차수 2 다항식
상수항이 비밀이고 나머지 2개 계수는 난수입니다. 차수 2인 다항식은 점 3개로 정확히 하나 정해지고, 2개로는 무수히 많습니다.
다항식
f(x) = 12345 + 15723·x + 39805·x^2 (mod 65537)
맨 앞의 상수항 12345이 비밀입니다. 실제로 조각을 나눠 줄 때는 이 다항식을 공개하지 않습니다 — 여기서는 무엇이 일어나는지 보이려고 적었습니다.
나눠 줄 조각
| 번호 x | 값 f(x) |
|---|---|
| 1 | 2336 |
| 2 | 6400 |
| 3 | 24537 |
| 4 | 56747 |
| 5 | 37493 |
3개를 모으면
어느 조합을 골라도 같은 값이 나옵니다. 라그랑주 보간으로 f(0)을 읽은 것입니다.
2개만 모으면
답이 조합마다 다르고 어느 것도 비밀이 아닙니다. 조각이 모자라면 답이 틀리는 것이 아니라 아무 값이나 됩니다.
왜 「아무것도 새지 않는다」인가
| 비밀이 이 값이라면 | 조각 5은 이 값이어야 |
|---|---|
| 12345 (진짜) | 37493 |
| 1 | 28966 |
| 8 | 29008 |
| 15 | 29050 |
| 22 | 29092 |
| 29 | 29134 |
| 36 | 29176 |
| 43 | 29218 |
조각 2개(1번부터)를 쥔 사람이 보는 세상입니다. 비밀 후보를 아무거나 잡아도 그 후보를 설명하는 다항식이 정확히 하나 있고, 그때 남은 조각이 얼마여야 하는지가 오른쪽 값입니다. 후보를 바꾸면 답도 하나씩 어긋나 체 전체를 훑습니다 — 어떤 후보도 배제되지 않으므로 조각을 하나도 못 가진 사람과 똑같은 처지입니다.
사용 방법
- 1나눌 비밀을 정수로 넣습니다. 아래 소수보다 작아야 합니다.
- 2소수 p를 고릅니다. 이 소수로 나눈 나머지 세계에서 계산합니다.
- 3조각 수 n과 임계값 k를 정합니다.
- 4「k개를 모으면」에서 어느 조합이든 같은 답이 나오는 것을 확인합니다.
- 5「왜 아무것도 새지 않는가」 표에서 비밀 후보마다 남은 조각이 얼마여야 하는지 봅니다.
자주 묻는 질문
차수가 k−1인 다항식은 점 k개로 정확히 하나 정해진다는 성질을 씁니다. 비밀을 상수항에 두고 나머지 계수를 아무렇게나 뽑아 다항식을 만든 뒤, (1, f(1)), (2, f(2)) …를 조각으로 나눠 줍니다. k개가 모이면 라그랑주 보간으로 다항식을 되살려 f(0)을 읽으면 그것이 비밀입니다.
아무것도 알 수 없습니다. 절반쯤 풀리거나 후보가 좁혀지는 것이 아닙니다. 비밀 후보를 아무거나 잡아도 그 후보를 설명하는 다항식이 정확히 하나 있으므로 모든 후보가 똑같이 그럴듯합니다. 조각을 하나도 못 가진 사람과 정확히 같은 처지입니다.
계산이 어려워서 못 푸는 것이 아니라 정보가 아예 없어서 못 푼다는 뜻입니다. RSA는 큰 수를 소인수분해하기 어렵다는 가정 위에 서 있어서 계산력이 충분히 늘면 뚫리지만, 샤미르 비밀 분산은 k−1개로는 어떤 계산으로도 비밀을 좁힐 수 없습니다. 대신 k개가 모이는 순간 완전히 풀리므로 「절반쯤 아는」 상태가 없습니다.
실수로 보간하면 두 가지가 무너지기 때문입니다. 첫째로 부동소수점 오차 때문에 답이 정확히 떨어지지 않고, 둘째로 더 나쁘게는 정보가 샙니다 — 실수 위에서는 조각 몇 개만 봐도 다항식이 대충 어느 근방인지 알 수 있어 비밀의 범위가 좁혀집니다. 나머지만 다루면 값이 0부터 p−1까지 고르게 흩어져 그런 실마리가 남지 않습니다.
비밀보다 커야 합니다. 작으면 비밀이 소수로 나눈 나머지로 접혀 원래 값을 잃습니다. 한 바이트를 나눌 때는 257, 두 바이트면 65537을 흔히 쓰고, 실제 구현은 훨씬 큰 소수나 GF(2^8) 같은 이진 체를 씁니다. 조각의 크기가 비밀과 비슷해지므로 소수를 필요 이상으로 크게 잡을 이유는 없습니다.
쓰지 마십시오. 이 계산기는 난수를 씨앗값으로 뽑아 같은 결과를 다시 낼 수 있게 해 두었는데, 계산기로서는 필요하지만 암호로서는 치명적입니다 — 씨앗을 아는 사람은 조각 하나만으로 전부 풀 수 있습니다. 무엇이 일어나는지 눈으로 보려는 데모이며, 실제로는 검증된 구현을 쓰십시오.
전송되지 않습니다. 모든 계산은 브라우저 안에서 이뤄지고, 입력값은 이 기기에만 남습니다.
알아두면 좋은 점
- 검증은 여러 (k, n) 조합에서 n개 조각 가운데 k개를 고르는 모든 방법으로 복원해 항상 같은 비밀이 나오는지 대조해 했습니다. 2⁶¹−1 같은 큰 소수에서도 맞는 것을 확인했으며, 계산은 전부 BigInt로 합니다.
- 「k−1개로는 아무것도 새지 않는다」를 말로만 두지 않고 실제로 셌습니다. 작은 소수(11·13·17·19)에서 조각 k−1개를 고정한 뒤 비밀 후보를 체의 모든 값으로 두면, 남은 조각이 가져야 할 값이 서로 다른 p가지가 되어 체 전체를 정확히 한 번씩 훑습니다. 어떤 후보도 배제되지 않는다는 뜻입니다.
- 진짜 비밀에 해당하는 줄의 값이 실제 조각 값과 맞는지도 함께 확인했습니다.
- 조각이 k−1개면 복원 결과가 조합마다 달라지고 어느 것도 비밀이 아닙니다. 이때 값을 던지지 않고 그대로 보이는 것은, 「답이 틀린다」가 아니라 「아무 값이나 된다」는 것이 이 자료구조의 요점이기 때문입니다.
- 비밀이 소수 이상이거나 임계값이 조각 수를 넘으면 계산하지 않습니다.
- 데모용입니다. 난수를 씨앗값으로 뽑으므로 씨앗을 아는 사람은 조각 하나로 전부 풀 수 있습니다. 실제 키 관리에 쓰지 마십시오.
함께 보면 좋은 도구
마지막 검증: 2026년 9월 1일 · 결과는 참고용 추정치입니다.