当前位置:   article > 正文

基于区块链和门限密码的安全投票系统(Python+Django+Node+web3+SQLite3)_基于密码学的投票

基于密码学的投票

目录
摘要 I
Abstract I
第一章 绪论 1
1.1 课题研究背景与意义 1
1.2 国内外研究现状 3
1.3 本文的内容 8
1.4 结构安排 10
第二章 相关知识与技术 11
2.1 区块链相关知识 11
2.1.1 区块链 11
2.1.2 以太坊 15
2.2 密码学相关知识 18
2.2.1 代数学知识 18
2.2.2 ElGamal密码体制 18
2.2.3 安全多方计算 20
2.2.4 门限密码体制 22
2.2.5 可验证秘密共享协议VSS 22
2.2.6 同指数零知识证明SEZ 23
第三章 安全的电子投票方案 24
3.1 电子投票的流程 24
3.2 电子投票的安全性分析 25
3.3 改进的协议 25
3.3.1 门限盲签名协议TBS 26
3.3.2 可验证的门限解密协议VTC 27
3.4 符号说明 29
3.4.1 安全性假设 29
3.4.2 实体与符号 29
3.5 投票过程概述 30
3.6 投票过程详情 31
3.6.1 准备阶段 31
3.6.2 密钥共享阶段 32
3.6.3 签名阶段 32
3.6.4 投票阶段 32
3.6.5 计票阶段 32
3.7 安全性与性能分析 33
3.7.1 安全性分析 33
3.7.2 性能分析 34
3.7.3 性能改进 35
第四章 系统设计 36
4.1 需求分析 36
4.1.1 参与人员分类 36
4.1.2 用例表格 37
4.1.3 非功能需求 40
4.2 总体设计 40
4.2.1 系统框架 41
4.2.2 接口设计 43
第五章 系统实现 45
5.1 环境搭建 45
5.2 基本算法 45
5.3 详细设计 47
5.3.1 管理模块设计 47
5.3.2 密钥共享模块设计 49
5.3.3 投票模块设计 49
5.3.4 计票模块设计 52
5.3.5 查询模块设计 54
5.4 实验分析 55
5.4.1 门限性能分析 56
5.4.2 智能合约gas分析 57
第六章 总结与展望 58
6.1 总结 58
6.2 展望 58
参考文献 59
致谢 66
1.3 本文的内容
1992,Fujioka等[17]提出一种大规模选举的盲签名投票方案(FOO),并提出7个电子投票安全性标准。方案包括6个阶段。
1.准备阶段:投票者Vi选择vi,加密得到xi=enc(vi,ki),其中ki是随机值,enc()是加密算法。xi’=binde(xi,r)。e是认证机构A的公钥,r是一个盲化因子。si=Signi(xi’)是Vi自己的签名,其中Sign()是签名函数。
2.管理阶段:投票人将(xi’,si)发送给A。A签名得到di=SignA(xi’),发送签名di给Vi,且公布IDi,xi’,di
3.投票阶段:投票人使用去盲函数undblind()得到yi=unblind(di,r),yi是A关于xi的签名,将(xi,yi)以匿名的方式发送给计票机构C
4.收集阶段:C验证xi,yi,并公布l,xi,yi.其中l是(xi,yi)在列表中的序号
5.公开阶段:Vi查看A与C公布的信息,以匿名的方式发送(l,ki)给C
6.计票阶段:C解密得到vi并计数,并公开l,xi,yi,ki,vi
3.1 电子投票的流程
一般来说,完整的电子投票主要经过准备阶段、认证阶段、投票阶段和计票阶段等4个阶段。
在这里插入图片描述

图3.1电子投票流程图
图3.1表示投票流程的完成需要多方协作。投票人是投票的主体,认证机构向投票人发放投票凭证,管理员负责设置环境参数,计票员唱票并宣布获胜者,甚至还有仲裁机构参与处理选举纠纷问题。总体上投票过程如下。准备阶段:管理员在电子公告板(Bulltine Board)上发布安全参数等环境参数,发布候选人列表,设置各阶段时间节点等信息(步骤1);认证阶段:投票人提供身份证明信息,经认证机构验证成功后,获得合法的投票凭证或签名(步骤2-3);投票阶段:投票人加密候选人选项后连同凭证或签名发送给公告板,并从公告板上核实选票已正确添加(步骤4-5);计票阶段:投票结束后,计票员解密选票,统计各侯选人得票数,并且在公告板上发布选举结果(步骤6-7)。
将投票划分为4个阶段不是绝对的,在实际系统设计中,各阶段的可能没有清晰的分界线,根据需要,多个阶段可以整合,某个阶段也可以再细分。

# -*- coding:UTF-8 -*-
"""
运行时间检测
"""

