Intel Paillier Cryptosystem Library (IPCL) is an open-source library which provides accelerated performance of a partial homomorphic encryption (HE), named Paillier cryptosystem, by utilizing Intel® Integrated Performance Primitives Cryptography technologies on Intel CPUs supporting the AVX512IFMA instructions. The library is written in modern standard C++ and provides the essential API for the Paillier cryptosystem scheme. Intel Paillier Cryptosystem Library is certified for ISO compliance.
Intel Paillier Cryptosystem Library - Python (ipcl_python
), a Python extension package of IPCL, is enabled in FATE as an optional Paillier scheme, alongside original FATE Paillier scheme.
The following sections introduce:
To build FATE images with ipcl_python
enabled, please refer to README of FATE-Builder. Set Build_IPCL=1
.
Set the value of encrypt_param.method
to "ipcl" when configuring the model in federatedml.components
.
In fate_test
Install fate_test
according to fate_test_tutorial
Test Paillier operations with both original FATE Paillier scheme and IPCL
fate_test op-test paillier
The following steps briefly introduce how IPCL is integrated into FATE, which have been already done since FATE v1.10.0.
Add IPCL as an encryption parameter consts.PAILLIER_IPCL
python/federatedml/util/consts.py
PAILLIER = 'Paillier'
+ PAILLIER_IPCL = 'IPCL'
python/federatedml/param/encrypt_param.py
+ elif user_input == "ipcl":
+ self.method = consts.PAILLIER_IPCL
Add ipcl_python
as the backend of secure protocol
python/federatedml/secureprotocol/encrypt.py
+ from ipcl_python import PaillierKeypair as IpclPaillierKeypair
+ from ipcl_python import PaillierEncryptedNumber as IpclPaillierEncryptedNumber
...
+ class IpclPaillierEncrypt(Encrypt):
+ ...
python/federatedml/secureprotocol/__init__.py
- from federatedml.secureprotol.encrypt import RsaEncrypt, PaillierEncrypt
+ from federatedml.secureprotol.encrypt import RsaEncrypt, PaillierEncrypt, IpclPaillierEncrypt
from federatedml.secureprotol.encrypt_mode import EncryptModeCalculator
- __all__ = ['RsaEncrypt', 'PaillierEncrypt', 'EncryptModeCalculator']
+ __all__ = ['RsaEncrypt', 'PaillierEncrypt', 'IpclPaillierEncrypt', 'EncryptModeCalculator']
Add IpclPaillierEncrypt
as the model's cipher_operator
, e.g., hetero_logistic_regression
python/federatedml/linear_model/coordinated_linear_model/logistic_regression/hetero_logistic_regression/hetero_lr_base.py
- from federatedml.secureprotol import PaillierEncrypt
+ from federatedml.secureprotol import PaillierEncrypt, IpclPaillierEncrypt
...
- self.cipher_operator = PaillierEncrypt()
+
+ if params.encrypt_param.method == consts.PAILLIER:
+ self.cipher_operator = PaillierEncrypt()
+ elif params.encrypt_param.method == consts.PAILLIER_IPCL:
+ self.cipher_operator = IpclPaillierEncrypt()
+ else:
+ raise ValueError(f"Unsupported encryption method: {params.encrypt_param.method}")
+
For now, hetero_logistic_regression
and hetero_secure_boost
models are supported by IPCL.