Paillier算法的原理和代码实现
作者:互联网
Paillier算法的原理和代码实现
-
密钥生成:
1、随机选择两个大质数p和q满足gcd(pq,(p-1)(q-1))=1。 这个属性是保证两个质数长度相等。
2、计算 n = pq和λ= lcm (p - 1,q-1)。
3、选择随机整数g使得gcd(L(g^lambda % n^2) , n) = 1,满足g属于n^2;
4、公钥为(N,g)
5、私钥为lambda。
-
加密:
选择随机数r满足
计算密文
其中m为加密信息
解密:
-
解密:
m = D(c,lambda) = ( L(clambda%n2)/L(glambda%n2) )%n;
其中L(u) = (u-1)/n;
使用python中的phe库使用更方便
查看源码测试phe库更方便更快捷 phe库的官方文档地址是
https://python-paillier.readthedocs.io/en/develop/usage.html#usage 其中会解释具体的用法。
对于刚入门的可以参照
-
Paillier原理
Paillier cryptosystem(Paillier 密码系统)
https://blog.csdn.net/qq_33885461/article/details/86555560
Paillier半同态加密:原理、高效实现方法和应用
对于第一次做实验而且是第一次写python代码的可以参考这篇网站
https://www.csdn.net/tags/MtTaMg3sNTMwMDk1LWJsb2cO0O0O.html
我做实验的代码参考了上述提到的网址
我自己做实验的时候写的代码
``from phe import paillier`
import numpy as np
public_key,private_key=paillier.generate_paillier_keypair()
A=[3.6,300,-5e-10]
enA=[public_key.encrypt(x) for x in A]
B=[3,300,-3e-10]
enB=[public_key.encrypt(x) for x in B]
for i in enA:
print(i)
en=np.add(enA,enB)
en=np.add(enA,enB)
res=[private_key.decrypt(x) for x in en]
\# print(res)
a=50
print(type(a))
b=public_key.encrypt(a)
print(type(b))
print(b.ciphertext(be_secure=True))
#输出加密后的密文结果
`#print(public_key.encrypt(a))``
对于同一个数两次运行同态加密时的密文是不一样的,对于a=50
212758027600711660470296884884108873447975587401122294318501056160361667231704351010426093743385419365782853742386677995863388654602909687901792975194873632065009547149065904075561879976263233507698421363356902178073817574161379875568406278186956625382596220520610595060881942969164355597101794510852561407953393190977218819096905793038264325732097351826631981899945529949558414487525673044464979256634633703298425567903069802812437395695022913268187633477365004541184208883597311894138641812064298650823628040018818709574961292350658822830265173056977406355926291047719211022207936695362795865429752125586791067032365466744229719603964048710628129612236445077664125477200969037192009352911893316157665122551777322310403568270408365090892704217635240461509642904246148626570338446938003677577186408800609769416535323069246665942021769032119259885178606877867881762836433235838474743517896878533327887382553038108458890939518819681968988721584897461390868643834878083774649194052400892406154297390492152647161728987577906794373953749970007144681199621383128362985669569298943828571868842117026241102089641816357718911422893538275225311489346770039443896874393232280824706764467553514777520573459773836856404645041246665528284396734286
第二次
570119402171134623310430524966471127673624163508129513398485336968391558496275106841952680956926245377283167083289582523843106251123306021751000137310300472537676089219577023419035469840424787622189683678714127407929996913028769302536127771134026210620463941265512991763140880681439014311955863165351227326498077790740938423009353791155098536309370309535668511502631531268637331406821068403565938624795606075845874808271156598876830955085779441172346112545530325963195852872460526375355621883599947452467748707819462274035333437501450090431631995472972520916562131601537707318833343768247747693103317868438722602756448193908500290889060863710802814033518105915707137464072996325670307231040326680802311910221666608436791560650746061660176860320774706868203118280506254005853944081397260258521558006949916119976257263154552353354387330257426266323817365185301364109085743735156363364031163792130516812055793949555607000049149703188794884484341638954900561437705436686455963969532714214329037689182000253629260564154441261451382432707861890313722352882000488763476636804220870924509085812363154897558060357086710737628044676453434769265223488385823039421067274742974151036427809213761514224821414846474222719843636868646943476932741630
看源代码做实验的结果会更快
paillier算法只满足加法同态和密文与明文的乘法同态,不满足密文的乘法同态。
“乘法同态:满足E(X)E(Y)=E(XY)。典型的例子为:RSA加密算法中,E(x)=xe(其中e为公钥),则E(x)E(y)=xeye=(xy)e=E(xy),具有乘法同态性。”
b=public_key.encrypt(a)
b=b*5
d=20
c=public_key.encrypt(d)
print(private_key.decrypt(c+b))
输出为 270=250+20
print(private_key.decrypt(c*b))× 无法输出结果
标签:encrypt,同态,代码,算法,key,print,Paillier,public 来源: https://www.cnblogs.com/someonezero/p/16354504.html