审查远程电子投票系统的加密协议

在本文中,我们将分析远程电子投票系统的加密协议的实现细节。



在选举过程的各个阶段使用加密机制和算法为远程投票系统提供了必要的属性。让我们仔细研究一下概述文章中描述的投票阶段



系统初始化。在投票初始化阶段,将执行以下加密操作:



  • 开发用于发布和验证盲签名的验证者密钥对,这是学术界对于电子投票系统中匿名程序的最持久和最推荐的方法。目前,该系统支持基于RSA加密算法的椭圆曲线上的盲签名算法。使用基于RSA加密算法(密钥长度为4096位)的用于发布和验证盲签名的算法进行投票。
  • 共享公共加密密钥的生成。为了提高安全性,在密钥生成过程中立即使用了两种加密算法:DKG Pedersen 91分布式密钥生成协议和Shamir密钥共享协议。密钥生成既可以由具有直接控制网络节点和计数服务器的技术手段的参与者进行,也可以由作为记录在外部媒体上的密钥保存者的参与者进行。这两种算法的工作结果是用于加密选票的公共公用密钥。接下来,我们将仔细研究生成此密钥的过程。


提供对新闻通讯的访问在此阶段,以下机制起作用:



  • 根据GOST R 34.10-2012在选民设备上生成电子签名的密钥对
  • 为选民的带遮罩的公共密钥生成盲签名以进行认证,并随后验证其参与投票的权利。该机制当前基于RSA加密算法。在另一篇文章中详细讨论了匿名化机制。


填写并发送新闻通讯在此阶段,使用以下密码算法集:



  • 根据ElGamal方案对新闻通讯进行椭圆曲线加密。该方案在协议中使用,因为它还具有同态性,这使得无需解密每个选票即可获得投票结果。
  • Chaum-Pedersen取值范围证明用于证明选票内容的正确性而不对其进行解密。我们将在下一篇文章中详细分析这种机制。
  • 符合GOST R 34.10-2012的加密公告的电子签名。


计算总数。在总结结果的阶段:



  • 加密选票的同态加法。
  • 参与者通过控制各个节点并计数服务器并从每个参与者接收密文,对部分私钥进行的最终汇总选票进行初步的部分解密;
  • 在选举委员会中组装私钥,并使用所收集的密钥对最终汇总的选票进行部分解密。
  • 密文的最终求和和计数结果的接收。
  • Chaum-Pedersen零知识证明的生成和验证。用于证明最终汇总选票解密的正确性。我们将在下一篇文章中详细分析这种机制。


审核在此阶段,可以执行协议所有阶段的验证检查,在本文中,我们将仔细研究可能的检查。



让我们仔细看看密码机制。



区块链平台



在讨论生成密钥的过程之前,您需要对区块链平台的实现进行介绍。



下图显示了区块链平台的简化目标布局。







区块链节点的放置和保留在PJSC Rostelecom的地理分布数据中心内进行。在这种情况下,可以将涉及存储所有投票数据的“原子性”组件的职责分配给选举委员会或各种公众观察机构。



这样做是为了为参与者提供控制系统和网络节点的主要组件的机会,同时又不解决信息安全,技术手段的部署和操作以及确保系统的可伸缩性问题的解决方案。



参与者的列表会随着时间的变化而变化-从将系统启动到工业运营阶段的最小参与者,到随着系统的发展而相当分散且完全分散的参与者。在这种情况下,总是有可能在数据中心外部放置一组组件。



国内解决方案Waves Enterprise被用作区块链平台。交易和区块按照GOST R 34.10-2012签名。



生成加密密钥



投票加密的公共密钥使用两种加密算法生成:DKG Pedersen 91分布式密钥生成协议和Shamir密钥共享协议。基于这些算法中的每一个,都会生成一个“中间”公钥。然后,将这两个密钥组合为一个公用密钥。



按键组装图如下图所示。







通常,这种方案似乎是多余的,但这是我们在投票结束前可以获得最大程度机密性的方式。这是由于以下事实:使用DKG协议生成的私钥永远不会以组装形式放在一个地方,并且在生成之前或之后都不会被恶意窃取,并且其部分由独立的方拥有,这些方仅通过区块链相互交互。



但是,如果您无法集合法定人数,则blokcheyn-network例程会开始在独立的各方之间分离密钥,这些各方是要记录到外部媒体(委员会的密钥)的密钥各个部分的监护人



