同态加密算法之paillier算法

使用 phe 演示 paillier 的同态加和标量乘的性质: 

from phe import paillier # 开源库
import time # 做性能测试

# 测试paillier参数
print("默认私钥大小:",paillier.DEFAULT_KEYSIZE) #2048
# 生成公私钥
public_key,private_key = paillier.generate_paillier_keypair()
# 测试需要加密的数据
message_list = [3.1415926,100,-4.6e-12]
# 加密操作
time_start_enc = time.time()
encrypted_message_list = [public_key.encrypt(m) for m in message_list]
time_end_enc = time.time()
print("加密耗时s:",time_end_enc-time_start_enc)
# 解密操作
time_start_dec = time.time()
decrypted_message_list = [private_key.decrypt(c) for c in encrypted_message_list]
time_end_dec = time.time()
print("解密耗时s:",time_end_dec-time_start_dec)
# print(encrypted_message_list[0]) 
print("原始数据:",decrypted_message_list)

# 测试加法和乘法同态
a,b,c = encrypted_message_list # a,b,c分别为对应密文

a_sum = a + 5 # 密文加明文
a_sub = a - 3 # 密文加明文的相反数
b_mul = b * 1 # 密文乘明文,数乘
c_div = c / -10.0 # 密文乘明文的倒数

# print("a:",a.ciphertext()) # 密文a的纯文本形式
# print("a_sum:",a_sum.ciphertext()) # 密文a_sum的纯文本形式

print("a+5=",private_key.decrypt(a_sum))
print("a-3",private_key.decrypt(a_sub))
print("b*1=",private_key.decrypt(b_mul))
print("c/-10.0=",private_key.decrypt(c_div))

##密文加密文
print((private_key.decrypt(a)+private_key.decrypt(b))==private_key.decrypt(a+b)) 
#报错,不支持a*b,因为通过密文加实现了明文加的目的,这和原理设计是不一致的,只支持密文加!
print((private_key.decrypt(a)+private_key.decrypt(b))==private_key.decrypt(a*b)) 

输出结果:

默认私钥大小: 2048
加密耗时s: 0.298203706741333
解密耗时s: 0.08876276016235352
原始数据: [3.1415926, 100, -4.6e-12]
a+5= 8.1415926
a-3 0.14159260000000007
b*1= 100
c/-10.0= 4.6e-13
True
下面展示的是,密文 a 和 a_sum 的纯文本形式:

59402891142220912790068722502588843510414373562474086568444315748957242223594078920692702271013040021606
29112250432729616200776837445868267160099504562745796573462667874006977486270005004189820621257201450835
95286290689356511561050034589378294988530870333018543952400509575823371263067029816952672878333126830199
12208986921271655792833132186568426198749835897197910518523286423616088832223047227419760673704533751712
17666234428220524541795748215492186778080201463384785587109650922059620488750810820610208353759446327756
63599761170876116801234201028756739014984640927821609310541862790081520353932541832508051248201224689389
71663888043725931695624971340812273609840037340618675924979637363755629958553531479895408203143871220295
05550200561549096636090938755444294278352869503185166386110051892134296990595405592705392561103207638003
58299869294954878475975767806121717680031375299808709846636140664504646588469799220716699577174744942216
0489667837064719419647257623775441380514437451891391616187946871983652962799313678571231605178482982326
3942066705749797498295563002464378551086469243477774964906861706671750457013160048780896569331434212131
5645646993448311004999193535756597976896791889897514267674569532234756593580678428717217091
72503789972362890158089713963923142946932275137588893873066060260427422987448615020129740650415793994752
89914787143889439442015281242884303543642312363896285439888638028819276270617056080815670329543098775127
01648905463852468828750987243184163793796212024326243852761255262543153843882913223989533033703680463022
71727615221928710774152910338734478251782313696907369252419028755395837984878232285620473166801574172888
35172348816395393891011504158756832693190296645131334844289995463159465758702843877243366545420812051251
20595297949908969862969103991096698666458256858767772032163810844027965959247950116209042132351109507381
25626236050597600784840500488126185028857207215899544807724315656285338191150222488171263042105422201126
01674978993960011727259811180024593649056933109263484562202650600338390529529146293807864287176022641931
02933996451449299729208060812106919417895728958945870762206977076872453871000988134106413514712523248078
2493633868758490307717011567853786767850059340632080574917712549872331152518228238328842712445996133798
9827856340292353285798162662355801872734068579393510255567521972004997436755561169253567131819320662420
4286175621171760105641223750257069280416238463223625810169297046868940677578803461625885257

最后提供一个paillier 实现的 go 版本:GitHub - Roasbeef/go-go-gadget-paillier: A Go implementation of the partially homomorphic Paillier Cryptosystem.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值