MuSig: 멀티시그의 새로운 기준
Blockstream Research

MuSig: 멀티시그의 새로운 기준

Andrew Poelstra

비트코인 및 Blockstream의 Liquid 같은 관련 블록체인은 ECDSA 서명 알고리즘을 사용하여 시스템에 저장된 코인의 소유권과 거래를 검증합니다. 이는 2008년 당시 널리 사용되고 특허로 등록되지 않았던 디지털 서명 시스템을 기반으로 이루어진 기술적인 결정이었습니다. 하지만 ECDSA에는 몇 가지 심각한 기술적 제한이 있습니다. 특히, ECDSA에서 다중 서명 임계치 서명(단일 서명이 아닌 개별 당사자의 정족수에 의한 서명)을 생성하기가 매우 어렵습니다. ECDSA 서명은 복잡한 대수 구조를 가지고 있어 유연성이 없고 작업하기 어렵기 때문에 개발자들은 더 유연한 서명 체계를 사용하여 보다 높은 기밀성으로 간단하게 구현할 수 있는 크로스체인 아토믹 스왑 또는 Lightning 같은 응용 프로그램용 비트코인 스크립트를 사용할 수밖에 없습니다.

그러나 2008년 이후 디지털 서명 분야의 기술이 크게 발전했음에도 불구하고 연구 문헌에 설명된 대체 서명 체계는 실제 사용에 요구되는 많은 조건을 간과하고 있습니다. 특히 서명자가 키 생성 방법 및 시점을 완전히 제어할 수 있고 항상 완벽한 무작위성을 가질 수 있으며 지속적, 안정적이고 안전한 메모리를 가지고 있다고 가정합니다. 그러나 실제로 비트코인 사용자의 키 접근성은 제한적이고, 정확한 키 생성 메커니즘을 제어하는 것이 거의 불가능하며, 외부 서명자가 생성한 주소를 어떻게 사용하는지 관리할 수 없습니다. 우리는 이러한 문제를 해결하기 위해 새로운 서명 체계를 설계하는 이니셔티브를 시작했고, 강건하고 쉽게 무너지지 않는 체계를 구현하기 위해 실질적인 기술적 노력을 기울이고 있습니다.

서론

작년 상반기에 Blockstream의 암호 전문가 Pieter Wuille과 저는 Yannick Seurin, Gregory Maxwell과 협력하여MuSig라 불리는 새로운 다중 서명 체계를 발표했습니다. 이 다중 서명 체계는 악의적인 의도를 갖고 담합한 서명자들의 하위 집단에 대해서도 입증할 수 있는 보안을 제공했고, 일반적인 단일 서명자의 Schnorr 서명과 구별하기 힘든 서명을 생성합니다.

이후 우리는 MuSig를 연구하며 사용 가능한 코드로 만드는 중이고, 이번 주에는 해당 코드를 Bitcoin Core(Elements 와 Liquid에 대한 기밀 거래 지원을 추가하기 위해 확장함)에서 사용하는 높은 보증 수준의 암호화 라이브러리 secp256k1의 포크인 secp256k1-zkp에 병합했습니다.

비트코인 커뮤니티가 비트코인에서 Schnorr 서명의 사용을 연구하고 있기에 우리 코드가 결국에는 Bitcoin Core와 기타 여러 프로젝트에서 사용되는 업스트림 라이브러리 secp256k1로 병합되기를 기대합니다.

우리 코드는 BIP-schnorr와 호환되는 서명을 생성하고, 스크립트 없는 스크립트에서 Lightning을 활성화 할 수 있는 어댑터 서명도 생성할 수 있습니다.

왜 MuSig인가?

작년에 논의한 바와 같이, 암호화 기술 문헌에는 기존의 많은 다중 서명 체계가 있는데, 여기서 질문은 ‘우리가 왜 우리만의 체계를 개발했는가’ 입니다. 한마디로 답하자면, 아직 기존의 체계가  충족시키지 못한 다음의 두 가지 요건 때문입니다.

  1. 서명자 집단과 관계없이 검증자에게 동일하게 보이는 짧고 일정한 크기의 서명. 블록체인 시스템에서 검증 효율성은 가장 중요하게 고려되어야 하고, 검증자에게 서명자 구성의 세부 정보를 도용 방지에 필요한 이상으로 제공하는 것은 무의미합니다. 또한 MuSig 서명은 정확한 서명자 정책을 숨김으로써 기밀성을 높입니다.
  2. 일반 공개 키 모델의 보안성 입증. 이는 서명자가 키 생성 또는 제어 방법에 대해 어떠한 추가 정보도 제공할 필요 없이, 일반적인 키 페어로 다중 서명에 참여할 수 있는 완전한 유연성을 갖고 있다는 것을 의미합니다. 개별 서명자가 다양하고 제한적인 키 관리 방침을 갖고 있기 때문에 비트코인 환경에서 키 생성에 대한 정보를 제공하기는 어려울 수 있습니다. 또한 키 생성 정보에 대한 의존은 Taproot(보이지 않는 의미가 추가적으로 인코딩 되어 있는 공개 서명 키를 보유한 제안된 비트코인 확장)에 잘못된 영향을 줄 수 있습니다.

