SEAL全同态加密开源库(十六)performance-性能

2021SC@SDUSC

2021-12-27

前言

本篇开始我将讨论SEAL中performance.cpp的代码实现,这一部分实现了对SEAL的性能测度。

源码分析

主要分析void bfv_performance_test(SEALContext context)。
先是初始化以及打印一些参数。

    chrono::high_resolution_clock::time_point time_start, time_end;

    print_parameters(context);
    cout << endl;

    auto &parms = context.first_context_data()->parms();
    auto &plain_modulus = parms.plain_modulus();
    size_t poly_modulus_degree = parms.poly_modulus_degree();

然后用之前分析过的KeyGenerator,生成公钥、私钥:

    cout << "Generating secret/public keys: ";
    KeyGenerator keygen(context);
    cout << "Done" << endl;

    auto secret_key = keygen.secret_key();
    PublicKey public_key;
    keygen.create_public_key(public_key);

    RelinKeys relin_keys;
    GaloisKeys gal_keys;

时间变量如下:

    //时间
    chrono::microseconds time_diff;

生成relinearization keys重线性密钥:

cout << "Generating relinearization keys: ";
        time_start = chrono::high_resolution_clock::now();
        keygen.create_relin_keys(relin_keys);
        time_end = chrono::high_resolution_clock::now();
        time_diff = chrono::duration_cast<chrono::microseconds>(time_end - time_start);
        cout << "Done [" << time_diff.count() << " microseconds]" << endl;

        if (!context.key_context_data()->qualifiers().using_batching)
        {
    
    
            cout << "Given encryption parameters do not support batching." << endl;
            return;
        }

关于relinearization keys(重线性密钥):
利用 Lemma 2,我们已经有了一个两个密文相乘的密文,但是,剩下的问题是密文中的元素数量增加了。为了纠正这种现象,我们需要一个叫做 Relinearisation 的过程,将一个 degree 2 密文再次还原成 degree 1 的密文。恰恰是这一步,需要引入重线性密钥。

生成伽罗瓦键。在更大的示例中,Galois键可以使用大量内存,这在受限的系统中可能是一个问题。用户应该尝试一些较 大的测试运行,并观察它们对内存池分配大小的影响。从打印结果可以看出,密钥生成也需要很长时间:

        cout << "Generating Galois keys: ";
        time_start = chrono::high_resolution_clock::now();
        keygen.create_galois_keys(gal_keys);
        time_end = chrono::high_resolution_clock::now();
        time_diff = chrono::duration_cast<chrono::microseconds>(time_end - time_start);
        cout << "Done [" << time_diff.count() << " microseconds]" << endl;

最后,保存每个操作使用的总时间,并且设置运行次数,填充要进行批处理的值向量:

    chrono::microseconds time_batch_sum(0);
    chrono::microseconds time_unbatch_sum(0);
    chrono::microseconds time_encrypt_sum(0);
    chrono::microseconds time_decrypt_sum(0);
    chrono::microseconds time_add_sum(0);
    chrono::microseconds time_multiply_sum(0);
    chrono::microseconds time_multiply_plain_sum(0);
    chrono::microseconds time_square_sum(0);
    chrono::microseconds time_relinearize_sum(0);
    chrono::microseconds time_rotate_rows_one_step_sum(0);
    chrono::microseconds time_rotate_rows_random_sum(0);
    chrono::microseconds time_rotate_columns_sum(0);
    chrono::microseconds time_serialize_sum(0);
#ifdef SEAL_USE_ZLIB
    chrono::microseconds time_serialize_zlib_sum(0);
#endif
#ifdef SEAL_USE_ZSTD
    chrono::microseconds time_serialize_zstd_sum(0);
#endif
    /*
    设置测试运行次数
    */
    long long count = 10;
    size_t slot_count = batch_encoder.slot_count();
    vector<uint64_t> pod_vector;
    random_device rd;
    for (size_t i = 0; i < slot_count; i++)
    {
    
    
        pod_vector.push_back(plain_modulus.reduce(rd()));
    }

    cout << "Running tests ";

最后就能看到输出了。

扫描二维码关注公众号,回复: 14222980 查看本文章

效率测试

BFV效率测试

> Run performance test (1 ~ 4) or go back (0): 1

+--------------------------------------------------------------------------+
|         BFV Performance Test with Degrees: 4096, 8192, and 16384         |
+--------------------------------------------------------------------------+
/
| Encryption parameters :
|   scheme: BFV
|   poly_modulus_degree: 4096
|   coeff_modulus size: 109 (36 + 36 + 37) bits
|   plain_modulus: 786433
\

Generating secret/public keys: Done
Generating relinearization keys: Done [2544 microseconds]
Generating Galois keys: Done [53215 microseconds]
Running tests .......... Done

Average batch: 78 microseconds
Average unbatch: 99 microseconds
Average encrypt: 2972 microseconds
Average decrypt: 481 microseconds
Average add: 31 microseconds
Average multiply: 4624 microseconds
Average multiply plain: 599 microseconds
Average square: 3434 microseconds
Average relinearize: 872 microseconds
Average rotate rows one step: 896 microseconds
Average rotate rows random: 3489 microseconds
Average rotate columns: 876 microseconds
Average serialize ciphertext: 17 microseconds
Average compressed (ZLIB) serialize ciphertext: 15994 microseconds
Average compressed (Zstandard) serialize ciphertext: 2713 microseconds

/
| Encryption parameters :
|   scheme: BFV
|   poly_modulus_degree: 8192
|   coeff_modulus size: 218 (43 + 43 + 44 + 44 + 44) bits
|   plain_modulus: 786433
\

