HElib-1 : 简单的密文相加

编译好HElib库后,直接在src文件夹下进行相关测试文件的编写。
本文翻译自:
https://mshcruz.wordpress.com/2016/06/17/2-3-using-helib/

该文章利用HElib库实现两个数相加。

首先,看一些参数的初始化:

long p = 1021; // Plaintext base [default=2], should be a prime number
long r = 1;    // Lifting [default=1]
long L = 16;   // Number of levels in the modulus chain [default=heuristic]
long c = 3;    // Number of columns in key-switching matrix [default=2]
long w = 64;   // Hamming weight of secret key
long d = 0;    // Degree of the field extension [default=1]
long k = 128;  // Security parameter [default=80]
long s = 0;    // Minimum number of slots [default=0]
long m = FindM(k,L,c,p, d, s, 0); //Specific modulus

之后,创建一个FHEcontext对象来保存所有参数:

FHEcontext context(m, p, r);
buildModChain(context, L, c);

创建一个多项式用来加密:

ZZX G = context.alMod.getFactorsOverZZ()[0];

利用context来生成公钥和私钥:

FHESecKey secretKey(context);
const FHEPubKey& publicKey = secretKey;
secretKey.GenSecKey(w);

加密,利用Ctxt类来保存密文:

Ctxt ctx1(publicKey);
Ctxt ctx2(publicKey);

publicKey.Encrypt(ctx1, to_ZZX(2));
publicKey.Encrypt(ctx2, to_ZZX(3));

密文运算:

Ctxt ctSum = ctx1;
ctSum += ctx2;

创建一个多项式来保存解密的结果:

ZZX ptSum;
secretKey.Decrypt(ptSum, ctSum);

以下是完整的代码,编写文件SimpleFHESum.cpp:

#include "FHE.h"
#include <iostream>

using namespace std;

