【1】系统介绍
① 背景
随着数字化转型的推进,电子投票系统越来越受到重视。传统的纸质投票方式不仅效率低下,而且容易遭受人为因素的干扰。电子投票系统虽然提高了投票的便利性和效率,但也面临着数据安全和隐私保护的重大挑战。同态加密技术作为一种可以在加密状态下直接对数据进行运算的方法,为电子投票系统提供了一种安全可靠的解决方案。通过使用同态加密,投票者可以在不泄露个人信息的前提下进行投票,同时保证投票结果的真实性和完整性。
② 研究目的与意义
研究目的:
- 设计并实现一个基于Python的同态加密电子投票系统。
- 保障投票者的隐私安全,防止投票数据被篡改。
- 确保投票结果的准确性和不可抵赖性。
研究意义:
- 为电子投票系统提供了一个安全可信的技术框架。
- 促进了电子政务和民主进程的发展。
- 为未来的选举和民意调查提供了可靠的技术支撑。
③ 研究内容
-
同态加密技术研究
- 同态加密原理及其在不同场景下的应用。
- 现有的同态加密算法比较与选择。
-
系统架构设计
- 系统总体架构设计,包括客户端、服务器端和数据库等组成部分。
- 系统的安全机制设计,如身份验证、数据加密传输等。
-
同态加密算法实现
- 选择适合的同态加密算法,并使用Python进行实现。
- 测试算法的性能,包括加密解密速度、内存占用等。
-
投票流程设计
- 设计投票流程,包括注册、投票、计票等环节。
- 确保投票流程的安全性和用户友好性。
-
系统集成与测试
- 将同态加密算法集成到投票系统中。
- 进行系统功能测试、性能测试和安全性测试。
-
案例分析与评估
- 分析真实世界中的投票案例,评估系统的实际表现。
- 根据反馈结果进行系统优化。
本文提出了一种基于Python的同态加密电子投票系统。该系统利用同态加密技术实现了投票过程中的数据加密和隐私保护,确保了投票的公正性和透明性。研究首先分析了同态加密技术的原理及其在电子投票领域的应用潜力,并选择了合适的同态加密算法进行实现。接着,设计了系统的架构和投票流程,并使用Python进行了系统开发。
最后,通过一系列测试验证了系统的功能和性能。实验结果表明,该系统能够有效保障投票者的隐私安全,同时保证投票结果的真实性和准确性,为电子投票系统的安全实践提供了一个可行的解决方案。
④ 技术与环境
数据库:MySQL8
数据库操作:Navicat12
包依赖管理:pip
后端开发环境:pycharm2021 python3.8
后端框架:flask
页面部分是 html5+js+css+layui
图表可视化:echarts
同态加密算法:LightPHE
路由跳转:Blueprint
【2】同态加密算法
LightPHE(Light Partially Homomorphic Encryption)是一种轻量级的部分同态加密算法,它主要用于在加密状态下进行特定类型的数学运算。部分同态加密允许对加密数据执行某些特定的运算(如加法或乘法),并且这些运算的结果在解密后仍然保持正确的数学关系。
LightPHE的原理介绍
1. 加密和解密原理
LightPHE通常基于以下基本原理:
- 公钥加密:使用公钥对明文进行加密,生成密文。
- 私钥解密:使用私钥对密文进行解密,恢复原始明文。
2. 同态性质
- 加法同态:如果两个明文 ( m_1 ) 和 ( m_2 ) 分别被加密为 ( c_1 ) 和 ( c_2 ),那么在加密域中进行的加法运算 ( c_1 \cdot c_2 ) 的结果再解密后等于 ( m_1 + m_2 )。
- 乘法同态:在某些同态加密算法中,加密后的数据还可以支持乘法运算。
LightPHE通常只支持加法同态或乘法同态中的一种,这意味着它只能支持在加密数据上执行加法或乘法运算,而不能同时支持这两种运算。
3. 具体实现
LightPHE的实现通常涉及以下步骤:
- 密钥生成:生成一对公钥和私钥。
- 加密:使用公钥对明文进行加密。
- 解密:使用私钥对密文进行解密。
- 同态运算:在加密数据上执行同态运算。
使用LightPHE
1. 库的选择
在Python中,您可以使用现有的同态加密库来实现LightPHE。例如,Pyfhel
是一个流行的同态加密库,支持多种同态加密算法,包括部分同态加密。
2. 安装库
首先,您需要安装Pyfhel
库。可以通过pip安装:
pip install pyfhel
3. 示例代码
下面是一个简单的示例,展示如何使用Pyfhel
实现加法同态加密:
from pyfhel import Pyfhel, PyCtxt
# 初始化同态加密环境
HE = Pyfhel()
HE.contextGen(p=19, m=1024, base=2) # 设置参数
HE.keyGen()
# 加密数据
plaintext_a = 5
plaintext_b = 7
ciphertext_a = HE.encryptInt(plaintext_a)
ciphertext_b = HE.encryptInt(plaintext_b)
# 在加密数据上执行同态运算
ciphertext_result = ciphertext_a * ciphertext_b # 注意这里的*表示同态乘法
# 解密结果
result = HE.decryptInt(ciphertext_result)
print(f"Encrypted result: {result}")
# 验证结果
assert plaintext_a + plaintext_b == result, "The homomorphic operation failed."
请注意,上面的示例使用了乘法运算符 *
来表示同态加法运算。这是因为Pyfhel
库使用乘法同态运算来实现加法同态运算。如果您需要支持加法同态运算,应根据具体库的文档来确定如何实现。
4. 注意事项
- 性能考虑:同态加密通常涉及复杂的数学运算,可能会导致较高的计算开销。
- 密钥管理:必须妥善管理公钥和私钥,特别是私钥,以防泄露。
- 安全考虑:选择合适的参数和配置,确保加密强度满足安全要求。
结论
LightPHE提供了一种在加密数据上执行特定数学运算的能力,这对于保护敏感数据的同时又能进行必要的计算非常有用。通过使用像Pyfhel
这样的库,您可以方便地在Python中实现LightPHE算法,并应用于实际场景中。
【3】系统实现
如下描述中“XX管理”通常指查询、新增、修改、删除、审核等操作。
① 系统管理
如下图所示包括用户管理、角色管理、权限管理、日志管理,其中用户/角色/权限构成了RBAC动态权限设计。
② 投票管理
这里包括投票信息和投票选项信息,每一个选项在返回给页面的时候会使用算法进行加密,用户选择票数传递后台会在加密的基础上进行隐私计算。
这也就是说投票选项数据表保存的是密文,计算结果会以明文形式保存到用户投票表。
③ 投票明细
如下所示,投票明细表中票数是加密密文非明文存储,不同用户对某个投票选项的计算是在密文上进行的。
对加密计算结果进行解密就可以得到当前投票选项的所有用户投票票数结果。
④ 通知公告
⑤ 代码截图
投票加密计算代码如下:
@bp.post('/save')
@authorize("system:voteDetail:add", log=True)
def save():
req_json = request.get_json(force=True)
choose_id = req_json.get('chooseId')
ticketNum = req_json.get('ticketNum')
if not choose_id or not ticketNum:
return fail_api(msg="请核实信息!")
username = session.get("username")
userId = session.get("userId")
voteChoose = curd.get_by_id(VoteChoose, choose_id)
if bool(VoteDetail.query.filter_by(vote_id=voteChoose.vote_id, user_id=userId).count()):
return fail_api(msg="不可重复投票!")
# 计算当前选项投票数
detail_list = VoteDetail.query.filter_by(choose_id=choose_id)
sum_number_encrypt = Ciphertext(algorithm_name='Paillier', keys=keys, value=int(ticketNum))
for voteDetail in detail_list:
sum_number_encrypt += Ciphertext(algorithm_name='Paillier', keys=keys, value=int(voteDetail.number))
print("加密后的密文为: ", sum_number_encrypt)
sum_number_decrypt = cs.decrypt(sum_number_encrypt)
print("解密后的明文为: ", sum_number_decrypt)
voteChoose.number = sum_number_decrypt
# 先计算,后插入
voteDetail = VoteDetail(choose_id=choose_id, content=voteChoose.content, vote_id=voteChoose.vote_id,
number=ticketNum,
vote_title=voteChoose.vote_title, user_id=userId, user_name=username)
db.session.add(voteDetail)
# # 当前选项投票人数+1
# voteChoose.number = voteChoose.number + 1
# vote 投票人数+1
sys_vote = curd.get_by_id(Vote, voteChoose.vote_id)
sys_vote.number = sys_vote.number + 1
db.session.commit()
return success_api(msg="投票成功")