基于paillier算法的同态加密电子匿名投票系统

       (欢迎密码学的朋友,一起相互交流学习。 对不足之处进行指正!)

  最近在学习同态加密算法,正好帮导师给xxxxxx做一个关于同态加密的电子投票系统的demo。  所以就把学到的东西分享出来,欢迎同道中人一起交流讨论。   

    什么是同态加密呢?

  定义: 同态加密是基于数学难题的计算复杂性理论的密码学技术。对经过同态加密的数据进行处理得到一个输出,将这一输出进行解密,其结果与用同一方法处理未加密的原始数据得到的输出结果是一样的。

      本质上,同态加密是指这样一种加密函数,对明文进行环上的加法和乘法运算再加密,与加密后对密文进行相应的运算,结果是等价的。由于这个良好的性质,人们可以委托第三方对数据进行处理而不泄露信息。具有同态性质的加密函数是指两个明文a、b满足Dec(En(a)⊙En(b))=a⊕b的加密函数,其中En是加密运算,Dec是解密运算,⊙、⊕分别对应明文和密文域上的运算。当⊕代表加法时,称该加密为加同态加密:当⊙代表乘法时,称该加密为乘同态加密。

       全同态加密是指同时满足加同态和乘同态性质,可以进行任意多次加和乘运算的加密函数。用数学公式来表达,即Dec(f(En(m1),En(m2),…,En(mk)))=f(m1,m2,…,mk),或写成:f(En(m1),En(m2),…,En(mk))=En(f(m1,m2,…,mk)),如果f是任意函数,称为全同态加密。

一句话总结,同态加密就是把密文按照某种规则进行操作后解密和直接按照某种规则操作明文得到的结果是一样的。 

       我使用的是基于paillier算法的同态加密技术。

 paillier算法(这是一篇讲述关于同态加密的论文,题目:homomorphic encryption ):

 

 我在这里基于paillier算法的同态加密进行了实现,运用在了电子投票系统中,这是一个demo,里面有很多问题,但密码算法这一块是走通了的。(全套代码将上传到我的下载中):https://download.csdn.net/download/qq_27731689/10921199 (有积分的就送楼主一点积分吧,毕竟楼主也要下载呀,没有的可以通过GitHub下载或者后面留言,我发送到邮箱)

或者GitHub中也可下载:https://github.com/maricolm/VoteSystem

(后期开发的完整的系统代码不方便透露)

在系统中我模拟使用了5个candidate ,5个voter。( 一个voter可以为每个人投一票。)

管理员登录后台可以统计candidate的总票数:

同时为了便于演示。我把相关过程也打印了出来。管理员可以点击candidate的名字, 查看详细的投票密文和明文,(这儿为了便于演示,保存了明文,真正投入使用的系统是不会保存明文的)

注:统计总票数是根据密文进行计算而得到的。 没有用到明文

算法中秘钥使用的是512位,其执行时间如下:

在Java中的执行时间, 统计4个数:

同时我们可以看到,及时同一个人,加密相同的明文,得到的密文是不一样的。 所以就很好的避免了,别人采用多项式线性分析秘钥。

用c语言在Linux下的执行速度:

================================================================================================

     同态加密技术很适用于电子投票系统。电子投票是将日常线下选举活动进行电子化,并且需要使用密码学,通过互联网技术实现的线上选举活动。电子投票将在很多方面所有改善,例如在组织方面、计票方面等,都可以节省大量资源。虽然电子投票是一种互联网线上活动,带给大家极大的便利,但是通过互联网传播的信息很容易被坏人利用和窃取,所以在进行电子投票的时候,必须使用匿名选票,以保证投票者的隐私和安全。

    大多的匿名电子投票系统,是通过保护用户隐私安全的目的来达到匿名的目的,但,这样的话,如果系统出现腐败现象,是可以进行追踪,从而得到用户的信息。例如: 张三给李四投了反对票, 系统是匿名隐藏了张三的信息,所以李四不知道是张三投的,但如果李四控制了系统,就可以获取到私钥,从而得到张三的真实身份。

   而基于同态加密的子投票系统就避免了这种情况。他的原理是,所以人的身份信息不被匿名,而是匿名他们的投票信息, 系统会自动把所有人的投票信息的密文进行处理得到一个密文,把这个密文丢给管理员,管理员对一个密文解密就可得到最终信息。

