Giter VIP home page Giter VIP logo

urnacripto's Introduction

UrnaCripto

Um protocolo de referendos online criptograficamente seguro, onde um grupo de eleitores autorizados emite, secretamente, sua opinião sobre um tópico específico, chegando a um resultado que é matematicamente incorruptível, de forma independentemente verificável.

Motivação

Em um país que faz da democracia seu pilar fundamental, torna-se necessária a existência de um sistema de eleição impecavelmente seguro. Nosso sistema atual não satisfaz essa condição, pois sua segurança depende da capacidade de nossos governantes de tornar "a urna" inviolável. Grandes empresas como o Google, a Apple, e até mesmo bancos são invadidas frequentemente. Seria, portanto, ingenuidade acreditar que nossas urnas são imunes. De fato, existem numerosas acusações do contrário:

Indiferente à validez dessas acusações, a lição histórica torna claro que impedir a sabotagem de sistemas eletrônicos é praticamente impossível. No modelo UrnaCripto aqui proposto, e graças a recentes avanços no campo da criptografia, é possível que cada eleitor tenha não somente convicção, mas provas irrefutáveis de que todas as características necessárias para se chegar ao resultado final foram honradas, inclusive a ausência de votos duplicados, a inviolabilidade do voto secreto, a imunidade contra invasões e a exatidão da contagem final.

Funcionamento

O protocolo funciona em 4 etapas, todas executáveis por cada eleitor de forma independente, transparente e distribuída, através de aplicativos de código aberto instalados em seus respectivos celulares, computadores, ou em urnas locais, sem a existência de um servidor central com qualquer tipo de informação sigilosa.

  1. Emissão de título

Todo eleitor interessado em participar de um referendo emite (preferencialmente desconectado da internet, em um computador de confiança), utilizando uma implementação de gen, conforme proposta em [1], um par de chaves pública/privadas de um grupo cíclico de ordem prima p previamente combinado para qual o problema do logarítmo discreto seja conjecturalmente difícil. Este eleitor divulga a chave pública e guarda a chave privada em local seguro.

  1. Criação de um referendo

Para criar um referendo, todas as partes envolvidas concordam em um "id", um "título", uma "proposta", uma "lista de opções" e uma "lista de eleitores autorizados" (chaves públicas). Estas informações são então publicadas em um meio de comunicação comum, podendo ser este, sem perda de segurança, um ou mais servidores centrais.

  1. Votação

Cada eleitor assina, utilizando a função sign, também proposta em [1], uma mensagem declarando sua intenção de votar em determinada opção, em nome da "lista de eleitores autorizados" previamente concordada. Ele, então, divulga essa assinatura neste meio de comunicação comum.

  1. Contagem

Passado um tempo após o término do referendo, cada eleitor opta ou por realizar uma contagem independente de votos, ou por aceitar a contagem realizada por alguma parte de sua confiança. Para realizar uma contagem independente, um eleitor deve:

  1. Reunir os votos assinados divulgados na etapa 3;

  2. Utilizar a função verify, também proposta em [1], para remover votos que não vieram de eleitores autorizados;

  3. Utilizar a função link, também proposta em [1], para desqualificar eleitores que votaram mais de uma vez;

  4. Realizar uma contagem simples das opções declaradas nos votos restantes.

Essa contagem final é, de forma irrefutável, o verdadeiro resultado do referendo. Não somente, devido à natureza das assinaturas de anel encadeadas, essas informações são insuficientes para determinar o voto de cada parte, estabelecendo o voto secreto. Finalmente, como o sistema trabalha exclusivamente com informações públicas, qualquer tentativa de "invasão" é naturalmente inofensiva.

Implementação

  • As funções gen, sign, verify e link, conforme propostas em [1], foram implementadas em PureScript, no repositório github.com/maiavictor/lrs.

  • Uma interface web, disponível neste repositório, foi implementada em React, de modo a facilitar a interação do usuário final com as devidas funções criptográficas.

  • Um servidor web, disponível neste repositório, foi implementado em Node.js/Express, fornecendo uma API Rest que faz o papel de meio de comunicação comum.

Um demo do resultado está atualmente disponível neste link.

Referência

[1] Liu, Joseph K.; Wong, Duncan S. (2005). "Linkable ring signatures: Security models and new schemes". ICCSA. 2: 614–623. doi:10.1007/11424826_65.

urnacripto's People

Contributors

victortaelin avatar

Watchers

James Cloos avatar Lucas avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.