OpenFHE之BGV基本操作

BGV基本操作

本文将会介绍最基本的同态加密BGV的基本操作,包括加密,乘法,加法和解密。
在进行加密之前最麻烦的,也是用户最关心的就是参数的设置问题。同态加密的参数的设置是一个比较难的问题,需要对同态加密有一个比较深入的理解。所以,大多数同态密码库都给出了默认的参数设置。
首先设置一个参数变量来记录你要设置的参数:

CCParams<CryptoContextBGVRNS> parameters;

这里的 CryptoContextBGVRNS 是说你要构建一个BGV的方案。
下面介绍BGV必须要设置的几个参数。

明文模

这里的明文模是明文多项式的系数模。明文的运算是在有限域 Z p \mathbb{Z}_p Zp上,这里的明文模就是指 p p p。默认的明文模为0,但是0在实际中是不可以的,所以你必须设置一个明文模。一般会按照他推荐的来设置。建议默认为536903681。
语法为:

parameters.SetPlaintextModulus(536903681);

乘法深度

你要执行运算的乘法深度,如果把密文当作未知数,那么要计算的函数的最高次项的次数,就可以简单理解为乘法深度。比如 x 2 x^2 x2的乘法深度为2, x 3 x^3 x3乘法深度为3.
加密生成的密文层级为0,两个密文的乘法的层级为两个密文最大的层级加一。加法密文的层级为两个密文的层级中最大的。
乘法深度指在运算中密文可以达到的最大层级。你可以设更大一点,但是会降低效率。

parameters.SetMultiplicativeDepth(2);

生成加密上下文

加密上下文保存了一些公开的参数信息,是进行下面操作必须的。利用上文的参数,生成加密上下文。

CryptoContext<DCRTPoly> cryptoContext = GenCryptoContext(parameters);

开启需要使用的功能

OpenFHE需要你主动开启相应的功能,才能够进行加密、乘法等操作。
只需要加解密、加法和乘法的话,只需要下面几个就可以了。

cryptoContext->Enable(PKE);
cryptoContext->Enable(LEVELEDSHE);
cryptoContext->Enable(ADVANCEDSHE);

密钥生成

准备好参数以后,就可以生成密钥,然后进行加密了。
调用加密上下文的密钥生成算法,就可以生成公钥、私钥密码对:

KeyPair<DCRTPoly> keyPair;
//generate key
keyPair = cryptoContext->KeyGen();

这里的密钥对是使用 KeyPair 这个数据结构存储的,里面包含了公钥和私钥,可以直接进行访问:

keyPair.secretKey
keyPair.publicKey

由于我们需要乘法,所以,还需要为乘法生成一个计算密钥:

cryptoContext->EvalMultKeyGen(keyPair.secretKey);

生成乘法密钥是需要私钥的,生成后的计算密钥保存在加密上下文中。

编码

要加密的数据,需要编码乘明文多项式,才可以进行加密。
BGV一般支持加密整数,默认的一个明文多项式最多可以加密16384个整数。
假设我们有这样一个数组:

vector<int64_t> v1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

然后我们可以使用加密上下文进行编码:

Plaintext p1;
p1=cryptoContext->MakePackedPlaintext(v1);

返回的 Plaintext 实际上是一个多项式。

加密

调用加密上下文,使用公钥加密:

auto c1 = cryptoContext->Encrypt(keyPair.publicKey, p1);

密文的数据类型一半是 Ciphertext,如果你不关注具体的类型,可以直接使用 auto 让编译器自己推导类型。

加法和乘法

加法和乘法你可以调用加密上下文:

auto r1=cryptoContext->EvalAdd(c1,c1);
auto r2=cryptoContext->EvalMult(c1,c1);

也可以直接使用“*”和“+”,已经实现了密文运算符的重载:

auto mult=c1*c1;
auto sum=c1+c1;

解密

解密首先需要一个明文多项式类型的变量来接收解密结果,然后将指针传入,使用加密上下文和私钥来解密:

Plaintext ans_mul;
cryptoContext->Decrypt(keyPair.secretKey,mult,&ans_mul);

完整的示例

/*
OpenFHE test code by zyf.
basic operations of bgv.
basic_bgv.cpp
*/
#include<iostream>
#include"openfhe.h"
//The functions or classes of OpenFHE are in the namespace lbcrypto
using namespace lbcrypto;
using namespace std;

int main(){
    // set the parameters of bgv
    CCParams<CryptoContextBGVRNS> parameters;
    //plaintext modulus
    parameters.SetPlaintextModulus(536903681);
    //set the multiplication depth
    parameters.SetMultiplicativeDepth(4);
    CryptoContext<DCRTPoly> cryptoContext = GenCryptoContext(parameters);
    //enable the functions of scheme.
    cryptoContext->Enable(PKE);
    cryptoContext->Enable(LEVELEDSHE);
    KeyPair<DCRTPoly> keyPair;
    //generate key
    keyPair = cryptoContext->KeyGen();
    cryptoContext->EvalMultKeyGen(keyPair.secretKey);
    //original data
    vector<int64_t> v1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    //pack the original data to plaintext polynomial
    Plaintext p1;
    p1=cryptoContext->MakePackedPlaintext(v1);
    //encryption
    auto c1 = cryptoContext->Encrypt(keyPair.publicKey, p1);
    //homomorphic computation using ciphertext
    //x*x
    auto mult=c1*c1;
    //x+x
    auto sum=c1+c1;
    //decryption
    Plaintext ans_mul;
    cryptoContext->Decrypt(keyPair.secretKey,mult,&ans_mul);
    cout<<ans_mul<<endl;
    Plaintext ans_sum;
    cryptoContext->Decrypt(keyPair.secretKey,sum,&ans_sum);
    cout<<ans_sum<<endl;
}