int main(int argc, char **argv)
{
    long p = 1021;
    long r = 1;
    long L = 4;
    long c = 2;
    long k = 80;
    long s = 0;
    long d = 0;
    long w = 64;

    cout << "finding m..." << flush;
    long m = FindM(k,L,c,p,d,s,0);
    cout << "m = "<< m << endl;

    cout << "Initializing context..." << flush;
    FHEcontext context(m,p,r);  //initialize context
    buildModChain(context, L, c);  //modify the context
    cout << "OK!" << endl;

    cout << "Creating polynomial..." << flush;
    ZZX G = context.alMod.getFactorsOverZZ()[0];  //creates the polynomial used to encrypted the data
    cout << "OK!" << endl;

    cout << "Generating keys..." << flush;
    FHESecKey secretKey(context);  //construct a secret key structure
    const FHEPubKey& publicKey = secretKey;  //An "upcast": FHESecKey is a subclass of FHEPubKey
    secretKey.GenSecKey(w);  //actually generate a secret key with Hamming weight w
    cout << "OK!" << endl;


    Ctxt ctxt1(publicKey);
    Ctxt ctxt2(publicKey);

    publicKey.Encrypt(ctxt1, to_ZZX(2));  //encrypt the value 2
    publicKey.Encrypt(ctxt2, to_ZZX(3));  //encrypt the value 3

    Ctxt ctSum = ctxt1;  //create a ciphertext to hold the sum and initialize it with Enc(2)
    ctSum += ctxt2;

    ZZX ptSum;  //create a ciphertext to hold the plaintext of the sum
    secretKey.Decrypt(ptSum, ctSum);

    cout << "2 + 3 = " << ptSum[0] << endl;

    return 0;

之后生成可执行文件:
make SimpleFHESum_x

<think>嗯,用户想了解同态加密算法的实现或解释。首先,我得回忆一下同态加密的基本概念。同态加密允许在加密数据上直接进行计算,解密后结果与明文计算一致。这个技术在隐私保护领域非常重要,比如云计算和安全多方计算。 然后,我需要考虑用户的需求层次。他们可能不仅仅是想要理论解释,还希望了解具体的实现方法,或者现有的库和框架。可能涉及到的算法有BFV、BGV、CKKS等,这些都是常见的同态加密方案。 接下来,用户提供的引用中提到了Palisade库和多项式程序到算术的映射,这可能涉及到如何将算法转化为多项式系统,再通过有限域上的加密来实现。引用[1]提到将程序编码为多项式系统,并在有限域上进行加密,这可能与同态加密的实现相关,尤其是基于RLWE(环上带错误学习)问题的方案,如BFV和CKKS。 用户可能对实现的具体步骤感兴趣,比如参数生成、密钥生成、加密解密流程,以及同态操作如加法和乘法。需要分步骤解释,并给出代码示例,比如使用Palisade库的代码片段,这样用户能更直观地理解。 另外,用户可能不清楚不同同态加密方案之间的区别,比如BFV适用于整数运算,而CKKS适合浮点数近似计算。需要解释这些差异,帮助用户选择合适的方案。 安全问题也是需要考虑的,比如参数选择对安全性的影响,噪声管理的问题。同态加密中的噪声随着计算增长,可能导致解密失败,因此需要讨论如何通过模切换和自举来优化。 最后,生成相关问题可以帮助用户进一步探索,比如性能优化、应用场景和开源库比较。确保引用正确,引用[1]和引用[2]中的内容需要自然地融入回答,特别是关于Palisade库的实现细节和多项式到算术的映射。</think>### 同态加密算法(HE)的实现与解释 同态加密(Homomorphic Encryption, HE)允许直接对密文进行计算,解密结果与对明文进行相同操作的结果一致。这一特性使其在隐私计算、安全外包计算等领域有重要应用[^1]。以下是其核心实现原理及关键步骤: --- #### 一、同态加密的分类 1. **部分同态加密(PHE)**:仅支持加法或乘法中的一种操作,如RSA(仅乘法)[^1]。 2. **类同态加密(SHE)**:支持有限次数的加法和乘法操作。 3. **全同态加密(FHE)**:支持任意次数的加法和乘法操作,如BFV、BGV、CKKS方案[^2]。 --- #### 二、基于RLWE的FHE实现(以BFV方案为例) BFV(Brakerski/Fan-Vercauteren)方案基于**环上带错误学习问题(RLWE)**,其实现步骤如下: 1. **参数生成** 选择多项式环$R_q = \mathbb{Z}_q[x]/(x^n + 1)$,其中$n$为2的幂次,$q$为模数。 需满足$q \gg t$(明文模数)以控制噪声增长。 2. **密钥生成** ```python # 伪代码示例(基于PALISADE库) from palisade import CryptoContext, KeyPair cc = CryptoContext.BFVrn(1024, 20) # 参数:多项式阶, 模数比特数 key_pair = cc.KeyGen() public_key = key_pair.publicKey secret_key = key_pair.secretKey ``` 3. **加密与解密** - **加密明文$m$**: $$c = (pk[0] \cdot u + e + \Delta m, pk[1] \cdot u + e') \in R_q^2$$ 其中$u$为随机多项式,$e,e'$为小噪声,$\Delta = \lfloor q/t \rfloor$。 - **解密密文$c$**: $$m' = \left\lfloor \frac{t}{q} \cdot \langle c, sk \rangle \right\rceil \mod t$$ 4. **同态操作** - **加法**:对应密文多项式分量相加- **乘法**:通过张量积和重线性化(Relinearization)实现,需引入评估密钥。 --- #### 三、关键技术挑战与优化 1. **噪声管理** 噪声随计算次数指数增长,需通过**模切换(Modulus Switching)**和**自举(Bootstrapping)**降低噪声。 2. **计算效率** 使用**数论变换(NTT)**加速多项式乘法,时间复杂度从$O(n^2)$降至$O(n \log n)$。 3. **参数选择** 安全性与效率的权衡,例如更大的$n$提高安全性但降低计算速度。 --- #### 四、开源实现库 1. **PALISADE**:支持BFV、BGV、CKKS等多种方案,提供C++接口[^2]。 2. **Microsoft SEAL**:轻量级库,适合嵌入式场景。 3. **HElib**:基于BGV方案,支持自举操作。 ```cpp // SEAL库加密示例 #include "seal/seal.h" using namespace seal; EncryptionParameters parms(scheme_type::bfv); parms.set_poly_modulus_degree(4096); parms.set_coeff_modulus(CoeffModulus::BFVDefault(4096)); SEALContext context(parms); KeyGenerator keygen(context); PublicKey public_key = keygen.public_key(); SecretKey secret_key = keygen.secret_key(); Encryptor encryptor(context, public_key); Decryptor decryptor(context, secret_key); ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值