diff --git a/.gitignore b/.gitignore index 6ddda65..f4a04da 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ build *.pyc temp .idea +*.bin diff --git a/README.md b/README.md index fd93396..80d2383 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ This is a python binding for the Microsoft SEAL library. # Test cp seal.*.so examples + cd examples python3 4_bgv_basics.py ``` @@ -66,16 +67,18 @@ This is a python binding for the Microsoft SEAL library. Visual Studio 2019 or newer is required. x64 support only! And use the **x64 Native Tools Command Prompt for VS** command prompt to configure and build the Microsoft SEAL library. It's usually can be found in your Start Menu. ```shell - # Same as above # Run in "x64 Native Tools Command Prompt for VS" command prompt cmake -S . -B build -G Ninja -DSEAL_USE_MSGSL=OFF -DSEAL_USE_ZLIB=OFF cmake --build build + # Build pip install numpy pybind11 - python setup.py build_ext -i - cp *.so examples + # Test + cp seal.*.pyd examples + cd examples + python 4_bgv_basics.py ``` Microsoft SEAL official [docs](https://github.com/microsoft/SEAL#building-microsoft-seal-manually). @@ -101,11 +104,10 @@ This is a python binding for the Microsoft SEAL library. * ### Serialize - In most situations, you can use the SEAL's native serialize API to save the data, here is an example: + See more in `examples/7_serialization.py`, here is a simple example: ```python cipher.save('cipher') - load_cipher = Ciphertext() load_cipher.load(context, 'cipher') # work if the context is valid. ``` diff --git a/examples/7_serialization.py b/examples/7_serialization.py new file mode 100644 index 0000000..07bc5d2 --- /dev/null +++ b/examples/7_serialization.py @@ -0,0 +1,73 @@ +from seal import * +import pickle +import time + + +def get_seal(): + parms = EncryptionParameters(scheme_type.ckks) + poly_modulus_degree = 8192 + parms.set_poly_modulus_degree(poly_modulus_degree) + parms.set_coeff_modulus(CoeffModulus.Create(poly_modulus_degree, [60, 40, 40, 60])) + scale = 2.0 ** 40 + + context = SEALContext(parms) + ckks_encoder = CKKSEncoder(context) + slot_count = ckks_encoder.slot_count() + + keygen = KeyGenerator(context) + public_key = keygen.create_public_key() + secret_key = keygen.secret_key() + + encryptor = Encryptor(context, public_key) + # evaluator = Evaluator(context) + decryptor = Decryptor(context, secret_key) + + data = [3.1415926] * slot_count + plain = ckks_encoder.encode(data, scale) + cipher = encryptor.encrypt(plain) + + return cipher, context, ckks_encoder, decryptor + + +def serialization_example(): + print('serialization example') + print('-' * 70) + cipher2, context2, ckks_encoder2, decryptor2 = get_seal() + cipher2.save('cipher2.bin') + print('save cipher2 data success') + + time.sleep(.5) + + cipher3 = Ciphertext() + cipher3.load(context2, 'cipher2.bin') + print('load cipher2 data success') + plain3 = decryptor2.decrypt(cipher3) + data3 = ckks_encoder2.decode(plain3) + print(data3) + print('-' * 70) + + +def pickle_example(): + print('pickle example') + print('-' * 70) + cipher1, context1, ckks_encoder1, decryptor1 = get_seal() + with open('cipher1.bin', 'wb') as f: + pickle.dump(cipher1.to_string(), f) + print('write cipher1 data success') + + time.sleep(.5) + + with open('cipher1.bin', 'rb') as f: + temp = pickle.load(f) + cipher2 = context1.from_cipher_str(temp) + plain2 = decryptor1.decrypt(cipher2) + data = ckks_encoder1.decode(plain2) + print('read cipher1 data success') + print(data) + + print('-' * 70) + + +if __name__ == "__main__": + serialization_example() + pickle_example()