또한 MuSig를 발표한 이후, 우리는 예전에 미공개된 MuSig 버전을 포함, 공개된 많은 서명 체계가 실제로 불안정하다는 것을 알게 되었습니다. 향후 게시물에서 더 자세히 다루겠지만, 지금으로서는 우리 연구가 비트코인 및 Liquid용 다중 서명 체계를 개발하는 데 적합하다고 할 수 있습니다.

위험 및 안전한 API 개발

다중 서명 프로토콜에 대한 모든 수학적 설명처럼, MuSig는 발표된 바와 같이 참가자들이 서명 프로세스 전반에 걸쳐 지속적이고 쉽게 업데이트 되며 공격자가 이전 상태로 “재설정”할 수 없는 메모리에 접근할 수 있다고 가정합니다. 또한 서명자는 균일(uniform)과 구별할 수 없는 무작위성 소스에 접근할 수 있다고 가정합니다. 그러나 안타깝게도 현실 세계는 그렇게 단순하지 않습니다. 우리는 제한된 하드웨어나 암묵적 가정으로 인해 비밀 키 자료가 손실될 가능성없이 다양한 시나리오에서 사용될 수 있는 API를 설계하는 데 많은 노력을 기울였습니다.

MuSig 서명은 Schnorr 서명 또는 ECDSA와 마찬가지로 구성될 때 균일하게 무작위로 생성되어야 하는 비밀 “논스(nonce)”를 사용합니다. 균일에서 단일 비트라도 벗어나는 경우, 비밀 키가 손실되거나 자금을 도난당할 수 있습니다.

우리의 주요 설계 목표는 제한된 환경에서도 위험한 사용 패턴을 권장하지 않고 샤프 코너가 없는 오용 방지 API를 만드는 것이었습니다.

균일 무작위성

개별 서명을 사용하면 균일하게 무작위한 논스를 달성하는 표준 접근법은 간단합니다. 비밀 데이터와 서명할 메시지에 암호화 해시 함수를 적용하면 서명할 모든 메시지에 대해 독립적이고 균일하게 무작위한 값을 얻을 수 있습니다.

그러나 다중 서명을 사용하면 이 간단하고 강력한 방법은 문젯거리가 됩니다. 악의적인 의도를 가진 서명자가 동일한 메시지에 대해 두 개의 다중 서명을 요구하며 두 번째 서명에서 자신의 참여도를 조정할 수 있습니다. 첫 번째 서명자가 메시지와 함께 비밀을 해시하여 논스를 선택할 경우, 두 개의 아주 다른 서명에 동일한 논스를 사용하게 됩니다. 이는 본질적으로 PS3가 해킹 당하는 실패 모드와 같습니다. 단일 서명자 경우와 달리, 서명자 개개인이 생성될 서명의 모든 세부 사항을 알기 전에 자신의 논스를 선택해야 하기 때문에 간단한 솔루션이 없습니다.

이 문제에 대한 전통적인 솔루션과 해싱이 대중화되기 전에 사용된 솔루션은 하드웨어 난수 생성기를 사용하는 것입니다. 하지만 이러한 솔루션은 비용이 많이 들고 환경 편향이나 기타 외부 영향에 민감하며, 결정적으로 제대로 작동되고 있는지 검증할 방법이 없습니다.

검증에 대해 독창적인 솔루션이 몇 가지 있는데 이는 향후 게시물에서 다루겠습니다. 현재로서 우리의 선택은 API 사용자가 모든 서명 세션마다 고유한 “세션 ID”를 제공하도록 하는 것이었습니다. 논스는 서명자의 비밀, 서명자 집단, 서명할 메시지, 그리고 마지막으로 이 세션만의 고유한 데이터를 해시하여 생성됩니다. 난수 생성기에 접근할 수 있는 사용자는 난수 생성기를 사용하여 세션 ID를 만들 수 있습니다. 퍼시스턴트 메모리에 접근할 수 있는 사용자는 단순히 카운터를 사용할 수 있습니다.

우리는 무작위한 숫자나 퍼시스턴트 메모리를 요구하기 보다 지속적인 연구를 수행함으로써 곧 진정으로 강력한 솔루션을 만들 수 있을 것으로 기대합니다.

