编程语言
首页 > 编程语言> > Paillier算法的原理和代码实现

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 cryptosystem(Paillier 密码系统)

https://blog.csdn.net/qq_33885461/article/details/86555560

Paillier半同态加密:原理、高效实现方法和应用

https://zhuanlan.zhihu.com/p/420417626

对于第一次做实验而且是第一次写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