附cmake文件

cmake_minimum_required (VERSION 3.5.1)

project(demo CXX)
set(CMAKE_CXX_STANDARD 17)
option( BUILD_STATIC "Set to ON to include static versions of the library" OFF)

find_package(OpenFHE)

set( CMAKE_CXX_FLAGS ${OpenFHE_CXX_FLAGS} )

include_directories( ${OPENMP_INCLUDES} )
include_directories( ${OpenFHE_INCLUDE} )
include_directories( ${OpenFHE_INCLUDE}/third-party/include )
include_directories( ${OpenFHE_INCLUDE}/core )
include_directories( ${OpenFHE_INCLUDE}/pke )
include_directories( ${OpenFHE_INCLUDE}/binfhe )
### add directories for other OpenFHE modules as needed for your project

link_directories( ${OpenFHE_LIBDIR} )
link_directories( ${OPENMP_LIBRARIES} )
if(BUILD_STATIC)
    set( CMAKE_EXE_LINKER_FLAGS "${OpenFHE_EXE_LINKER_FLAGS} -static")
    link_libraries( ${OpenFHE_STATIC_LIBRARIES} )
else()
    set( CMAKE_EXE_LINKER_FLAGS ${OpenFHE_EXE_LINKER_FLAGS} )
    link_libraries( ${OpenFHE_SHARED_LIBRARIES} )
endif()

add_executable(basic_bgv basic_bgv.cpp)

将 CMakeLists.txt 文件和 basic_bgv.cpp 文件放在一个目录,然后使用:

cmake .
make

就可以得到可执行文件basic_bgv。

### 回答1: axinterop.bgv2activexlib是一个在C#编程语言中使用的文件。它是由.bgv2文件转换成的互操作性程序集,用于在C#项目中与ActiveX控件进行交互。 ActiveX控件是一种可嵌入在网页或其他应用程序中的可视化组件,可以通过脚本语言或编程语言进行操作和交互。而axinterop.bgv2activexlib文件提供了一种在C#项目中操作ActiveX控件的方法。 使用axinterop.bgv2activexlib文件,开发人员可以在C#应用程序中直接引用和调用ActiveX控件的功能,通过创建ActiveX控件的实例对象,并调用其属性和方法来实现对控件的控制和操作。这样可以在C#项目中轻松地使用ActiveX控件,实现一些特定的功能需求。 在使用axinterop.bgv2activexlib时,开发人员需要先将.bgv2文件转换成对应的互操作性程序集,并将其添加到C#项目中的引用中。然后可以在代码中实例化该程序集,通过调用其提供的接口、属性和方法来操作ActiveX控件。 总之,axinterop.bgv2activexlib是一个帮助开发人员在C#项目中使用ActiveX控件的文件。它提供了一种简单、方便的方法,让开发人员能够直接使用C#编程语言与ActiveX控件进行交互和操作。 ### 回答2: axinterop.bgv2activexlib是一个AXInterop组件,它是为了方便在.NET平台中使用bgv2activexlib动态链接而创建的。 AXInterop是.NET平台中用于与ActiveX组件进行交互的一种技术。而bgv2activexlib则是一个ActiveX动态链接,它提供了一些特定的功能和接口供.NET开发者使用。 使用axinterop.bgv2activexlib可以实现在.NET平台下直接调用bgv2activexlib动态链接的功能。通过axinterop.bgv2activexlib,我们可以在.NET的开发环境中,轻松地创建bgv2activexlib的实例对象,并调用其提供的接口和方法。 一个常见的应用场景是,如果我们在.NET平台下进行开发,并需要使用到bgv2activexlib提供的某些功能,而又不想在.NET代码中直接调用COM接口,这时我们可以使用axinterop.bgv2activexlib来实现对bgv2activexlib的封装和调用。 总之,axinterop.bgv2activexlib是一个用于在.NET平台下与bgv2activexlib动态链接进行交互的组件,它简化了在.NET项目中使用bgv2activexlib的过程,方便了开发者的工作。 ### 回答3: axinterop.bgv2activexlib是一个用于.NET开发的Interop组件。该组件用于与ActiveX控件进行交互,使.NET应用程序能够调用和管理ActiveX控件。 AxInterop.bgv2activexlib是由.NET框架自动生成的Interop组件。当我们在Visual Studio中引入一个ActiveX控件时,Visual Studio会为该控件生成AxInterop.bgv2activexlib,以便我们可以在.NET应用程序中使用该控件。 AxInterop.bgv2activexlib提供了与ActiveX控件进行交互的接口和方法。我们可以使用该组件的对象模型来访问和操作ActiveX控件的属性、方法和事件。通过AxInterop.bgv2activexlib,我们可以实现与ActiveX控件的无缝集成,使得我们可以在.NET应用程序中使用ActiveX控件的功能和特性。 AxInterop.bgv2activexlib的使用非常简单。我们只需将组件添加到.NET项目的引用中,然后在代码中实例化Interop组件对象即可。通过该组件对象,我们可以调用ActiveX控件的方法、获取和设置其属性,以及处理其事件。 总之,AxInterop.bgv2activexlib是一个通过.NET框架生成的Interop组件,用于与ActiveX控件进行交互。它提供了访问和操作ActiveX控件的接口和方法,使得我们可以在.NET应用程序中轻松使用ActiveX控件的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值