재전송 공격

확실한 무작위성 소스를 사용하더라도, 프로세스의 어느 시점에서 서명 프로토콜을 재전송하는 것이 가능하다면 다중 서명에서 한 서명자로부터 비밀 키를 추출할 수 있습니다.  이러한 유형의 공격을 “재전송 공격”이라고 하는데, 이 공격은 재가동할 수 있는 가상 시스템 내에서 작동하는 서명자 또는 서명 중단과 직렬화 가능 상태로부터의 복원을 지원하는 서명자를 대상으로 수행될 수 있습니다. 이 공격은 동일한 상태에서 복제된 두 개의 가상 시스템을 실행하거나 동기화 되지 않은 분산 데이터베이스에서 코드를 실행하는 등 능동형 공격자가 없는 상황에도 뜻하지 않게 발생할 수 있습니다.

특히 서명자가 다중 서명에 참여하고, 논스를 선택한 뒤 어느 시점에서 해당 서명 프로세스가 다시 시작될 경우, 서명에 대한 다른 서명자의 참여를 조정함으로써 앞서 설명한 것과 본질적으로 동일한 공격을 실행할 수 있습니다.

이러한 종류의 공격은 단일 서명에서는 발생하지 않습니다. 단일 서명은 다시 시작될 중간 단계가 없이 한 번에 생성되기 때문입니다. 이러한 추가 과제는 다중 라운드 암호화 프로토콜에서만 발견됩니다.

우리가 적극적으로 연구 중인 새로운 메커니즘이 없다면 가상 시스템에 로그인하는 사용자를 보호할 방법이 없습니다. 그러나 가상 시스템을 사용한다는 것 자체가 이미 보안 수준이 낮다는 것을 의미하기도 합니다. 공격자가 재설정할 수 있는 시스템은 공격자가 직접 비밀을 빼낼 수 있는 시스템일 수 있기 때문입니다.

우리 API는 스테일 상태를 직렬화하고 재시작할 수도 있는 서명자를 보호하기 위해 서명 세션의 직렬화를 지원하지 않습니다.

즉, 전원 재설정이나 정전에도 탈없이 온전한 (하드웨어 지갑의 이상적인 목표) 서명 세션을 지원하고자 하는 우리 코드의 사용자는 안전한 퍼시스턴트 메모리를 유지해야 합니다. 이러한 지갑이 다중 서명 세션을 병렬로 지원하고자 하는 경우, 모든 병렬 세션에 추가적으로 퍼시스턴트 메모리가 있어야 합니다.

다시 한 번 말씀드리지만, 이러한 제한은 우리가 적극적으로 연구 중인 접근법으로 해결할 수 있습니다.

결론 및 향후 계획

앞선 논의는 다자 프로토콜이 단독 프로토콜보다 새롭고 실질적으로 더 어려운 과제를 안고 있다는 내용을 함축하고 있습니다. 수학적 복잡성 측면에서 MuSig는 Bulletproofs등 보다 훨씬 단순합니다. 그러나 구현의 복잡성 측면에서 MuSig는 더 많은 노력과 반취약성(antifragility) 및 API 유연성간 더 많은 타협을 요구했습니다.

이 글은 n명의 서명자들이 협력하여 단일 서명을 생성하는 서명인 다중 서명만 다뤘습니다. 향후 게시물에서는 충분히 많은 n명의 서명자들로 구성된 일부 하위 집단이 전체 집단의 참여 없이도 서명을 생성할 수 있는 임계치 서명에 대해 설명할 것입니다.

또한 향후 게시물에서는 더 안전하게 생산할 수 있고 보다 잘 검증할 수 있는 논스 무작위성을 만드는 몇 가지 기술에 대해 논의할 것입니다. 특히, sign-to-contract라는 기술을 사용하면 호스트 컴퓨터는 신뢰할 수 없는 하드웨어 지갑의 난수 생성기의 편향 가능성을 제거할 수 있습니다.

더 나아가, 영지식 증명(zero knowledge proofs을 활용하면 편향된 무작위성 및 재전송 공격으로 인한 위험과 퍼시스턴트 메모리에 대한 요구 조건을 제거할 수 있고 MuSig 프로토콜을 3라운드에서 2라운드로 줄일 수 있습니다. 우리는 이러한 가능성을 기대하며 연구 결과가 나오는 대로 공유할 것입니다.

우리 코드는 GitHub에 공개되어 누구나 사용할 수 있습니다. 코드를 마음껏 사용하시고 피드백을 보내 주세요!

If you have specific preferences, please, mark the topic(s) you would like to read: