창과 방패의 대
구글이 12월 초 양자컴퓨터인 WIllow를 공개하면서 정말 양자컴퓨터가 비트코인을 꺨 수 있을 것인지에 대해 여러 이야기들이 나오는 것 같습니다. 이에 대해 제가 아는 범위 내에서 한 번 이야기를 드리고자 합니다.
기본적으로 비트코인의 암호화는 ECDSA라는 타원곡선 기반의 암호 (Elliptic Curve Cryptography, ECC) 체계로 구성되어 있습니다. 타원곡선은 다음과 같은 관계식을 갖는 실수 x와 y가 만들어내는 곡선입니다.
y^2 = x^3 + ax + b
이 방정식의 모양을 잘 살펴보면 y에 자승이 있으므로, +y 대신 -y를 대입해도 방정식에는 변함이 없습니다. 따라서 타원곡선은 x축 대칭입니다. 암호 체계에 사용하기 위해서는 타원곡선에 뾰족한 부분이나 교차하는 지점 같은 특이점이 없어야 합니다. 이러한 조건을 만족시키기 위한 조건은 4a^3 + 27b^2 ≠ 0입니다. 이러한 타원곡선이 갖는 고유한 특징은 타원곡선 위에서 일종의 '연산'이 가능하다는 것입니다. 예를 들어 타원곡선 위에 있는 임의의 두 점 P와 Q를 직선으로 이었을 때, 그 직선이 타원곡선의 다른 지점에서 만나서 생기는 점 -R을 생각해 봅시다. -R점을 x축 대칭한 점을 최종적으로 R로 표시합시다. 왜 처음에 두 점을 이어 타원곡선과 만나는 새로운 점을 R이 아니라 -R이라고 표시한 것일까요? 그리고 그것을 왜 또 x축 대칭을 한 것일까요? 이는 타원곡선 위에서 일종의 새로운 ‘연산’ 체계를 정의하기 위해서 필요한 과정이기 때문입니다. 위에서 점 P와 Q를 이어서 R까지 만들어내는 연산 ‘*’을 다음과 같이 표시해봅시다.
R = P*Q
이것은 타원곡선 위에서 연산 대상 P와 Q가 만나서 R를 만드는 과정을 정의합니다.
그렇다면 왜 굳이 타원곡선 같이 제한된 공간에서 이러한 '연산'이라는 것을 정의하려고 하는 것일까요? 사실 이 연산의 목적은 정보를 적절하게 감추려는데 있습니다. 정보를 감추고 싶으면 암호화된 정보를 역추적하여 원래의 정보를 알아보기 어렵게 만들어야 할 것입니다. 다시 말해, 어떤 연산을 통해 창출되는 값 (즉, 암호)들을 다시 역연산하여 쉽게 알아낼 수 없게 만드는 것입니다. 타원곡선 위의 연산은 이러한 역연산이 매우 어려워진다는 특징이 있습니다.
어떤 연산이든, 일단 연산을 정의하기 위해서는 간단한 법칙 성립 여부를 확인해야 합니다. 교환법칙부터 봅시다. P*Q와 Q*P는 같은 결과를 만들까요? P와 Q의 순서가 바뀌어도 그 결과 (즉, 직선이 타원곡선과 만나 생기는 새로운 점)에는 변함이 없을 것이므로, 연산 ‘*'는 당연히 교환법칙이 성립합니다. 연산을 반복하는 경우는 어떨까요? 예를 들어 P*Q의 결과물인 R에 다시, T를 연산한 결과를 생각해봅시다. 이는 (P*Q)*T라고 쓸 수 있을 것입니다. 결합법칙 성립 여부를 알아보려면 이제 이 연산의 결과물과 P*(Q*T)의 결과물을 비교해 보면 될 것입니다. 타원곡선 위에서 그림을 그려 보면 두 결과가 같다는 것은 쉽게 알 수 있습니다. 즉, (P*Q)*T =P*(Q*T)가 성립하므로 연산 ‘*’는 결합법칙도 만족합니다. 그러면 역원이나 항등원도 존재할까요? 예를 들어 타원곡선 위의 점을 하나는 P로, 다른 하나는 P의 x축 대칭인 -P로 잡는 경우를 생각해 봅시다. 그러면 (P*-P)의 과정에서는 x축에 수직인 직선이 나올 것이다. 그런데 이 수직선은 타원곡선의 다른 부분과 절대 만나지 못 합니다. (왜냐하면 타원곡선은 애초에 x축 대칭이기 때문이죠.) 따라서 이 특징을 이용하여 타원곡선 위에서의 연산에 대해, 항등원은 O라고 표기하고, 연산 ‘*’에 대한 P의 역원은 -P라고 정의하면 될 것입니다. 즉, P*-P =O, P*O = P라고 쓸 수 있습니다. 이 연산이 갖는 흥미로운 특징이 하나 더 있습니다. 타원곡선에서도 특정 지점에서의 접선을 생각할 수 있습니다. 접선은 결국 점 한 개를 연산기에 겹쳐 입력하여 만들어지는 직선이라고 볼 수 있습니다. 따라서 타원곡선 위의 임의의 접점 위에서의 연산은 (P*P) = 2P라고 정의할 수 있을 것이다. 타원곡선 위에서의 연산은 그 타원곡선에 '닫혀 있습니다’고 말할 수 있습니다. 이는 쉬운 말로 표현하면 연산의 결과로 만들어지는 점 R은 반드시 타원곡선 위에 존재한다는 것입니다. 이는 점 P와 Q를 잇는 직선은 무조건 타원곡선과 만나게 되어 있다는 것을 의미하는 것입니다 (물론 Q가 -P인 경우는 제외). 타원곡선이 아니더라도 일반적인 곡선이면 다 그런 특징이 있는 것 아닌가?라며 별로 이 특징을 대단하게 생각하지 않을 수도 있을지 모릅니다. 그러나 모든 곡선이 이러한 조건을 만족하는 것은 아닙니다. 예를 들어 2차함수 같은 곡선을 생각해 봅시다. 이 곡선의 임의의 점에서 만든 접선은 이 곡선과 절대 만나지 않습니다.
이러한 흥미로운 타원곡선의 특징을 암호화에 어떻게 이용할 수 있는지 알아보겠습니다. 일단 점P, Q, R의 좌표를 각각 (x1,y1), (x2,y2), (x3,y3)라고 합시다. 이제 간단한 계산을 해 보면, 타원곡선 위에서의 연산 관계에 있는 이 좌표들은 다음과 같은 관계식을 따르는 것을 알 수 있다.
1) P ≠ Q인 경우: λ = (y2 - y1)/(x2 - x1), x3 = λ^2 - x1 - x2, y3 = λ(x1 - x3) - y1
2) P = Q인 경우 (즉, 접점): λ = (3x1^2 + a)/(2y1), x3 = λ^2 - 2x1, y3 = λ(x1 - x3) - y1
출발점 P (이를 generator라고도 부릅니다.)가 주어져 있고, 최종 도착점 R이 주어져 있다고 가정해 봅시다. 그리고 타원곡선 파라미터 a와 b도 주어져 있다고 가정해 봅시다. 그렇다면 nP = P*P*...*P (n번 연산 반복) = R 이라고 쓸 수 있습니다. P와 R의 좌표를 알고 있는 것만으로 이 연산이 몇 번 반복되었는지 역으로 추측할 수 있을까요? 즉, n을 쉽게 발견할 수 있을까요? 만약 이 연산이 수십, 수백 번 수준이 아니라, 수 억, 수천 조 번 반복된 결과라면 어떨까요? 아니면 이보다 상상할 수 없을 정도로 엄청나게 더 큰 숫자만큼 반복되었다면 어떨까요? 시작점 P가 주어져 있을 때 연산을 하려는 측에서는 이 연산의 반복 횟수가 얼마나 크든지, 사실 유한한 시간 만에 '간단하게' R을 찾을 수 있습니다. 예를 들어 227번 연산을 반복하는 경우를 생각해 봅시다. 원래대로라면 말그대로 타원곡선 위에서 227번 연산을 반복해야 P에서 R로 갈 수 있을 것입니다. 그런데 이 연산을 굳이 227번씩 단순 반복하지 않고 훨씬 짧게 단축할 수 있는 트릭이 있습니다. 예를 들어 P를 접점 삼아 타원 곡선 위에서 연산하면 2P를 얻고, 다시 2P를 접점 삼아 연산하면 4P = (2^2)P를 얻습니다. 이렇게 접점 위에서의 연산을 n번 반복하면 (2^n)P를 얻을 수 있습니다. P에서 (2^n)P라는 지점으로 가기 위해서는 (2^n)번의 연산을 반복하지 않고도 단지 n번만 연산을 반복하면 되는 것입니다. 따라서 227번의 연산 횟수도 227보다 훨씬 작게 만들 수 있습니다. 예를 들어 227을 이진수로 나타내면 11100011 입니다. 즉 227 = 2^7 + 2^6 + 2^5 + 2^1 + 2^0 이죠. 이것은 다시 말해 227번 연산을 하는 것은 단지 (2^7)P으로 가기 위한 연산 7번, (2^6)P으로 가기 위한 연산 6번, (2^5)P으로 가기 위한 연산 5번, (2^1)P으로 가기 위한 연산 1번 등으로 구성될 수 있다는 것입니다. 그러면 최대 19번 정도로 연산 횟수가 줄어들 것입니다. 그런데 사실 실제로는 이 연산을 다 할 필요도 없습니다. 왜냐하면 (2^1)P, (2^5)P, (2^6)P으로 가기 위한 연산은 모두 (2^7)P으로 가기 위한 연산에 이미 포함되어 활용되었기 때문입니다. 즉, 연산을 재활용할 수 있는 것입니다.
아래과 같은 알고리즘을 생각할 수 있을 것입니다.
1. P에서 접점을 그어 2P를 만든다. (누적 연산 1번)
2. P와 2P를 연산한다. (누적 연산 2번)
3. 2P에서 접점을 계속 그어 나가서 2^5P를 만든다. (누적 연산 6번)
4. 2^5P에서 접점을 그어 2^6P를 만든다. (누적 연산 7번)
5. 2^6P에서 접점을 그어 2^7P를 만든다. (누적 연산 8번)
6. 2-5 단계에서 얻은 좌표로 P + 2P + 32P + 64P + 128P를 계산한다. (누적 연산 9번)
따라서 P에서 227P로 가기 위한 타원곡선 위에서의 실수 연산은 227번이 아닌 불과 9번으로 압축됩니다. 마지막 6단계 연산은 다 찾아 놓은 구성 성분을 모아서 한꺼번에 더하기 연산하는 것으로 카운트됩니다. 이러한 연산 과정을 분석해 보면 타원곡선 위에서 N번 반복되는 연산은 대략 log_2(N)번만 하면 될 것이라 추측할 수 있습니다. 앞서 살펴 본 사례에서 log_2(227) = 7.8 ~ 8이므로, 이 숫자는 마지막 단계 연산 (합산)을 제외한 총 연산 횟수 8회와 일치합니다. 연산 횟수를 로그 스케일로 줄이기 위한 트릭은 연산 횟수가 크면 클수록 큰 효과를 발휘합니다. 예를 들어 우리 우주 안에 있는 원자 개수로 추정되는 10^82번 만큼 타원곡선 위에서 연산을 반복한다고 가정해 봅시다. 이는 엄청나게 큰 수이지만 이를 2진수로 분해하면 이는 그리 압도적인 숫자는 아닙니다. 왜냐하면 10^82~2^272이기 때문이다. 즉, log_2(10^82) = 272.xxx~273 이므로, 연산 횟수는 10^82번에서 이제 겨우 273 + 1 = 274번 정도로 압축됩니다. 여기서 잘 생각해 보아야 할 점은 연산 횟수를 로그 스케일로 압축하는 장점은 애초에 이 '연산 횟수 n'이라는 중요 정보를 알고 있는 경우에나 쓸모가 있다는 것입니다. 예를 들어 A라는 사람이 시작점 P에서 연산을 10^82번 반복하여 마침내 점 R을 얻었다고 가정해 봅시다. 그런데 만약 이 과정을 모르는 사람에게 타원곡선의 파라미터 a와 b, 시작점 P, 그리고 최종점 R에 대한 정보만 주어져 있다면 그 사람은 이 연산이 도대체 몇 번 반복되어서 P에서 R로 갔는지 쉽게 알 수 있을까요? 연산하는 측에서는 274번 정도면 금방 계산이 끝나는 작업이, 역으로 이를 파악하려는 측에서는 도무지 몇 번 반복했는지 파악하기 어려우니, 최악의 경우 1부터 시작하여 그 값이 나올 때까지 하나씩 계속 반복해서 돌려 봐야 하는 불상사가 생깁니다. 즉, 정보를 모르고 있었다면 273번으로 압축되는 장점을 하나도 못 누린 채, 최악의 경우 1번부터 10^82번 까지 전부 검사해 봐야 할 수도 있다는 것입니다. 한 번 연산하는데 엄청나게 빠른, 예를 들어 연산 한 번에 불과 1 아토초 (10^-18 초) 밖에 안 걸리는 컴퓨터를 이용한다고 해도, 10^82번이라는 연산 횟수는 대략 3.2*10^56년이라는 어마어마한 시간을 요구합니다. 이는 우리 우주의 나이보다 2.3*10^46배나 많은 사실상 무한에 가까운 시간입니다. 이것만 놓고 본다면 타원곡선 위에서의 실수 좌표 반복 연산은 아주 좋은 암호 체계를 제공할 수 있을 것 같습니다. 왜냐하면 시작점 P와 끝점 R, 그리고 타원곡선의 파라미터 a와 b를 공개키 (public key)로 설정해도, 유한 시간 안에 연산 반복 횟수 n을 발견하는 것은 사실상 불가능할 것이기 때문입니다. 즉, n 자체를 이제 암호로 설정하면 되는 것입니다.
그렇지만 '실수' 기반의 타원곡선 위의 연산 (더 정확히는 연산의 반복 횟수)을 암호 체계로 활용하기에는 몇 가지 문제가 있습니다. 가장 큰 문제는 이 연산을 어쨌든 컴퓨터로 반복해야 한다는 것입니다. 디지털 컴퓨터는 2진수 기반으로 작동하므로 실수를 정확히 표현하는 것은 이론적으로는 불가능합니다. 그래서 전자컴퓨터에서는 부동소숫점 (floating point)이라는 개념이 필요합니다. 물론 자연수는 2진수로 정확하게 표현할 수 있습니다. 그렇지만 소수는 그렇지 않죠. 예를 들어 0.3 같은 간단한 소수조차 2진수로는 0.0100110011001100…같은 무한 소수로 표현되어야 하기 때문에, 이를 표기하기 위해서는 소수점 아래 적당한 자리수에서 끊어주는 작업이 필요합니다. 당연히 이 과정에서 오류가 발생합니다. 또한 컴퓨터가 2진수로 표현된 정보를 계산하기 위해서는 이 정보가 머물 수 있는 하드웨어 상의 메모리 공간이 필요한데, 물리적 메모리 공간은 한정되어 있으므로, 이 정보에 할당할 수 있는 메모리 공간의 최대치도 미리 설정되어 있어야 합니다. 따라서 디지털 컴퓨터로 실수를 연산하는 경우, 하드웨어 상에서도 미세한 오차가 발생할 수 밖에 없습니다. 연산을 여러 번 반복되면, 이러한 오차들이 누적됩니다. 타원곡선 위의 좌표를 임의의 실수로 정할 경우, 이들을 여러 번 반복 연산하면 결국 최종 생성된 R의 좌표는 그간의 오차 누적으로 인해 당초 목표로 했던 값과 아마도 매우 크게 틀어져 있을 것입니다. 이래서는 믿을만한 암호 체계가 되기 어렵습니다. 2진수 기반의 컴퓨터 정보 처리 시스템에서는 실수 좌표 기반 타원곡선 연산으로 암호 시스템을 구축하는 것은 부동소수점 표현의 한계를 벗어나기가 애초부터 거의 불가능한 셈입니다.
그렇다면 실수 대신 자연수만 쓰면 되지 않을까요? 그렇지만 이 방법도 문제가 있음을 금방 깨달을 수 있습니다. 왜냐하면 애초에 타원곡선은 자연수 좌표로만 띄엄띄엄 이루어진 곡선이 아니기 때문이다. 임의의 타원곡선에 대해, P의 시작 좌표 중 x좌표는 얼마든지 자연수로 자유롭게 설정할 수 있습니다. 문제는 그에 대응되는 y좌표는 자연수가 아닐 가능성이 매우 높다는 것입니다. 따라서 이 문제를 근본적으로 해결하기 위해서는 임의의 타원곡선에 대해 P, Q, R 등의 모든 좌표가 무조건 자연수로만 나오게 만드는 방법이 필요합니다.
이는 앞서 유한체 (finite field) 안에서 정의될 수 있는 특수한 연산 방법을 정의하고 개발해야 함을 암시합니다. 예를 들어 타원곡선 위의 연산 ‘*’이 ‘어떤 정해진 자연수 좌표’들 위에서만 성립되도록 유한체를 정의할 수 있을 것입니다. 이를 위해 나눗셈정리, 즉, 모듈러(modular) 연산이 중요해집니다. 여기서 말하는 모듈러 연산은 더 정확히는 타원곡선 위에서 모듈러 p연산(mod p)에 대한 유한체를 구성하는 모듈러 연산을 의미합니다. 예를 들어 타원곡선
y^2 = x^3 + x
을 생각해 봅시다. 여기에 mod 23 연산을 적용해봅시다. x = 11 이라면 y^2 mod 23 = (1331 + 11) mod 23 = 1342 mod 23 = 8이 됩니다. 즉, x = 11에 대응할 수 있는 y 좌표값은 y^2 mod 23 = 8 을 만족하면서도 23보다 작은 자연수이어야 하는 것이죠. 이를 만족하는 y값으로 10과 13가 있습니다. 따라서 이 타원곡선 위의 mod 23 연산에 대응하는 유한체의 요소로서 (11,10)과 (11,13)이 포함된다는 것을 알 수 있습니다. 마찬가지로 x = 19라면 y2 mod 23 = 1인 관계식에서, y값은 1과 22라는 것을 알 수 있습니다. 흥미롭게도 특정 x좌표에 대해, mod p를 만족하는 y좌표값은 항상 두 개가 나오고 이들의 합은 항상 p가 됩니다. 이는 모듈러 연산의 역원에서 비롯되는 특징 때문이죠. 이러한 유한체는 임의의 타원곡선에 대해서도 얼마든지 찾을 수 있습니다.
타원곡선 상의 모듈러 연산 유한체는 곡선 궤적을 그리는 것처럼 보입니다. 그렇지만 모듈러 연산 법 즉, p값이 커질수록, 유한체의 x좌표에 대해, y좌표가 보이는 값을 예측하기 어렵기 때문에, 부드러운 곡선 궤적을 상상하는 것은 매우 어려워집니다. 예를 들어, mod 19 연산을 가정하여 시작점을 A = (3,2)로 잡고, 직선을 만들기 위한 두번째 점을 B = (5,18)로 잡아봅시다. 이들을 직선으로 이으면 일단 유한체들이 모여 있는 박스를 벗어납니다. 그렇지만 이 연산의 모듈러 특징을 이용하면 이러한 박스가 2차원 박스의 좌, 우, 위, 아래에 무한히 주기적으로 반복되는 것처럼 생각할 수 있습니다. (모듈러 연산의 법 p만큼의 주기를 갖기 때문이죠.) 그래서 그 직선은 바닥을 뚫는 즉시 마치 포탈을 타고 천장에서 내려오는 것처럼 직진하며 진행합니다. 이렇게 주기성을 가지고 좌우 혹은 위아래를 뚫어가며 계속 직선을 잇다 보면, 마침내 유한체 중 한 원소와 딱 만나는 경우를 찾을 수 있을 것입니다. 이 사례에서는 그 지점이 (18,8)입니다. 이제 y축 좌표로 얻어진 8을 x축 대칭시켜야 합니다. 8을 단순하게 x축 대칭시키면 -8이 되겠죠. 이것은 mod 19 연산에서는 11 = -8+19과 같습니다. 따라서 R의 죄종 좌표는 (18,8)이 아니라 (18,11)이 됩니다. 물론 이 좌표도 유한체에 속합니다. 이제 이런 방법으로 타원곡선의 유한체 연산을 반복하면 R좌표는 무조건 자연수를 좌표값으로 갖는 것이 보장되는 유한체에 포함되므로, 실수를 부동소수점 표기하면서 생기는 연산 오차를 걱정할 필요가 없어집니다. 즉, 연산을 아무리 많이해도 오차가 누적되지 않는 것입니다.
이제 모듈러 연산이 가미된 유한체 기반의 타원곡선 암호 체계 작동원리를 알아봅시다. 우선 타원곡선 상에서 모듈러 p 연산에 대해 유한체를 구성하는 원소 (즉, 0부터 p-1까지의 범위 안에서)는 반드시 p개가 되는 것은 아닙니다. 예를 들어 모듈러 19 연산에서는 1, 6, 8, 15, 17이 빠져있습니다. 이러다보니 어떤 유한체 중에서는 크기가 p에 비해 한참 작은 경우도 생기는데 이들은 순환하는 특징을 갖는 경우에 일반적으로 나타납니다. 이제 출발점 P의 좌표로 이 유한체 중 한 점인 (3,6)을 잡고, 여기서 접선, 즉, 2P = P*P 연산을 시도해 봅시다. 앞서 설명한 것처럼 P = Q인 경우 (접점): m = (3x1^2 + a)/(2y1) mod p, x3 = m^2 - 2*x1 mod p, y3 = m(x1 - x3) – y1 mod p 임을 이용하여 Q의 좌표를 계산하면 (80,10)이 나옵니다. Q (즉, 2P)에 P를 다시 연산하면 P*Q = P*2P = 3P가 되고 좌표는 (80,71)이 됩니다. 연산을 또 반복하면 P*3P = 4P가 되고 좌표는 (3,91)이 됩니다. 계속 가봅시다. P*4P = 5P의 좌표는 (O,O), P*5P = 6P의 좌표는 (3,6)이 되면서 원래의 자리로 돌아옵니다. 즉, 시작점 P의 좌표를 (3,6)으로 잡고 접선을 만들며 연산을 반복하면 P->2P->3P->4P->5P->P 로 순환하는 사이클이 형성됩니다. 이러한 순환 그룹은 타원곡선 암호체계의 기반이 됩니다. 특히 순환 주기를 엄청나게 길게 만들고, 유한체 크기도 엄청나게 크게 만들고, 애초에 이를 만들기 위한 mod의 법도 엄청 큰 소수를 쓰면 됩니다. 가장 단순한 타원곡선 기반 암호 시스템은 이러한 특징을 이용하여 생각해 볼 수 있습니다. 예를 들어 공개키로 타원곡선의 파라미터 a와 b를 공개하고, 시작점, 즉, generator P도 공개합니다. 그리고 반복 연산의 결과물인 Q도 공개합니다. 감춰진 정보는 타원곡선 유한체 위에서 모듈러 p 연산을 반복한 횟수입니다. 유한체 기반 타원곡선 모듈러 연산에서도 유한체가 크고, 소수 p가 충분히 크다면 이를 역추적하여 발견하는 것은 극도로 어렵습니다. 따라서 우리는 Q를 암호화된 메시지로, 그리고 복호화하려면 이 ‘몇 번’의 반복횟수 자체를 이용하면 됩니다.
타원곡선 암호의 장점은 정보를 교환하려는 사람들끼리 키 교환도 가능하다는 것입니다. 이것이 어떻게 작동하는지 한번 알아봅시다. 여기서 주의할 점은 키 교환의 경우, 소인수분해 기반의 RSA와는 달리 평문 자체를 암호화-복호화하기 보다는, 암호화된 메세지를 교환한 두 사람이 각자가 가진 키를 가지고 각자의 정보를 복원하는 용도로 쓰인다는 점입니다. 다음의 과정을 살펴봅시다.
1. 일단 공개키로서 모듈러 연산에 활용할 소수 p와 시작점 (즉, generator) P의 좌표, 그리고 타원곡선을 정의할 파라미터인 a와 b값을 공개키 (public key)로 설정한다.
2. Alice는 개인키 (private key)로서 임의의 n을 설정하여, 특정 타원곡선 위의 유한체에서 모듈러 p연산을 통해 nP를 계산하고 공개된다.
3. Bob은 개인키로서 임의의 m을 설정하여, 특정 타원곡선 위의 유한체에서 모듈러 p연산을 통해 mP를 계산하고 공개한다.
4. Alice는 Bob에게 자신이 계산한 nP좌표를, Bob은 Alice에게 자신이 계산한 mP 좌표를 준다.
5. Bob은 Alice로부터 받은 nP좌표에 다시 자신이 알고 있는 m을 곱한 연산을 하여 (mn)P 좌표를 얻는다. Alice도 Bob으로부터 받은 mP좌표에 자신이 알고 있는 n을 곱한 연산을 하여 (nm)P 좌표를 얻는다. 연산의 교환, 결합법칙에 의거하여 둘 다 같은 좌표를 얻고 이 최종 좌표가 비밀키가 된다.
이제 외부에서 이 최종 메시지를 해킹하고 싶어한다고 가정해 봅시다. 타원곡선 파라미터 a와 b, generator인 P, mod 연산 p, Alice와 Bob이 서로에게 주는 메시지 nP, mP는 해커가 이미 확보한 상황입니다. 문제는 해킹하는 측에서 얻은 nP와 mP 정보는 겉보기로는 그냥 평범한 좌표일 뿐이라는 점이라는 것이죠. Alice가 Bob에게 보낸 nP라는 좌표는 도대체 P에서 몇 번 (즉, n의 값)이나 연산을 반복한 것인지 파악하기 어렵습니다. Bob이 Alice에게 보낸 mP라는 좌표도 마찬가지죠. n이나 m이 매우 큰 소수이고, 유한체도 매우 커서 순환 주기가 매우 길면 길수록 역산하기는 굉장히 난해해질 것입니다. 이렇게 타원곡선을 이용한 암호화 시스템에서는 결국 얼마나 복잡하고 큰 유한체를 만들 수 있는지가 중요합니다. 메시지 암호화의 경우, RSA기반 시스템은 80bit 크기의 암호문을 만들기 위해 RSA1024, 즉, 1024bit가 필요한데 반해, ECC 기반 시스템은 160bit만 있으면 됩니다. 256bit 크기의 암호문을 만드는 경우라면 RSA는 13,560 (즉, RSA15360) bit나 필요하지만, ECC는 512bit만 있으면 됩니다. ECC가 더 효율적이라는 것을 알 수 있습니다. 이러한 효율성으로 인해 ECC는 블록체인 시스템, SSL 인증서, 디지털 서명 등에 널리 활용됩니다.
실제로 이러한 효율성을 근거로 비트코인 같은 암호화폐는 ECDSA (Elliptic Curve Digital Signature Algorithm)을 기반으로 하는 서명 시스템을 활용합니다. 비트코인은 디지털 서명을 통해 사용자들의 각 트랜잭션이 인증되고, 자산의 소유권이 증명됩니다. 이때 ECDSA는 트랜잭션과 소유권의 보안 보장을 위해 다음 역할을 수행합니다:
1. 개인키를 이용한 서명 생성: 비트코인 소유자는 개인키를 사용해 트랜잭션에 서명합니다.
2. 공개키를 이용한 서명 검증: 네트워크의 다른 노드들은 공개키를 사용해 트랜잭션이 유효한지 서명을 검증합니다.
3. 소유권 증명: 개인키를 통해 트랜잭션의 소유자가 누구인지 증명합니다.
비트코인의 ECDSA는 기본적으로 NIST가 정의한 secp256k1 타원곡선인 y^2 = x^3 + 7 mod p을 사용합니다. 여기서 p는 2^256 – 2^32 – 977인 매우 큰 소수입니다. p의 형식에서도 볼 수 있듯, 비트코인의 타원곡선에서 사용하는 개인키와 공개키 모두 256 비트 크기로 설정됩니다. 비트코인 ECDSA 트랜잭션 과정은 다음 단계로 이루어집니다.
1. 개인키 d는 임의의 256비트 정수로 생성됩니다. (1<=d<=n-1, n은 generator G의 덧셈 항등원 (즉, O = nG)
2. 개인키 d에 대해 공개키 Q를 Q = dG로 계산합니다.
3. 사용자는 자신의 개인키를 사용하여 트랜잭션 m (트랜잭션 메시지)에 다음과 같이 서명합니다.
3.1. 해시 계산: 메시지 m에 대해 해시 z를 z = H(m) 같이 계산합니다. 여기서 H는 SHA-256 같은 해시 함수입니다.
3.2. 임의의 자연수 k를 선택합니다. (1<=k<=n-1, n은 generator G의 덧셈 항등원 (즉, O = nG)).
3.3. 타원곡선 유한체 요소 R을 R = kG로 연산하여 얻습니다. (R의 x좌표 = xR)
3.4. 서명값 s를 s = k^-1(z+dr) mod n로 계산합니다. 여기서 k^-1는 k의 modulo n의 역원이고, d는 개인이 갖는 키 Q = dG의 연산 횟수를 의미합니다. r 은 xR mod n 입니다.
3.5. 서명은 (r, s)쌍으로 출력되고, 트랜잭션 데이터 m과 서명 데이터 (r, s), 그리고 공개키 Q를 네트워크에 전송합니다.
4. 서명의 검증은 위의 과정과 유사합니다.
4.1. 해시 계산: z = H(m)
4.2. 서명값 검증: w = s^-1 mod n
4.3. u1 = zw mod n, u2 = rw mod n 을 각각 계산
4.4. R’ = u1G + u2Q를 계산 후, R’ 의 x좌표 xR’에 대해 r’ = xR’ mod n을 계산
4.5. r’ = r 이면 서명이 유효한 것으로 판단. 유효할 경우 공개키 Q가 개인키 d에서 오류없이 생성되었음을 보증합니다.
위에서 알아본 바와 같이, ECDSA는 비트코인의 트랜잭션 보안을
1) 소유권 증명 (트랜잭션 서명은 개인키가 없으면 생성할 수 없으므로),
2) 변조 방지 (트랜잭션 데이터 m이 변경되면 서명의 유효성이 보장 안 되므로),
3) 익명성 (공개키 해시를 이용하여 개인키가 직접 노출되지 않으므로)
의 방식으로 몇 겹으로 보장합니다.
그런데 이러한 효율성은 ECDSA가 일반적인 RSA2048 같은 암호체계보다 더 양자컴퓨터에 취약하게 만드는 요인이 될 수도 있습니다. 왜냐하면 앞서 설명했듯, ECDSA 같은 ECC 암호체계는 256비트 정도로서 복잡도가 RSA에 비해 상대적으로 작기 때문입니다. 일단 ECDSA 서명 체계는 이산 로그 문제(discrete logarithm problem (DLP))에 기반을 둡니다. 즉, Q = dG에서 Q, G가 주어졌다고 해도, d를 구하는 것은 어렵다는 특징을 이용하는 것이죠. 왜냐하면 계산 난도는 O(2^n)이 되기 때문입니다. 그렇지만 양자컴퓨터의 쇼어 알고리즘 (Shor’s algorithm)은 이를 효율적으로 다항 시간 이내 (O(n^3))로 계산할 수 있게 해 줍니다.
양자컴퓨터가 어떻게 ECDSA를 깰 수 있는지 직접 사례를 알아봅시다. 이는 사실 타원곡선 위에서 쇼어 알고리즘이 어떻게 작동하는지를 이해하는 것이 가장 중요합니다. 앞서 언급한 개인키 d를 이용하여 Q = dG가 존재한다고 가정해 봅시다. 일단 d를 찾기 위해 우리는 G와 Q의 선형결합을 만드는 함수 f(a,b) = aG + bQ의 주기를 찾을 필요가 있습니다 (a, b는 정수). 이 함수의 주기를 찾는다는 것은 f(a,b) = O (항등원)의 관계를 만족하는 최소의 a, b 값을 구하는 것을 의미합니다. 어떤 물리적 시스템에 의해 양자중첩 상태가 주어졌다고 가정한 후 성립하는 쇼어 알고리즘은 이 값들을 찾기 위해 모든 유한체 내 값을 계산하여 주기를 추출합니다. 일단 어떤 방식으로든 물리적으로 양자중첩 상태를 생성하여 (예를 들어 n개의 큐비트에 하다마드 게이트를 적용하여 모든 가능한 2^n 상태의 중첩을 생성합니다.) a와 b의 모든 가능한 조합을 동시에 계산합니다 (양자병렬성 이용). 쇼어 알고리즘에서는 a와 b를 각각 n비트로 표현하고, 이들의 모든 가능한 조합을 미리 생성된 중첩 상태에 대응시킵니다. 임의의 a와 b값으로 이루어진 조합에 대해, f(a,b)를 계산하는 양자게이트를 설계할 수 있으며, 계산 결과는 중첩 상태에 저장합니다. 타원곡선은 결국 순환 구조를 갖는다는 사실을 고려한다면 이제 f(a,b) 함수의 주기를 찾는 것이 이제 중요해집니다. 이를 위해 중첩 상태에 저장된 f(a,b) 값들에 대해 양자푸리에 변환(QFT)을 적용하여 가장 큰 가중치를 갖는 주기를 추출할 수 있습니다. 이 주기 정보를 기반으로 개인키 d를 복구합니다. 개인키가 복구되었으니, 이제 서명도 마음대로 생성할 수 있고, 트랜잭션도 위조할 수 있습니다. 즉, 비트코인이 보장하던 소유권 증명, 변조 방지, 그리고 익명성이 모두 깨지는 것입니다.
물론 이러한 방식은 쇼어 알고리듬이 작동할 수 있는 양자 중첩 상태의 물리적 구현을 상정하고 있습니다. 그렇다면 이러한 양자 중첩 상태를 이루기 위한 최소한의 큐비트 규모는 어느 정도일까요? 일단 비트코인이 기반을 두고 있는 secp256k1 같은 타원곡선은 256 비트 암호체계이므로, 쇼어 알고리즘에 따라 2*256 = 512개의 논리 큐비트가 필요합니다. 그러면 512개의 큐비트만 구현할 수 있으면 256비트짜리 타원곡선 암호가 깨질 수 있으니 비트코인은 결국 무너지는 것일까요? 사실은 그렇게 쉽게 단정할 수 없습니다. 왜냐하면 실제적으로 구현한 물리적 큐비트의 개수가 논리적 큐비트의 개수와 늘 같지는 않기 때문입니다. 이는 기본적으로 양자 중첩 상태는 노이즈에 매우 취약한 특성을 가지고 있기 때문에 생기는 문제입니다.
양자컴퓨터 커뮤니티에서는 일찍이 이러한 문제를 해결하기 위해 오류 수정 큐비트를 도입하는 방식을 채용했습니다. 비유하자면 이렇습니다. 여러 사람이 일렬로 손을 맞잡아 인간 띠를 이루고 있다고 생각해 봅시다. 이제 왼쪽 끝에 있는 사람이 모스 신호를 손을 쥐었다 폈다 하는 방식으로 오른쪽 끝에 있는 사람에게 전달하고자 합니다. 그렇지만 손을 폈다 쥐었다하는 것은 전달 과정에서 오류가 생기기 쉽습니다. 쥐었다 폈다 하는 과정의 간격이 사람마다 다르게 느껴질 수 있기 때문입니다. 매번 전달할 떄마다 1%의 확률로 오류가 생성된다면, 99번 전달된 후에는 신호가 제대로 전달될 확률은 37% 밖에 안 됩니다. 이를 방지하기 위해 이제 신호 전달수는 홀수 번째에만 배치하고, 짝수 번째에는 그 신호가 제대로 된 신호인지 검증하는 검증자를 배치한다고 생각해 봅시다. 그러면 전달할 수 있는 길이는 50으로 줄어들지만, 오류 확률이 0.1%로 줄어들게 만들 수도 있을 것입니다. 이 경우 49번 전달된 후, 신호가 제대로 전달될 확률은 95%가 넘습니다. 1% 오류로 검증자 없이 49번 전달할 때 60% 조금 넘는 것에 비하면 크게 개선된 수치입니다. 양자컴퓨터에서도 이러한 개념을 이용하여 오류 검증 큐비트를 따로 배치합니다. 그렇지만 현실은 여전히 물리적 큐비트 오류 확률이 높기 때문에 번갈아 가며 검증자를 배치하는 방식만으로는 부족합니다. 훨씬 더 많은 검증자가 필요합니다. 마치 올림픽 대표 선수단에서 실제 선수는 10명이고 관리감독자가 1000명인 상황과 비슷해집니다. 정작 경기를 뛰는 사람은 10명이지만, 이들을 파견하는 비용은 1000명 분의 비용이 필요한 것과 비슷해집니다.
실제로 이를 측정할 수 있는 개념으로 오류 수정 오버헤드라는 개념을 도입합니다. 오버헤드는 물리적 큐비트 숫자와 논리 큐비트 숫자의 비율입니다. 현재로서는 아직 이 오버헤드가 충분히 낮아진 상태는 아닙니다. 대략 100-1000 사이의 값을 보이고 있습니다. 앞서 언급한 것처럼 비트코인의 ECDSA 256비트짜리 타원곡선 암호를 다항 시간 이내에 깨려면 논리적 큐비트가 512비트 필요한데, 만약 오버헤드가 1000이라면 실제로 필요한 물리적 큐비트 개수는 512,000개가 되는 셈입니다. 이는 아직 너무나 먼 이야기처럼 보일 수 있습니다. 구글이 12월 초에 발표한 양자컴퓨터 Willow chip의 경우, 오버헤드가 100 정도까지 낮아졌다고 평가되지만, 여전히 이 오버헤드로도 비트코인 암호에 도전하려면 51,200개의 물리적 큐비트가 생성되어야 하고, 이들로 중첩 상태를 충분히 오랜 시간 (수십-수백 마이크로초 이상) 구현할 수 있어야 합니다. 참고로 Willow chip에 포함된 물리적 큐비트는 105개였습니다.
사실 이 오버헤드를 얼마나 낮출 수 있느냐는 물리적 오류율을 얼마나 낮출 수 있느냐로도 결정됩니다. 물리적 오류율이 1% 수준이면 오버헤드는 1000 정도, 그리고 0.1% 이하로 낮아지면 오버헤드는 100까지, 만약 0.01% 이하까지 낮아지면 오버헤드는 10-20까지 낮아질 수 있습니다. 오류율을 낮추기 위해서는 일단 큐비트 배열을 크게 하면 됩니다. Willow 칩의 경우 큐비트 2차원 격자 배열을 3*3 (17큐비트)에서 7*7 (97큐비트)까지 확장했는데, 이 과정에서 오류율은 2.14배 감소한 것으로 나타났습니다. Willow chip이 채용한 오류 수정 방식인 표면 코드(surface code) 수정 방식은 이러한 2차원 격자 큐비트 배열이 커질수록 유리한 방식이 됩니다. 왜냐하면 실제로 연산을 수행하는 큐비트 사이에 검증자 큐비트를 조밀하게 채워넣기에 좋기 때문입니다 (물론 그것을 하드웨어로 제대로 구현하는 것은 상당히 기술적으로 어렵습니다). 참고로 표면 코드 방식은 현재 가장 많이 사용되는 오류 수정 방식으로 격자 형태로 연결된 물리적 큐비트를 활용하여 CNOT 논리회로를 통해 오류 여부와 오류 발생 지점을 추정하는 방식을 따릅니다. 즉, 표준화된 양자 연결 집적 회로, 예를 들어 2차원 격자 회로를 꾸미기에 유리한 방식입니다. 배열의 크기가 커질 경우, 하나의 논리적 큐비트를 구성하는데 더 많은 물리적 큐비트를 할당할 수 있으므로 안정성이 향상되고 같은 시간 동안 오류가 발생할 확률을 적게 만들 수 있습니다. 구글이 계속 이러한 scaling law를 따라 몇 년 후 (2-3년에 격자 한 변의 길이가 2배씩 성장) 15*15 수준 (아마도 2027년 전후)의 2차원 큐비트 배열체를 만들 수 있다면, 물리적 큐비트 숫자는 433에 이르게 되고, 오버헤드가 100 수준이라면 논리 큐비트는 최대 5까지 될 수 있으므로, RSA1024 해독이 가능한 수준이 됩니다. 만약 추가적으로 스케일링을 구축하여 25*25 배열체 아마도 2030년 전후)까지 만드면 이제 물리적 큐비트 숫자는 1057개에 이르게 되고, 논리 큐비트 숫자는 10에 이르게 됩니다. 이 정도 수준이면 현재의 RSA2048을 깰 수 있는 수준이 됩니다. RSA에 대해서라면 RSA4096마저도 대략 15-20년 이내로 정복이 가능할 것으로 예상됩니다. 실제로 IBM Osprey는 433 물리적 큐비트를 가지고 있고, 2025년 1121 큐비트짜리 Condor가 예정되어 있습니다. 이 정도 수준이라면 15년 이내의 시간으로 50*50 혹은 그 이상 규모의 배열체가 구현될 수 있으리라 예상하는 것은 무리한 예상은 아닐 것입니다.
15년 이내로 25*25 혹은 50*50 짜리 2차원 물리적 큐비트 격자 배열체를 만들 수 있다고 가정해 봅시다. 배열체의 scaling과 동시에, 사실 오류 수정 성능도 점점 높아지게 될 것입니다. 지금은 표면 코드 방식으로 오류를 수정하고 있지만, 앞으로는 LDPC (low-density parity check) 코드 같은 방식이 주종이 될 수도 있기 때문입니다. 표면 코드에서 논리적 큐비트의 오류 확률은 격자 크기 (한 변의 길이를 D라고 가정)에 따라 다음과 같은 power function 의존도를 같습니다.
P(logical) ~ (P(physical))^(D/2)
따라서 표면 코드 방식에서는 격자 크기를 늘릴수록 큐비트의 오류율이 지수함수적으로 감소합니다. 예를 들어 물리적 큐비트 오류율 (P(physical))이 0.01 일 때, 5*5 격자에서는 P(logical) ~ 0.01^5/2 ~0.000316이고, 7*7 격자에서는 P(logical) ~ 0.01^(7/2) ~ 0.0001 이 되면서 1/3 이하로 감소하는 것이죠. 그렇지만 표면 코드 방식의 단점은 물리적 큐비트 숫자가 D^2에 비례하므로 오버헤드의 증가를 막기 어렵다는 것입니다.
물리적 큐비트 2차원 격자를 100*100으로 구현했다고 가정해 봅시다. 이 경우 물리적 큐비트 숫자는 10,000개 정도일 것입니다. 비트코인 ECDSA를 깨기 위해 512비트가 필요하므로, 오버헤드는 10,000/512 ~19, 즉, 20 이하로 낮아져야 합니다. 논리적 큐비트 오류율을 10^-15로 설정할 경우, 오버헤드가 50 정도로 달성된 상황이라면, 100*100 격자에서는 10^-15~(P(physical))^(100/2)의 관계식에서, P(physical)~0.5% 정도로 낮아져야 합니다. 즉, 물리적 큐비트 품질의 향상 혹은 더 효율적인 오류 수정 코드가 개발되어야 대략적으로 수십 년 이내에 달성될 수 있는 수준의 물리적 큐비트 규모에서 비트코인 암호체계가 깨질 가능성이 보이는 것입니다.
물리적 큐비트 품질의 향상이 가능해지려면 결국 현재의 반도체 기술과 소재 기술에서의 혁신이 충분히 뒷받침되어야 합니다. 현재로서 대량의 큐비트 배열체 구현에 있어 가장 중요한 기술은 초전도체 개발이고, 이를 통해 더 성능이 개선된 조셉슨 접합 소자를 설계할 수 있어야 합니다. 초전도 기반 큐비트가 아니라면 Trapped ion이나 spin qubit를 이용하는 방식이 있습니다만, 이중에서 그나마 현재의 반도체 미세공정과 연결될 수 있는 방식은 집적도 향상을 기대할 수 있는 CMOS 공정과 호환되는 스핀 큐비트 방식이 될 것입니다. 오류 수정 코드 개선은 LPDC 코드 등을 생각할 수 있는데, LDPC 코드는 기본적으로 sparse matrix에 기반을 두고 있습니다. LDPC의 작동을 위해서는 parity-check matrix H가 필요하며, H*V = 0의 관계식 만족 여부를 검증하는 과정을 거칩니다. V는 부호화된 데이터 벡터이며, 패리티 검증 행렬을 반복적으로 연산하면서 오류를 인지 및 수정합니다. 기본적으로 sparse matrix를 사용하므로, 이를 물리적으로 구현하는 과정에서도 물리적 큐비트 연결도 (degree of connection)을 표면 코드에 비해 훨씬 더 많이 줄일 수 있습니다. 참고로 표면 코드는 2차원 격자 구조에서는 각각의 물리적 큐비트가 최대 4개의 인접 큐비트와 연결되는 조밀한 구조를 가지고 있습니다. 따라서 큐비트 검증을 위한 오버헤드도 줄일 수 있고, 큐비트 간 상호작용 (crosstalk)도 줄일 수 있죠. 행렬의 크기를 크게 만드는 것 역시 sparse matrix 특징상, 연산에 큰 무리가 없고, 물리적 구현이 어렵지 않으므로, 대규모 큐비트 네트워크에도 더 적합할 수 있습니다. 이론적으로는 LDPC 코드를 이용하면 오버헤드를 10까지 낮추는 것이 가능할 수도 있습니다. 그렇지만 sparse matrix를 사용하는 것은 장점이자 동시에 단점이 됩니다. 왜냐하면 실시간 오류 수정을 위한 소프트웨어 알고리즘이 더 복잡해지기 때문입니다. 특히 sparse matrix의 초기 상태에 따라 오류 수정 성능이나 오버헤드가 달라질 수 있으므로, 초기 상태의 최적화에 생각보다 더 많은 시간이 걸릴 수 있습니다.
어쨌든 희망회로를 돌린다면 아마 15-20년 이내로 물리적 큐비트 배열체는 100*100 혹은 그 이상으로 발전할 수도 있고, 오버헤드는 50 이하로 낮아질 수 있으며, 물리적 큐비트 오류율은 0.05% 이하로 낮아질 수 있을지도 모릅니다. 이렇게 되면 논리적 큐비트 개수가 500개 정도에 육박하는 수준이 될 수 있음을 의미하고, 드디어 RSA2048은 물론, ECDSA 같은 타원곡선 암호 깨짐도 가시권에 들어오는 수준이 될 수 있다는 것이죠. 그러면 비트코인 같은 블록체인들의 유효기간은 대략 2040년-2050년 정도면 끝난다는 것일까요? 비트코인 거품은 2040년대가 되면 자연스럽게 꺼지게 된다는 것일까요?
물론 암호 시스템 업그레이드가 없으면 정말 그렇게 될 수도 있을 것입니다. 예를 들어 512비트 혹은 1024비트의 논리 큐비트를 달성한 양자컴은 일단 이미 공개된 공개키를 사용하는 트랜잭션 주소부터 즉각적으로 공격할 것입니다. 아직 사용되지 않은 주소 (비공개키 주소)는 상대적으로 안전하겠지만 공격 당하는 것은 시간 문제입니다. 이러한 상황에서 비트코인 커뮤니티는 몇 가지 대응책을 꺼낼 수 있을 것입니다. 기본적으로 이미 오래전부터 연구되고 있는 양자내성암호(post-quantum cryptography, PQC)로 전환하는 방법부터 시작할 것입니다. 이를 이용하여 소프트포크 혹은 하드포크를 통해 PQC를 채택할 수 있을 것입니다. 이 경우 기존에 사용하던 비트코인 주소를 PQC 주소로 전환하거나, 사용자들이 새로운 키 쌍을 생성하여 잔고를 계속 옮기는 방식을 취할 수도 있을 것입니다. 물론 PQC의 기술 발전은 결국 하드웨어 문제로 귀결되는데, 현재로서는 양자컴퓨터 물리적 큐비트 스케일링과 오류율 저하 속도가 더 빠르므로 창이 조금 더 빠른 상황으로 볼 수 있습니다. 비트코인 커뮤니티에게 남은 시간이 대략 15년-20년 정도라고 볼 때, PQC가 정말 현실화될 수 있다면 현재의 암호 체계를 업그레이드하는 방식으로 버틸 수 있을 것이고, 현실화되기 어려운 수준이라면, 일단 현재의 256비트 기반 ECDSA를 512비트, 혹은 1024비트로 업그레이드함으로써 일단 시간을 벌어야 할 것입니다. 그렇지만 이는 결국 군비경쟁의 사이클에서 근본적으로 해방되기는 어렵습니다. 양자컴으로 공격하는 측에게 노이즈를 의도적으로 더 많이 얻어가게끔 암호체계를 보강하는 방법도 있습니다. 이 경우 오버헤드가 다시 늘어나는 효과를 부여하게 되므로 계산 성능을 떨어뜨릴 수 있을지도 모릅니다. 더 현실적인 방안이라면 사용자가 매번 새로운 비트코인 주소를 생성하도록 권장하는 것인데, 거래할 때마다 거래 후 잔액을 새로운 주소로 이동해야 한다는 번거로움이 생깁니다. 다중 서명 방식이나, 하드웨어 기반의 물리적 보안 강화를 도입할 수도 있을 것입니다.
물론 현재의 양자컴퓨터 기술 발전 속도가 언제까지 scaling law를 따라갈 수 있을지 모를 일이고, 더 중요한 사실은 애초에 양자컴퓨터의 주요 목표는 비트코인 같은 블록체인 깨는 것이 아니기에, 비트코인 같은 블록체인 소유자들은 지금 당장부터 자신의 자산 가치가 0이 될까 걱정에 시달리며 불면증을 겪을 필요는 없을 것입니다. 그렇지만 사실 비트코인 같은 NP에 가까운 암호체계는 양자컴퓨터 개발 진영에게는 아주 좋은 연습 문제이자 현실 문제가 되어 줄 수 있으므로 양자컴퓨터의 위협에 지속적으로, 그리고 앞으로는 더 실존적으로 시달리게 되는 것을 근본적으로 막을 수는 없을 것입니다.
조금씩 현실로 다가오는 양자컴퓨터 기술 발전으로 인해 인류는 또 전혀 다른 방식과 이론 기반의 암호화 기술 시대로 진입하게 되는 것 역시 가속화될 것으로 예상됩니다. 그 과정에서 인류가 정말 그러한 양자컴이나 암호화 기술을 하드웨어로 구현할 수 있을 정도로 혁신적인 신소재와 미세 공정을 구현할 수 있을지도 관건이지만, 그 역시 강력한 현실 문제가 존재하는 한, 기술 개발 진영들에게는 아주 좋은 동기를 부여하게 될 것입니다.