에스토니아 온라인 투표 시스템의 소스 코드

Source code of the Estonian online voting system

github.com/valimised ▲ 159 댓글 133 theanonymousone

요약

에스토니아가 선거에 실제로 쓰는 온라인 투표 시스템 IVXV의 소스 코드를 GitHub에 공개해 두고 있습니다.

에스토니아 국가선거사무소가 개발을 감독하는 온라인 투표 시스템의 저장소입니다. 저장소 설명에 따르면 목적은 공개 검토입니다. 이곳에서 직접 개발하지는 않지만, 선거에 쓰는 코드와 같게 계속 갱신한다고 밝혔습니다.

왜 중요한가

  • 국가 선거에 쓰이는 투표 소프트웨어를 시민 누구나 직접 읽고 검토할 수 있습니다.
  • HN에서는 소스를 시민에게 공개하지 않고 일부 기관에만 감사를 허용하는 브라질 사례가 대비로 거론됐습니다.

핵심 내용

  • 공개본은 개발용이 아니며, 실제 선거에 쓰는 코드와 같게 맞춰 둔다고 설명합니다.
  • 투표, 수집 관리, 처리, 감사, 검증 등 구성 요소가 디렉터리별로 나뉘어 있습니다.
  • 표 수집 쪽 구성 요소는 Go로, 관리 애플리케이션은 Java로 작성됐습니다.
  • make로 구성 요소마다 빌드와 테스트를 할 수 있고, 데비안 패키지도 만들 수 있습니다.
  • 개발 모드 빌드에는 실제 선거에 써서는 안 되는 더미 모듈(시험용 가짜 부품)이 들어간다고 적혀 있습니다.

HN 반응

  • 종이 투표지를 표본으로 뽑아 손으로 대조해야 한다는 주장과, 영지식 증명(내용을 숨긴 채 참임을 보이는 기법)이면 된다는 반론이 맞섰습니다.
  • 자기 표를 나중에 확인할 수 있으면 가족의 강요나 표 매수에 악용된다는 지적이 반복됐고, 대중이 암호 기술을 믿기 어렵다는 의견도 나왔습니다.

댓글