感谢打赏:

  • 14
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 67
    评论
首先,需要了解Paillier同态加密算法的基本原理和加密、解密操作。Paillier同态加密算法是一种公钥加密算法,主要用于加密整数和实数,具有同态加密的特性,即两个密文相乘等于对应明文相加,两个密文相加等于对应明文相乘的性质。 求集合交集的过程可以使用Paillier同态加密算法实现。假设有两个集合A和B,其中A={a1,a2,...,an},B={b1,b2,...,bm},现在要求A和B的交集。 具体实现步骤如下: 1. 生成两个随机的质数p和q,计算n=p*q。 2. 计算λ=lcm(p-1, q-1),其中lcm表示最小公倍数。 3. 随机选择一个整数g,使得g^n mod n^2=1。 4. 公钥为(n,g),私钥为(p,q,λ)。 5. 对A和B中的每个元素进行加密得到密文,即将ai和bj分别加密得到ci和dj。加密过程如下: a. 选择一个随机整数r,使得r<n,计算c=g^ar * h^m mod n^2,其中h=g^m mod n^2,m为ai或bj。 b. 将密文ci或dj定义为(c,r),其中c为加密结果,r为随机数。 6. 对密文ci和dj进行同态相乘得到密文ei=ci * dj。 7. 对密文ei进行同态解密得到明文mi,即ei^λ mod n^2=(1+n)^mi * n * u,其中u为n的逆元。 8. 对每个明文mi进行判断,如果mi不等于1,则说明ai和bj在两个集合的交集中。 9. 将所有交集中的元素输出即可。 下面是Python代码实现: ```python from Crypto.Util.number import getPrime from random import randint # 生成质数p和q def generate_prime(): p = getPrime(128) q = getPrime(128) while p == q: q = getPrime(128) return p, q # 计算lcm def lcm(a, b): return a * b // gcd(a, b) # 计算逆元 def inv(a, n): t, r = 0, n newt, newr = 1, a while newr != 0: quotient = r // newr t, newt = newt, t - quotient * newt r, newr = newr, r - quotient * newr if r > 1: return None if t < 0: t += n return t # 加密明文 def encrypt(m, n, g): r = randint(0, n-1) h = pow(g, m, n*n) c = (pow(g, r, n*n) * pow(h, 1, n*n)) % (n*n) return (c, r) # 同态相乘 def multiply(c1, c2, n): return ((c1[0] * c2[0]) % (n*n), (c1[1] * c2[1]) % n) # 同态解密 def decrypt(c, p, q): n = p * q lamda = lcm(p-1, q-1) u = inv(pow(p, q-2, q) * (p-1) // lamda, q) return (((pow(c[0], lamda, n*n) - 1) // n) * u) % q # 求集合交集 def intersection(A, B, n, g, p, q): C = [] for a in A: ca = encrypt(a, n, g) for b in B: cb = encrypt(b, n, g) ei = multiply(ca, cb, n) mi = decrypt(ei, p, q) if mi != 1: C.append(a) return C # 测试 if __name__ == '__main__': p, q = generate_prime() n = p * q lamda = lcm(p-1, q-1) g = n + 1 A = [1, 2, 3, 4] B = [3, 4, 5, 6] C = intersection(A, B, n, g, p, q) print(C) ``` 在以上代码中,A和B分别表示两个集合,n、g、p、q分别表示公钥和私钥中的参数。函数intersection用于求两个集合的交集,返回结果为C。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 67
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值