半同态加密算法paillier的numpy矩阵加速实现

简介

目前开源半同态paillier库中比较常见的是python-paillier,但是该库只支持对单个float or int加解密及运算,在实际过程中,往往需要对多个数进行加解密及运算。典型场景是联邦学习(FL)中常常使用paillier对矩阵进行加密,然后做矩阵乘法,python-paillier不支持矩阵形式,使用for循环或者直接使用numpy进行运算耗时非常长。

该项目paillier_numpy对python-paillier进行了numpy矩阵扩展及优化,支持并加快对numpy矩阵加解密、dot、mean、sum等操作,同时基于矩阵分块的思想,使用多进程对矩阵的操作进行了多进程的优化,进一步提示速度。

用法

安装

pip install paillier_numpy

加解密

import numpy as np
from paillier import generate_paillier_keypair

# create public key and private key
p,q = generate_paillier_keypair()

# create random float
data = np.random.random_sample((100, 100))

# encrypt
encry = p.encrypt(data)

# decrypt
decry = q.decrypt(encry)

密文加减

p, q = generate_paillier_keypair()
data = np.random.random((2, 2))
encry = p.encrypt(data)

# float
encry2 = encry + 3.1415926
print(q.decrypt(encry2) == data + 3.1415926)

# int
encry3 = encry + 666
print(q.decrypt(encry3) == data + 666)

# matrix float
data2 = np.random.random_sample((2, 2))
encry4 = encry + data2
print(q.decrypt(encry4) == data + data2)

# matrix int
data2 = np.random.randint(-100,100,(2, 2))
encry5 = encry + data2
print(q.decrypt(encry5) == data + data2)

密文乘法

p, q = generate_paillier_keypair()
data = np.random.random((2, 2))
encry = p.encrypt(data)

# int
encry2 = encry * 2
print(q.decrypt(encry2)==data*2)

# float
encry2 = encry * 3.141592
print(q.decrypt(encry2)==data*3.141592)

dot

p, q = generate_paillier_keypair()
data = np.random.random((2, 2))
data2 = np.random.random_sample((2,3))
encry = p.encrypt(data)

# [A].dot(B)
encry2 = encry.dot(data2)
print(q.decrypt(encry2)==data.dot(data2))


# B.dot([A])
# !!!!!!!!!!!!!!!!!!!!!!
# [A] must  be converted to Numpy.ndarray
encry3 = data2.T.dot(encry.toArray())
print(q.decrypt(encry3)==data2.T.dot(data))

多进程并行加解密

partitions是矩阵被划分成用于多处理使用的块的数量。

p, q = generate_paillier_keypair()
data = np.random.random((1000, 100))
data2 = np.random.random_sample((1000,100))

encry = p.encrypt(data)
# time : 0:00:00.624028
decry = q.decrypt(encry)
# time : 0:01:06.076635

encry = p.encrypt(data, is_pool=True, partitions=10)
# time : 0:00:00.282844
decry = q.decrypt(encry, is_pool=True, partitions=10)
# time : 0:00:04.417449

多进程并行dot

对dot做了一些优化,建议使用多进程矩阵乘法。

p, q = generate_paillier_keypair()
data = np.random.random((100, 10))
data2 = np.random.random_sample((10,100))

encry = p.encrypt(data)
encry2 = encry.dot(data2)
# time cost: 0:00:21.922967

encry2 = p.encrypt(data, is_pool=True, partitions=10)
encry3 = encry2.dot(data2,is_pool=True,partitions=10)
# time cost: 0:00:01.600504

其它操作

sum,mean等操作需要调用对应的numpy操作,例如

encry_sum = np.sum(encry_sum.toArray())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值