from .alg.ECC import *
from .alg.shamir import FVSS
from .vote_role import *
import datetime
import random
import pickle
# from database import models
#p=79432034159157298566448255051786468940817438396448206020190420091586587025641
#投票人数L
VN=1000000
candidate_list=[1,VN]
vote_num=1
SA_n=3
SA_t=2
TA_n=3
TA_t=2
def save(var):
    
    """ with open('text.txt', 'wb') as file:
        pickle.dump(var, file) """
    var_pkl = pickle.dumps(var)
    state=models.Dictionary.objects.filter(name="state")
    if state.exists():
        if state.first().value != var_pkl:
            state.update(value=var_pkl)
    if state.exists() == False:
        state.create(name = "state",value = var_pkl , description = var)
    



def read():
    """ with open('text.txt', 'rb') as file2:
        var2 = pickle.load(file2)
    return var2 """
    state=models.Dictionary.objects.filter(name="state")
    assert state.exists() , "数据不存在!"
    var = pickle.loads(state)

 
def test1():
    state=State()
    save(state)
    state=read()
    state=interface_SA_key_share(state,SA_n,SA_t)
    save(state)
    state=read()
    state=interface_TA_key_share(state,TA_n,TA_t)
    save(state)
    state=read()
    for i in range(vote_num):
        state,vote=interface_choose_candidate(state,SA_n,SA_t,random.choice(candidate_list))
        save(state)
        state=read()
    state,vote=interface_calculate_signature(state,vote)
    save(state)
    state=read()
    state,subkey=interface_send_subkey(state,TA_n,TA_t)
    save(state)
    state=read()
    interface_tally_result(state)



def test2():
########################################密钥分配过程#######################
    state = State()
    state_db = state.blockchain
    sa=State(state_db).SA()
    state_db = state.blockchain;sa_db = sa.db
    ta=State(state_db).TA()
    state_db = state.blockchain;ta_db = ta.db
 #################################################签名过程#################
    voters=[]
    for i in range(1):
        
        r=sa.choose_k() #发送r
        voters.append(State().Voter(4,3))
        e=voters[i].send_param(r,vote=random.choice(candidate_list))#发送e  
        s=sa.send_SK(e)#发送s
        assert voters[i].verify(s)#投票人验证s
        vote=voters[i].compute_S(s)#投票人计算签名
############################################投票过程#######################
    contract_vote=State().ContractVote()
    assert contract_vote.verify_votes()#投票合约验证签名
#########################################计票过程##########################
    #begin1=datetime.datetime.now()
    contract_tally=State().ContractTally(4,3)#计票合约初始化时,进行同态加密
    #end1=datetime.datetime.now()
    
    ta.send_SK()#计票机构发送密钥
    
   # begin2 = datetime.datetime.now()
    contract_tally.verify_TA()#验证计票机构
    M=contract_tally.compute_plain()#计票合约计算解密总和
    #end2 = datetime.datetime.now()
    
    contract_tally.tally_result(M)#计票合约计算结果
    #return end1 - begin1



def test4():
    state = State()
    state.set_SAParam(3,2)
    state.set_TAParam(4,3)
    state_db = state.blockchain
    sa=State(state_db).SA()
    state_db = state.blockchain;sa_db = sa.db
    ta=State(state_db).TA()
    state_db = state.blockchain;ta_db = ta.db
#######
    state = State(state_db)
    sa=state.SA(sa_db)
    r=sa.choose_k() #发送r
    voter = state.Voter()
    
    e=voter.send_param(r,vote=random.choice(candidate_list))#发送e  
    s=sa.send_SK(e)#发送s
    assert voter.verify(s)#投票人验证s
    vote=voter.compute_S(s)#投票人计算签名
    state_db = state.blockchain;sa_db = sa.db;voter_db=voter.db
#######
    state = State(state_db)
    contract_vote=state.ContractVote()
    assert contract_vote.verify_votes()#投票合约验证签名
    state_db = state.blockchain
######
        #begin1=datetime.datetime.now()
    state = State(state_db)
    contract_tally=state.ContractTally()#计票合约初始化时,进行同态加密
    #end1=datetime.datetime.now()
    ta = state.TA(ta_db)
    ta.send_SK()#计票机构发送密钥
    
   # begin2 = datetime.datetime.now()
    contract_tally.verify_TA()#验证计票机构
    M=contract_tally.compute_plain()#计票合约计算解密总和
    #end2 = datetime.datetime.now()
    
    contract_tally.tally_result(M)#计票合约计算结果
    #return end1 - begin1

def runedTime():
    
    begin = datetime.datetime.now()
    test4()
    end = datetime.datetime.now()
    return end-begin
print(runedTime())
#test4()
#print(SA_n)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/717303
推荐阅读
相关标签
  

闽ICP备14008679号