,在投票前夕开始进行公用公共密钥加密的过程从而使委员会可以对该过程开放...在投票开始前的某个时间点,当观察者和记者在没有连接到本地网络或Internet的安全笔记本电脑上时,使用特殊工具生成密钥对,然后将私钥分为n1部分并将其记录在特殊媒体上。选举委员会根据其决定来确定私钥部分的载体。在创建和初始化投票的阶段,该委员会的公钥将记录在区块链中。



然后开始在区块链网络中创建投票。在计数服务器上创建投票后,将自动开始生成DKG公钥过程。



分布式密钥生成过程的参与者是n个投票计数服务器,我们在前面的评论文章中已对此进行了介绍。计数服务器之间的所有交互操作(中间和最终)都记录在区块链中,因此是透明且可验证的。该系统实现了“ k个n个”阈值方案,即在解密数据时,不需要形成公钥DKG的所有n个参与者的参与,参与者k的数量较少就足够了。即使nk个计数服务器不可用或它们的私钥已丢失,这也可以解密投票结果。



为了生成公共密钥,使用了DKG(分布式密钥生成)算法,该算法在Torben Pryds Pedersen的“无受信方的阈值密码系统”一文中进行了描述,并转移到椭圆曲线上。假定每个服务器都有一个常数(由注册服务商在会计中记录)Diffie-Hellman密钥对,用于安全地向该服务器传输数据(密钥共享的导出/导入)。



协议参数



  • 椭圆曲线E和该素数为q的大曲线的子组的生成器P。当前的实现使用secp256k1曲线
  • 同一子组的另一个生成器Q,其值 x:Q=xP 任何人都不知道。
  • (k,n),其中n是生成密钥对的参与者总数,k是恢复共享机密所需的最小参与者数,而 k(n+1)/2... 也就是说,如果k-1位参与者受到威胁或他们的密钥被盗,这将不会以任何方式影响共享机密的安全性。