30개 표시 · 전체 134개
  1. cryptonector HN

    소프트웨어만으로는, 심지어 소프트웨어와 하드웨어를 합쳐도 선거를 안전하게 만들 수는 없습니다. 「Reflections on Trusting Trust」 문제나 펌웨어를 검증해야 하는 문제를 떠올려 보세요. 기계가 제대로 동작할 것이라고 보장할 수는 없어도, 제대로 동작했는지 검증할 수는 있습니다. 기계의 동작을 사후에 검증하려면 투표 마감 직후에 바로 해야 합니다. 그리고 수작업 통계적 무작위 표본 추출 방식을 만들어서, 무작위로 뽑은 기표된 종이 투표지를 디지털 투표 기록(CVR)과 수작업으로 대조해야 합니다. 그런 다음 디지털 위험 제한 감사(risk limiting audit)로 CVR 합계가 기계가 보고한 결과와 일치하는지 확인합니다. 투표 마감 후 빨리 할수록 부정행위가 적발될 가능성은 높아집니다. 즉, 무작위로 뽑은 충분한 수의 투표소를 마감 직후 수작업으로 부분 감사해야 합니다.

    그래도 해결할 기술적 문제가 산더미처럼 남습니다. 우편 투표와 부재자 투표의 보안, 사전투표에 쓰는 투표함의 보안(사전투표는 매일 밤 중간 결과가 공개되기 때문에 위와 같은 수작업 부분 감사를 하기 어려울 테니까요. 아니면 그 점은 감수하기로 하든가요), 유권자 등록 같은 문제들입니다.

  2. himata4113 HN

    이 문제는 전부 암호학으로 풀 수 있습니다.

    신분증 카드에는 개인 키가 들어 있고, 그 키로 트랜잭션에 서명합니다. 쓰고 있는 기계가 해킹당했더라도 상관없습니다. 이 내용은 나중에 검증할 수 있으니까요.

    예시 A: 후보 A에게 투표했는데 소프트웨어가 후보 B로 바꿔 놓고 화면에는 후보 A에게 투표한 것처럼 보여 줍니다. 나중에 언제든 독립된 기기로 해당 트랜잭션을 확인하면 조작된 사실을 알 수 있고, 내 표를 철회하거나 바꿀 수 있습니다.

    예시 B: 내 표가 집계됐는지 어떻게 알 수 있을까요? 모든 표의 해시와 서명을 공개하고, 최종 집계를 다시 계산해 전체 표와 비교하면 됩니다. 내 표가 최종 집계에 빠져 있다면 해시가 달라지고, 모든 트랜잭션이 공개되니 데이터셋에서 내 표를 직접 볼 수도 있습니다. 프라이버시를 지키기 위해 매 라운드에 번호를 두고, 개인 키 + 번호 -> 새 키로 만들면 표마다 지문이 서로 다르게 됩니다.

  3. cryptonector HN

    이 문제는 전부 암호학으로 풀 수 있습니다.

    저는 이 문제를 오래 고민해 봤는데, 결론은 암호학만으로는 해법이 될 수 없다는 겁니다. 이유는 다음과 같습니다.

    1. 대중이 믿어야 하는데, 지나치게 기술적인 해법은 설득하기 어렵습니다.

    2. 블록체인 방식이라면 어떤 것이든 투표의 비밀을 지켜야 합니다. 그렇지 않으면 비밀이 아닌 투표에서 예상되는 온갖 문제(강압, 매표, 망신 주기 같은 네트워크 효과)가 생깁니다.

    3. 암호학이 현실 세계와 맞닿는 지점이 어딘가에는 반드시 있어야 합니다. 그렇지 않으면 투표의 비밀 때문에 결과가 완전히 허구이거나 미리 짜여 있어도 확인할 방법이 없습니다!

    즉, 투표의 비밀을 포기해야만 종이 없는 블록체인 해법이 가능합니다. 삼키기에 너무 쓴 약입니다.

    반대로 종이 투표지와 수작업 부분 감사를 해법의 일부로 받아들인다면 블록체인도 할 역할이 있습니다. 예를 들어 기계가 투표지 50장마다 블록체인의 헤드를 표시하고 유권자는 눈앞에 보이는 그 헤드를 사본으로 가져갑니다. 선거가 끝난 뒤에는 누구나 블록체인의 무결성을 검증할 수 있고, 투표지 50장마다 중간 집계만 나오므로 투표의 비밀도 지켜집니다.

    종이 투표지와 부분 수작업 감사를 쓰는 시스템은 대중에게 설명할 수 있고, 대중도 그 시스템을 신뢰하게 될 수 있습니다. 거기에 블록체인을 더하면 신뢰가 훨씬 커집니다. 블록체인은 집계가 사후에 수정되지 않았음을 알려 주고, 부분 수작업 감사는 디지털 투표 기록이 유권자가 기표해서 투표한 그대로 실제 종이 투표지를 담고 있음을 허용 가능한 수준의 통계적 신뢰도로 알려 줍니다.

  4. plasticchris HN

    투표지 50장마다 중간 집계만 나오므로 투표의 비밀도 지켜집니다

    50명이 전부 똑같이 투표했다면 그렇지 않죠...

  5. sigmoid10 HN

    즉, 투표의 비밀을 포기해야만 종이 없는 블록체인 해법이 가능합니다. 삼키기에 너무 쓴 약입니다.

    틀린 말입니다. HN에서 이런 생각이 흔한 건 한때 인기 있던 어떤 유튜버가 이 주제로 만든 영상 때문이라는 걸 압니다. 그 영상은 지금도 여기에 주기적으로 다시 올라오죠. 하지만 그 사람은 그때도 이론적으로 틀렸고 지금 실무에서 보면 더더욱 틀렸습니다. 비밀성/익명성과 검증 가능성은 더 이상 양립할 수 없는 관계가 아닙니다. 현대 암호학에 밝은 사람이라면 누구나 그렇게 말해 줄 겁니다.

  6. poly2it HN

    한때 인기 있던 어떤 유튜버가 이 주제로 만든 영상

    저는 그 일을 모르는데, 링크 있으세요?

  7. cryptonector HN

    참고 자료를 좀 알려 주시면 좋겠습니다. 참고 자료를 요구해서 깎아내리려는 게 아닙니다. 분명 보신 적이 있으시니 저도 보고 싶어서요.

    그리고 어쨌든 대중을 설득해야 한다는 문제는 남습니다.

  8. sigmoid10 HN

    대중을 설득하는 건 별개의 문제라는 데 동의합니다. 하지만 기술적인 차원에서는 이 문제들이 이미 풀려 있습니다. 예를 들어 최근 구현체인 https://github.com/vocdoni/davinci-paper 를 보세요. 비교적 최근 것이지만 수학적 토대는 80년대 후반까지 거슬러 올라갑니다.

    그 전에도 https://github.com/benadida/helios 같은 구현체가 있었습니다. (해당 논문은 https://www.usenix.org/legacy/event/sec08/tech/full_papers/adida/adida.pdf 입니다.) 강압 저항성은 아직 없었지만, 익명이면서 검증 가능한 시스템의 핵심인 영지식 증명은 이미 쓰고 있었습니다.

  9. cryptonector HN

    감사합니다. 그렇군요, 영지식 증명이네요. 그럴 줄 알았습니다. ZK로 안전한 투표를 만들 수 있다고 생각은 합니다만, 대중이 그걸 이해하리라고 기대할 수는 없다고 봅니다. 제대로 읽어 봐야겠지만, 비밀 키를 가진 사람이 마음먹으면 투표용지를 복호화해서 투표의 비밀을 깰 수 있는 방법이 있을 것 같습니다.

  10. mariofdistrust HN

    문제는 사람들이 믿지 않을 거라는 점이나 블록체인이 투표의 비밀을 지킬 수 없다는 점이 아니에요(지킬 수 있거든요). 암호 기술이 결국 현실 세계와 만나야 한다는 점도 일부 있지만, 핵심은 암호가 어렵고 정부가 그 일을 해낼 만한 역량이 없을 수 있다는 거예요. 예를 들어 작년에 IACR(10년 넘게 암호 기술로 온라인 투표를 해 왔고 지금도 하고 있는 곳이에요)은 수탁자 한 명이 개인 키를 잃어버려서 개표 결과를 복호화할 수 없게 되는 바람에 선거를 무효로 해야 했어요. IACR은 사실 큰 이해관계가 걸린 조직이 아니라서 결국 별일 없이 넘어갔지만, 만약 여러분 나라 정부가 "여러분, 기술적인 문제가 있어서 선거를 다시 해야겠습니다"라고 한다면 어떻겠어요? 그 말을 믿겠어요, 아니면 뭔가 꿍꿍이가 있다고 의심하겠어요? 이게 아주 치열하고 과열된 선거에서 벌어진다면요?

  11. crote HN

    나중에 언제든 독립된 기기로 해당 트랜잭션을 확인하면

    축하합니다, 방금 프라이버시를 깨셨네요. 이제 폭력적인 남편이 아내의 투표를 확인할 수 있으니, 아내는 원치 않는 쪽으로 투표하라고 강요당할 수 있습니다.

  12. emil-lp HN

    큰 문제는 누구에게 투표했는지 확인할 수 있으면 표를 팔 수도 있고, 누군가(이를테면 폭력적인 남편)에게 특정 방식으로 투표하라고 강요받을 수도 있다는 점입니다.

  13. rustyhancock HN

    해법은 있습니다. 다만 현실성이 없을 뿐입니다. 암호화폐와 하드웨어 지갑이 이 문제를 풀었습니다. 하지만 그건 방구석에 있는 개인 규모에서 돌아가는 거지, 하루 동안 전국에서 수억 명이 투표하는 규모가 아닙니다.

    여권이 Trezor 같은 화면 달린 하드웨어 지갑처럼 바뀌어야 할 겁니다. 펌웨어와 설계는 오픈 소스여야 하고요.

    화면이 있으면 내가 무엇에 서명하는지 볼 수 있고, 나중에 내가 서명한 내용을 다시 확인할 수도 있습니다.

    그런데 저는 제가 누구에게 투표했는지 사람들이 알기를 원하지 않습니다. 그래서 전자여권 게이트 같은 걸 만들어 아무도 저와 함께 들어갈 수 없게 합니다.

    그리고 나중에 제 표를 확인할 수 있으면서도 다른 사람들에게 그게 저라는 건 알려지지 않았으면 합니다. 이것도 모네로나 지캐시 같은 여러 암호화폐가 이미 풀었습니다.

    동네 주민센터에 가서 전자여권 게이트 같은 곳으로 혼자 방에 들어가 기계로 제 표를 확인할 수 있습니다. 제 기기가 제 표를 검증해 주는 겁니다.

    투표 내역을 보는 사람은 N명의 유권자 중 한 명이 했다는 것만 알 수 있습니다. N이 너무 커서 저를 특정할 수 없고요.

    중복 투표도 불가능합니다.

    물론 이 방식에 동의할 사람은 말 그대로 아무도 없을 겁니다.

  14. dpkirchner HN

    자기 표를 볼 수 있는 한, 누군가 그 표를 보여 달라고 강제하거나 강요할 수 있습니다.

  15. vntok HN

    꼭 그렇진 않습니다. 예를 들어 기계가 투표 내용을 적은 용지를 출력해서 유권자에게 유리창 너머로 보여 줄 수 있습니다. 유권자는 다음 중 하나를 합니다.

    • 확인하면(용지가 투표함으로 내려가고) 기표소를 나갑니다

    또는

    • 취소하면(용지가 소각되고) 다시 투표합니다
  16. cryptonector HN

    그럼요, 유권자를 협박하는 사람이 이런 잔재주를 모를 테니까요. 유권자가 그렇게 못 하게 단속도 안 할 테고요. 암요, 그렇고말고요.

  17. cryptonector HN

    암호화폐는 대부분 가명 수준이고, 사실 그 정도도 못 됩니다. 비트코인은 잘 쳐줘야 가명 수준입니다.

  18. rustyhancock HN

    모네로와 지캐시가 유럽에서 금지되고 있는 데는 이유가 있습니다.

    저는 암호화폐 전문가라고 할 수는 없습니다.

    하지만 거래와 그 금액을 다른 거래들 사이에 숨기는 건 투표에 딱 맞습니다.

    제가 이해하기로 모네로는 링 서명을 써서 한 그룹 가운데 누가 거래를 시작했는지 알 수 없게 하고, 영지식 증명 체계 덕분에 그런 상황에서도 특정 거래가 유효하다는 걸 검증할 수 있습니다.

    비전문가인 제 생각에는 이 정도면 충분해 보입니다. 모든 표가 유효하다는 것(이중 지불이나 이중 투표가 없었다는 것)을 누구든 검증할 수 있습니다.

    특정 표를 누가 던졌는지는 많은 사람이 모인 풀 안에서 더 좁힐 수 없습니다.

    거래가 어디로 갔는지(누구에게 투표했는지)는 알 수 없습니다.

    동시에 저는 제 개인 키로 제 표를 볼 수 있습니다.

    투표에 필요한 건 전자여권 스타일의 게이트뿐입니다.

    물론 그냥 모네로를 쓰면 되는 문제는 아닐 겁니다. 투표에 맞는 시스템을 따로 설계해야겠죠.

  19. ifwinterco HN

    비트코인은 맞는 말이지만 모네로는 정말로 꽤 익명이에요.

  20. himata4113 HN

    투표의 실제 값을 복호화하는 논스(nonce)를 포함시킬 수도 있고, 강압에 취약한 사람들을 위한 대안을 제공할 수도 있습니다. 예시가 필요하다면 모네로 암호화폐가 그 정점입니다.

  21. andrepd HN

    아니면 이런 방법도 있죠. 들어 보세요. 사람들이 종이에 X 표시를 하고 접어서 잠긴 상자에 넣는 거예요. 상자는 각 후보와 정당의 대리인들이 항상 지켜보고요.

  22. resist_futility HN

    검증을 온라인이 아니라 직접 가서 하게 하면 됩니다. 공유할 방법이 없게요.

  23. cryptonector HN

    선거 관리 당국 사무소까지 직접 가야 할 텐데, 그러면 투표 검증 처리 용량이 감당이 안 되니 아주 소수만 할 수 있고, 실제로 하는 사람도 아주 적을 겁니다.

  24. bel8 HN

    그런데 브라질 정부는 자국 전자투표 시스템이 해킹 불가능하다고 하죠... 그래요.

    선별된 소수의 기관과 단체만 아주 통제된 환경에서 감사할 수 있고, 그마저도 보안을 모호함에 의존하고 있어서입니다. 소스 코드는 시민에게 공개되지 않습니다.

    혹시 제가 틀렸고 소스 코드 저장소를 아는 분이 있으면 알려 주세요.

    https://international.tse.jus.br/en/electronic-ballot-box/presentation

  25. johen8 HN

    우리 투표기를 둘러싼 기술적 논의가 정치 논쟁 때문에 완전히 망가진 게 안타깝습니다. 종이 기록 법안은 현행 시스템보다 분명히 나은 개선안인데, 안타깝게도(왜일까요?) 부결됐습니다.

  26. cryptonector HN

    놀랍게도 이 HN 글의 댓글에는 당파성이 거의, 아니 전혀 없네요. 꽤 반갑습니다. 브라질에서 벌어지는 논쟁을 말씀하시는 거겠죠. 그런데 몇 년 전만 해도 미국에서는 이 스레드가 여기서도 엄청나게 당파적이었을 겁니다.

  27. icantevenhold HN

    애초에 해킹 불가능한 건 없잖아요?

    적절한 균형점을 찾아야 하는 거죠.

    우리나라는 아직 종이 방식을 쓰는데, 조작하기는 아주 어렵지만 문제도 한가득이에요. 최근에는 투표용지 부족, 비정상적으로 긴 투표 줄, 엉뚱한 곳으로 배송된 투표용지, 심지어 일부 유권자가 투표를 못 하고 돌아간 일까지 겹쳐서 지방 선거를 다시 치러야 했어요. 이런 문제 중 상당수는 전자투표를 하면 사라지지만, 그러면 또 다른 문제가 생기죠.

    완벽한 해법은 존재할 수 없다고 봐요.

  28. josephg HN

    그런 문제는 선거관리위원회를 더 잘 꾸리면 풀 수도 있습니다. 여기 호주도 투표소에 줄이 길 때가 있긴 하지만, 그 밖의 문제가 생겼다는 얘기는 들어 본 적이 없어요.

  29. cryptonector HN

    종이 투표지에도 보안 문제는 분명히 있습니다. 다만 투표소가 많은 선거에서는 종이를 쓰면 선거를 조작하기가 더 어려울 뿐이죠.

    예를 들어 개표원이 손톱 밑에 연필심을 숨겨 두었다가 마음에 안 드는 투표지에 중복 기표를 해서 무효 처리되게 하거나 심사 대상으로 넘어가게 만들 수 있습니다.

  30. Thlom HN

    일부 상황에서는 선택지마다 투표용지를 따로 두는 방식으로 이 문제를 풀었습니다. 노르웨이에서는 기표소에 들어가 지지하는 정당의 투표용지를 골라 접고(겉모양은 전부 똑같습니다) 투표함에 넣습니다.

Hacker News에서 보기 ↗