SEAL全同态加密开源库(十四) encoders-源码浅析

2021SC@SDUSC

2021-12-26

前言

前几篇我们讨论了SEAL对于BFV、CKKS的实现。本篇开始我将开始讨论SEAL中encoders.cpp代码实现。

背景

在“1 _bfv_basics。我们展示了如何使用BFV方案执行一个非常简单的计算。计算以明文模为参数,仅利用一个BFV明文多项式的系数。这种方法有两个值得注意的问题:

(1)实际应用中一般采用整数或实数算法,而不是模运算;
(2)我们只使用了明文多项式的一个系数。这是非常浪费的,因为明文多项式很大,而且在任何情况下都将全部加密。

对于(1),有人可能会问,为什么不直接增加plain_modules参数,直到没有溢出发生,并且计算的行为就像整数算术一样。问题是增加plain_module会增加噪声预算消耗,同时降低初始噪声预算。

在这些示例中,我们将讨论将数据放入明文元素(编码)的其他方法,这些方法允许进行更多的计算,而不会出现数据类型溢出,并且允许使用完整的明文多项式。

源码分析

void example_batch_encoder()

void example_batch_encoder()
{
   
   
    print_example_banner("Example: Encoders / Batch Encoder");

设N为poly_modulus_degree,T为plain_modulus。批处理允许BFV明文多项式被视为2×(N/2)矩阵,每个元素都是一个模T整数。在矩阵视图中,加密操作在加密矩阵上逐个执行element-wise,允许用户在完全向量化计算中获得几个数量级的速度提升。因此,除了最简单的计算之外,批处理应该是首选的方法。使用BFV时,如果使用得当,实现的性能将超过使用IntegerEncoder完成的任何工作。

EncryptionParameters parms(scheme_type::BFV);
size_t poly_modulus_degree = 8192;
parms.set_poly_modulus_degree(poly_modulus_degree);
parms.set_coeff_modulus(CoeffModulus::BFVDefault(poly_modulus_degree));

为了启用批处理,我们需要将plain_modules设置为一个素数,它全等于1模2*poly_modulus_degree。(这里是指要求素数满足的条件)。Microsoft SEAL提供了一种辅助方法来查找这样的素数。在本例中,我们创建了一个支持批处理的20位素数。

parms.set_plain_modulus(PlainModulus::Batching(poly_modulus_degree, 20));
SEALContext context(parms);
print_parameters(context);
cout << endl;

我们可以通过查看由SEALContext创建的加密参数限定符来验证是否确实启用了批处理。

    auto qualifiers = context.first_context_data()->qualifiers();
    cout << "Batchi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值