通常,用于获取点Q的算法如下:采用任何字节序列,例如,字符串“ Hello,World!”,而哈希h = Hash(“ Hello,World!”考虑 x0=hmodp,其中p是曲线的模数,我们用 x0 进入曲线方程: y2=x03+ax0+bmodp并尝试解决关于y的问题。在没有解决方案的情况下,我们增加x0并再次尝试求解方程以得到x0的新值,依此类推。



步骤0。

为n台服务器中的每台服务器分配一个从1到n的唯一序列号。这是必需的,因为拉格朗日系数取决于服务器序列号。



第1步-创建公钥DKG。



每个第j个服务器,j = 1,...,n:

1.生成一对私钥〖priv〗_j和一个公钥Pubj=privjP.

2.对公钥做出Pedersen承诺:

生成一个随机数r_j

计算一个点Cj=rjQ+Pubj

Cj使用计量器

3发布。在所有服务器发布了其C_i值之后,将发布标量r_j。



使用标量,任何人都可以恢复每个服务器的公钥Pubj=CjrjQ 并计算公钥DKG Pub=(j=1)nPubj...

公钥DKG已写入区块链。



第2步-生成多项式并分布阴影。



每个第j个服务器,j = 1,…,n:



1.生成度为k-1的随机多项式:

fj(x)=f(j,0)+f(j,1)x++f(j,k1)x(k1),

系数在哪里 f(j,0)=privj,其余为字段GF(q)的随机元素。



2.计算多项式的值fj(i),i=1,,n,ij.



3.加密值 fj(i)使用公共导出/导入密钥,每个i的第i个服务器,并使用计量器发布加密结果。



步骤3-检查多项式的系数。



每个第j个服务器,j = 1,...,n:



1.发布其多项式的每个系数乘以生成器P。

F(j,0)=f(j,0)P,F(j,1)=f(j,1)P,,F(j,k1)=f(j,k1)P

2.解码所有含义 fi(j),i=1,..,n,ij并检查其正确性:

计算A=fi(j)P

计算总和

如果A = B,则结果被接受,否则对服务器i发布投诉,并且协议从一开始就开始-转到步骤0。3

.如果没有人投诉,则计算其私钥,







可以恢复公钥DKG 并根据点票服务器在投票发起阶段写入区块链的数据进行验证。必须获取所有解密的公钥点并将其添加。结果将是在区块链中记录的与公钥DKG相同的值。



进一步,根据加载到系统中的佣金公钥和计数服务器的公钥,根据以下公式生成公共的公共加密密钥:



MainPubKey =哈希(PubDKG,PubCommission)* PubDKG +哈希(PubCommission,PubDKG)* PubCommission



所有公共密钥连同中间计算都被写入区块链,以方便观察者检查。显示时事通讯时,将从区块链读取共享的公共加密密钥,并将其传输到用户的设备。



公告加密方案的说明



以下是在椭圆曲线上使用El-Gamal方案加密选票的过程的说明。



椭圆曲线上的El Gamal加密方案允许实现相对于加法的同态加密,其中,由于对密文进行加法运算,因此获得了原始值的加密总和。



加密(A)+加密(B)=加密(A + B)。



为了使用算法的这一特性,完整的电子选票用零和一的字符串表示。字符数与选择数相对应,而选择的一个由一个表示,其他选择由零表示。



在椭圆曲线上使用ElGamal算法时,私钥的长度选择为256位,而公钥是椭圆曲线上的一个点。这对应于128位的安全级别(破解需要2 ^ 128个曲线点操作)。对于大多数现代工业和金融系统,包括俄罗斯标准GOST 34.10-2018“信息技术。加密信息保护。 “电子数字签名的形成和验证过程”(256位版本)。



Secp256k1用作椭圆曲线。



假设我们有一个密钥对priv,Pub:

数字priv:0 <priv <q

点Pub = priv *基本



加密:



  • 有一条消息m,我们要在Pub密钥上对它进行加密。
  • 计算点M = m *基数
  • 生成随机数r:0 <r <q
  • 计算点R = r *基点和点C = M + r * Pub
  • 密文:(R,C)


解密:



  • 有一个私钥priv和密文(R,C)
  • 计算点M = C-私人*基数
  • 重构m:通过蛮力ECDLP解决M = m * Base


方案同态。



我们看到如果我们加密两个消息M1=m1BaseM2=m2Base 在Pub键上:

(R1,C1)=(r1Base,M1+r1Pub)

(R2,C2)=(r2Base,M2+r2Pub)



然后他们的总和 (R1+R2,C1+C2) 匹配加密的消息 M1+M2...



因此,所有选票都可以加密并“逐个候选人”折叠。例如,让一个开放的公告看起来像这样:



Ivanov Petrov Sidorov



0 1 0




然后,将其转换为点,我们得到:



Ivanov Petrov Sidorov



ZeroPoint基本ZeroPoint



,其中ZeroPoint是无穷大的点。



最后,我们加密发布密钥上的新闻稿:



Ivanov Petrov Sidorov



(r1Base,r1Pub) (r2Base,Base+r2Pub) (r3Base,r3Pub)



假设我们已经与N个选民进行了这样的投票。如果对于Ivanov,Petrov和Sidorov,我们分别添加来自不同选票的密文,那么我们将获得摘要选票,其中包含每个候选人的加密金额。可以使用解密密钥对摘要投票进行解密,并且可以找到每个候选人的投票结果。



下图显示了基于零知识证明的同态选票堆叠和验证方案。







从图中可以看出,潜在的攻击者无法通过在密码协议级别加密不正确的数字来“投掷”额外的选票。这是使用零知识证明来实现的,本文稍后将对此进行讨论。此外,必要的检查还可以在选民的Web应用程序中实现。



解密程序说明



根据El-Gamal方案,由于同态加密,对选票进行了计数而没有解密,从而可以保证整个投票程序和每个单独选票的机密性。同样,所有服务器都没有能力独立和秘密地解密投票结果。



为了解密密文(R,C),n个服务器中的k个必须计算并发布该值sjR 以及Chaum-Pedersen解密正确性的证明(证明 sjR 恰好是R点乘以 sj没有透露含义 sj)。同样,为此,有必要从t1个部分的至少k1个中收集佣金的私钥,并在其帮助下执行计算sjR发布到区块链。







解密分为多个阶段,每个阶段的结果都记录在区块链中。



第一步-部分解密。系统的N个服务器中的每个K个都添加投票的密文,接收摘要投票,并从其自身解密私有投票密钥。此操作的结果将是一个密文,将其与在其他计数服务器上执行的相同操作所获得的密文以及在佣金的私钥上获得的密文相结合,将得到解密的最终结果。重要的是要注意,如果通过佣金的私钥解密没有获得任何密文,则所有其他密文将变得无用。他们不可能获得任何结果。



运算结果将发布在区块链上。



第二阶段-组装委托的私钥,并对摘要投票进行部分解密。此操作在没有Internet连接的特殊PC上执行。收集密钥后,将进行前一段所述的操作,以在委托密钥上形成密文。该操作的结果也记录在区块链中。



第三阶段是最终解码。投票计数服务器汇总来自N个服务器的结果K,并将解密结果存储在佣金的私钥上,并产生最终的解密,然后发布投票结果。



请注意,存在在委员会的私钥上生成的密文是先决条件。没有它,就不会计算结果。



根据部分解密的已发布结果,任何感兴趣的方都可以重复该过程,并验证结果是否正确计数。



零知识证明



尽管在软件和基础结构级别保护了DEG系统免受入侵者和用户错误的侵害,但在加密协议级别保护了DEG系统,但提供了其他数学证明和检查,不允许将虚假信息传输到系统。为此,已经基于非交互式零知识证明(NIZK)开发了几种机制。



系统中应用的第一种ZKP(零知识证明)是范围证明。 ZKP数据在发布加密选票时使用,因此,在没有有关选民如何投票的信息的情况下,可以确保选民不会以下列方式之一破坏选票在其设备上的位置:



  • 参与者没有为单独的投票选项在投票中加密大于一个的值,这在“加密加法”的情况下会影响投票结果;
  • 除填写投票程序所规定的以外,参加者对投票中的每个问题最多只能选择一个选项。


NIZK的实现及其验证的更详细说明将在另一篇文章中讨论。



区块链中的记录结构



区块链中的所有信息均通过三种交易记录:



  • CreateContract-为特定投票创建智能合约。此外,在此智能合约中,将汇总所有有关投票的信息。如果同时有两个(或更多)票,则分别创建两个(或更多)合同副本。
  • CallContract-用于与智能合约进行各种操作的交互,其列表如下。
  • 数据交易-用于在创建投票智能合约的实例之后并开始投票之前记录投票者列表。


通过以下操作与智能合约进行交互:



  • 将基本数据写入智能合约。这里将存储将参与加密协议的计数服务器的公共密钥,阈值方案,盲签名验证密钥以及其他通常用于组织协议和投票所需的数据。
  • dkgScalar,dkgCommit,dkgShadows-建立用于加密选票的公钥并实现n个方案的阈值k所需的数据。我们将在本文后面详细讨论。
  • addMainKey – .
  • blindSigIssue – .
  • vote – .
  • finishVoting – . .
  • Decryption – . .
  • ComissionDecryption – .
  • Results – . , .


选民的投票交易包括选民的区块链地址和公钥,加密的选票,盲目签名以及在选民的匿名私钥上生成的电子签名(请参阅先前发表的有关匿名的文章)。



下图显示了区块链客户端中带有语音的交易显示。











有关投票的所有信息均汇总在智能合约上,并将通过区块链客户端提供给观察者,也可以以csv文件的形式提供给任何人。



下图显示了智能合约中汇总信息的显示。





*来自测试服务器的数据。



Waves Enterprise平台的功能允许您使用状态模型,盲目签名验证以及计算有效和损坏的选票来实施相当复杂的逻辑。



加密协议和投票过程检查



可以使用区块链平台和区块链客户端进行的第一项基本检查是检查选民名单上的选民人数是否与发行的选票数量和记录的选票数量相匹配。



检查计数的正确性是通过观察员重复计数服务器的工作来总结候选人的加密选票。通过依次添加与每个候选项相对应的椭圆曲线的点来完成此操作。



然后,使用接收到的加密摘要公告和发布在区块链上的正确解密证明,可以检查每个计数服务器执行的求和和部分解密的正确性。



在这一阶段,很清楚观察者接收到的加密量是否对应于每个计数服务器记录的内容。



之后,您可以检查投票结果解密的正确性。为此,您需要从事务类型为Decryption和CommissionDecryption的事务中获取密文,并与选票类似,为每个候选者添加椭圆曲线的点。



加密操作的源代码在此GitHub存储库中可用



All Articles