匿名の投票システムを作成しようとしています。システムは、ユーザーがアイテムに投票したかどうか(公開情報)を追跡する必要がありますが、アイテムに投票したか反対したか(プライベート情報)を知ることができるのはそのユーザーだけです。
ユーザーは、一意の識別子とパスワードを使用してログインする必要があります。
すべてのデータとすべてのソフトウェアは、検査のために一般に公開されています。
構成員がどのように投票したかを発見するために人々が公開データベースをマイニングするのをどのように防ぎ、構成員がどのように投票したかを確認できるようにしますか?
暗号化:
復号化:
2つのハッシュされたパスワードインスタンスを想像します。1つは投票に適用されるAES暗号化パスワード用で、もう1つはユーザーの実際のパスワード用です。
認証の目的で、クライアントは実際のパスワードハッシュに使用するために2回繰り返されるパスワードのハッシュを送信する場合があります。攻撃者がAESで暗号化された投票を標的にするために使用できる情報が追加されるかどうかはわかりません。
システムには次の制約があります。
system は、ポリシーへの投票を伴います。ポリシーは匿名で送信され、モデレートの対象となり、「ライブ」になる前に十分なレピュテーション(StackExchangesなど)が必要です。投票はいつでも変更できるため、(何らかの方法で)支払いが行われた場合でも、支払い後に投票を切り替えないという保証はありません。ポリシーが制定されると、投票方法を確認できなくなります。
関連:
私が考えることができる最も簡単な方法は、各ユーザーに公開鍵と秘密鍵を割り当てることです。秘密鍵をパスワードで保護します。投票を開始したら、トークンごとにトークンとキーペアを生成します。トークンと秘密鍵を公開鍵で暗号化して、各ユーザーに1つのトークンを発行し、それが自分のトークンであることをユーザーだけが認識できるようにします。公開鍵とトークンを公開レコードとして保存します。ユーザーが投票に行くとき、ユーザーはトークンの秘密鍵を復号化し、投票して、トークンの秘密鍵で署名することができます。
ユーザー以外の誰もトークンが自分のものであると判断できず、そのトークンの秘密鍵(有効なユーザーのみが持っている)を保持せずにトークンを使用できるユーザーはいないため、システムは投票者がいつでも投票を変更できるようにします匿名性を維持しながら時間。
システムの核心はトークンの発行であり、投票者ごとに1つのトークンのみを発行し、秘密鍵またはユーザーに発行されたトークンの記録が保持されないようにする必要があります。あるいは、ユーザーの要求に応じてトークンを生成することもできますが、これにより、システムが追跡する必要があるため、トークンが作成されてユーザーに関連付けられた順序を調べて、どのトークンがどのユーザーに属しているかを推測できる攻撃が可能になります。ユーザーがトークンを要求した投票。
あなたが持っているレコードの観点から表現されます:(暗号化はEncrypt(key、data)として記述されます)
ユーザーレコード:userId、userPubKey、Encrypt(passwordDerivedKey、userPrivKey)
投票記録:eventId
投票レコード:eventId、tokenId、tokenPublicKey、Encrypt(tokenPrivKey、voteChoice)
UserTokenAssignment:userId、Encrypt(userPubKey、tokenId)、Encrypt(userPubKey、tokenPrivKey)
したがって、投票が開始されると、サーバーは各ユーザーのuserPubKeyを認識し、各ユーザーのトークン(投票)を作成できます。 userPrivKeyは、各ユーザーが自分の投票を決定するために必要であるため、匿名性が維持されます。ユーザーのみが投票に署名できるため、整合性が維持されます。ユーザーは投票(トークン)番号を知っているので、いつでも選択を変更できます。
1つの弱点は、データがアクティブに監視されている場合、変更がデータに表示され、トークンを識別できる可能性があることです。ただし、サーバーがプライベートに制御され、データとコードのみがパブリックである限り、ランダムな時間遅延を入れることでこの問題を防ぐことができます。
このタイプの問題に対する私のお気に入りの答えは、加法準同型暗号化です。
これは、簡単に言えば、E(a) + E(b) = E(a + b)のような暗号化関数E(m)です。 )。
Paillier cryptosystem を実装して、投票を集計することができます。これにより、個別に検証可能(私の投票は正しく、カウントされた)および公的に(すべての投票が正しくカウントされた)完全に匿名の投票が可能になります。
私はこれの既成の実装を知らないので、あなたはそれを最初から実装するでしょう、それは控えめに言っても複雑です。
電子投票システムは複雑で、匿名性(投票を投票者に関連付けることはできません)、検証可能性(集計の公平性はすべての参加者が検証できる必要があります)、二重投票の防止、「投票を販売」できないなど、多くの特性が必要です。 。暗号学者は、投票システムを実現するいくつかの方法を発見しました。
混合ネットワーク :投票をランダムに並べ替える一連のリレーノード。これにより、少なくとも1つのノードが正直である限り、すぐに匿名性が得られます。しかし、投票が行われなかったことを確認することは困難です(特に、誰も2回投票しなかったことを確認すること)。
準同型暗号化 :投票は暗号化された値であり、集計は数学の保護の下で行われます。最終結果は、グループ復号化で復号化されます(復号化キーは、この単一の復号化に協力する複数のキー所有者に分割されます)。
Helios Voting は、準同型暗号化プロトコル(ElGamalを使用)のよく知られた実装です。その ドキュメント を参照してください。 国際暗号学会 定期的にその ディレクター をHeliosVotingを使用して選出します。
読む この紹介 。
Prove を使用すると、各ユーザーに暗号化トークンをプロビジョニングして、匿名でWebサイトに応答を投稿させることができます。
暗号化とデータ転送はWebブラウザーに統合されていないため、Webベースのシステムにするには、ユーザーに代わってUProveトークンをホストするための中間体が必要になります。
このテクノロジーは広く採用されておらず、情報はまばらですが、 テクノロジーの概要 を読むと、それが多くの懸念に対処していることがわかります。
AESとプロトコルについての推測を楽しんでいるようですので、 このビデオではUProveの技術的な内部動作について説明しています。 聞いてみることを強くお勧めします。