Generating secret/public keys: Done
Generating relinearization keys: Done [13098 microseconds]
Generating Galois keys: Done [313981 microseconds]
Running tests .......... Done

Average batch: 155 microseconds
Average unbatch: 163 microseconds
Average encrypt: 6385 microseconds
Average decrypt: 1472 microseconds
Average add: 122 microseconds
Average multiply: 16976 microseconds
Average multiply plain: 2564 microseconds
Average square: 12623 microseconds
Average relinearize: 4715 microseconds
Average rotate rows one step: 4750 microseconds
Average rotate rows random: 23478 microseconds
Average rotate columns: 4569 microseconds
Average serialize ciphertext: 48 microseconds
Average compressed (ZLIB) serialize ciphertext: 40772 microseconds
Average compressed (Zstandard) serialize ciphertext: 1628 microseconds

/
| Encryption parameters :
|   scheme: BFV
|   poly_modulus_degree: 16384
|   coeff_modulus size: 438 (48 + 48 + 48 + 49 + 49 + 49 + 49 + 49 + 49) bits
|   plain_modulus: 786433
\

Generating secret/public keys: Done
Generating relinearization keys: Done [97873 microseconds]
Generating Galois keys: Done [2409779 microseconds]
Running tests .......... Done

Average batch: 265 microseconds
Average unbatch: 333 microseconds
Average encrypt: 19389 microseconds
Average decrypt: 5899 microseconds
Average add: 511 microseconds
Average multiply: 70743 microseconds
Average multiply plain: 10712 microseconds
Average square: 51595 microseconds
Average relinearize: 27214 microseconds
Average rotate rows one step: 27952 microseconds
Average rotate rows random: 129684 microseconds
Average rotate columns: 27694 microseconds
Average serialize ciphertext: 321 microseconds
Average compressed (ZLIB) serialize ciphertext: 176645 microseconds
Average compressed (Zstandard) serialize ciphertext: 7302 microseconds

CKKS效率测试

> Run performance test (1 ~ 4) or go back (0): 3

+---------------------------------------------------------------------------+
|         CKKS Performance Test with Degrees: 4096, 8192, and 16384         |
+---------------------------------------------------------------------------+
/
| Encryption parameters :
|   scheme: CKKS
|   poly_modulus_degree: 4096
|   coeff_modulus size: 109 (36 + 36 + 37) bits
\

Generating secret/public keys: Done
Generating relinearization keys: Done [2648 microseconds]
Generating Galois keys: Done [50264 microseconds]
Running tests .......... Done

Average encode: 355 microseconds
Average decode: 380 microseconds
Average encrypt: 2101 microseconds
Average decrypt: 53 microseconds
Average add: 35 microseconds
Average multiply: 157 microseconds
Average multiply plain: 64 microseconds
Average square: 122 microseconds
Average relinearize: 924 microseconds
Average rescale: 223 microseconds
Average rotate vector one step: 834 microseconds
Average rotate vector random: 3141 microseconds
Average complex conjugate: 831 microseconds
Average serialize ciphertext: 14 microseconds
Average compressed (ZLIB) serialize ciphertext: 11101 microseconds
Average compressed (Zstandard) serialize ciphertext: 1787 microseconds

/
| Encryption parameters :
|   scheme: CKKS
|   poly_modulus_degree: 8192
|   coeff_modulus size: 218 (43 + 43 + 44 + 44 + 44) bits
\

Generating secret/public keys: Done
Generating relinearization keys: Done [13624 microseconds]
Generating Galois keys: Done [324947 microseconds]
Running tests .......... Done

Average encode: 1233 microseconds
Average decode: 1883 microseconds
Average encrypt: 6165 microseconds
Average decrypt: 238 microseconds
Average add: 131 microseconds
Average multiply: 575 microseconds
Average multiply plain: 258 microseconds
Average square: 494 microseconds
Average relinearize: 4521 microseconds
Average rescale: 949 microseconds
Average rotate vector one step: 4386 microseconds
Average rotate vector random: 19942 microseconds
Average complex conjugate: 5834 microseconds
Average serialize ciphertext: 62 microseconds
Average compressed (ZLIB) serialize ciphertext: 48368 microseconds
Average compressed (Zstandard) serialize ciphertext: 2377 microseconds

/
| Encryption parameters :
|   scheme: CKKS
|   poly_modulus_degree: 16384
|   coeff_modulus size: 438 (48 + 48 + 48 + 49 + 49 + 49 + 49 + 49 + 49) bits
\

Generating secret/public keys: Done
Generating relinearization keys: Done [162775 microseconds]
Generating Galois keys: Done [4053943 microseconds]
Running tests .......... Done

Average encode: 4565 microseconds
Average decode: 10773 microseconds
Average encrypt: 28865 microseconds
Average decrypt: 1433 microseconds
Average add: 763 microseconds
Average multiply: 3571 microseconds
Average multiply plain: 1542 microseconds
Average square: 3002 microseconds
Average relinearize: 42700 microseconds
Average rescale: 7313 microseconds
Average rotate vector one step: 43168 microseconds
Average rotate vector random: 219552 microseconds
Average complex conjugate: 47044 microseconds
Average serialize ciphertext: 375 microseconds
Average compressed (ZLIB) serialize ciphertext: 284790 microseconds
Average compressed (Zstandard) serialize ciphertext: 8401 microseconds

结语

本文标志着examples文件夹的全部分析,至此,我们完成了对于SEAL的代码分析部分的最后一篇,后面我会再写一篇理论补充以及总结报告。

猜你喜欢

转载自blog.csdn.net/ldxcsdn/article/details/122181152