• 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半同态加密:原理、高效实现方法和应用

    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))× 无法输出结果

  • 相关阅读:
    pytorch中torch.unsqueeze()函数与np.expand_dims()
    python内存泄漏,gc模块
    pytorch初始化网络参数
    pytorch保存模型等相关参数,利用torch.save(),以及读取保存之后的文件
    pytorch将cpu训练好的模型参数load到gpu上,或者gpu->cpu上
    ubuntu ssh连接服务器保持长时间不断
    pytorch遇到的问题:RuntimeError: randperm is only implemented for CPU
    利用pytorch复现spatial pyramid pooling层
    Non-maximum suppression(非极大值抑制算法)
    numpy之flatnonzero函数
  • 原文地址:https://www.cnblogs.com/someonezero/p/16354504.html
Copyright © 2020-2023  润新知