BGV的SIMD编码

SIMD编码

同态加密的一个比较大的缺点就是密文太大,计算一次密文运算的时间长。直接降低一次密文操作的开销是困难的,于是很自然的一个想法就是能不能提高吞吐量。

SIMD的意思是,一次操作可以同时处理多个数据。我们将多个数映射到同一个明文多项式。BGV的明文域实际上是多项式。当我们的编码是同态的时候,我们就得到了一个SIMD的同态操作。

比如简单的系数打包 f 1 ( x ) = a 0 + a 1 x + a 2 x 2 , f 2 ( x ) = b 0 + b 1 x + b 2 x 2 f_1(x)=a_0+a_1x+a_2x^2,f_2(x)=b_0+b_1x+b_2x^2 f1(x)=a0+a1x+a2x2,f2(x)=b0+b1x+b2x2.
我们计算 f 1 ( x ) + f 2 ( x ) = ( a 0 + b 0 ) + ( a 1 + b 1 ) x + ( a 2 + b 2 ) x 2 f_1(x)+f_2(x)=(a_0+b_0)+(a_1+b_1)x+(a_2+b_2)x^2 f1(x)+f2(x)=(a0+b0)+(a1+b1)x+(a2+b2)x2.
这样,我们计算了一次多项式的加法,就得到了三个数据的和 a 0 + b 0 , a 1 + b 1 , a 2 + b 2 a_0+b_0,a_1+b_1,a_2+b_2 a0+b0,a1+b1,a2+b2.

但是系数打包并不是乘法同态的,乘法的时候,不同次项的系数会混在一起。

PackEncoding

假设BGV处理的多项式环为 R = Z p [ x ] / ( x N + 1 ) R=\mathbb{Z}_p[x]/(x^N+1) R=Zp[x]/(xN+1),其中 N = 2 d N=2^d N=2d, d d d是一个整数。明文域和密文域的多项式模是一样的,不同的是系数模。这里的 p p p是明文系数模,也就是我们需要计算的数据实际上是 Z p \mathbb{Z}_p Zp上的运算。

由于 Φ ( x ) = x N + 1 \Phi(x)= x^N+1 Φ(x)=xN+1是一个 2 N 2N 2N次分圆多项式,所以我们可以利用分圆多项式的特殊性质来构造 R R R的一个同态分解。

假设 w w w Φ ( x ) \Phi(x) Φ(x)的单位原根,也就是 w N = − 1 w^N=-1 wN=1. 当 p = 2 N k + 1 , k ∈ Z + p=2Nk+1, k \in \mathbb{Z}^+ p=2Nk+1,kZ+并且 p p p是一个素数时。 Φ ( x ) \Phi(x) Φ(x)刚好有 N N N个单元原根。 w = w 1 , w 2 , ⋯   , w N w=w_1,w_2,\cdots,w_N w=w1,w2,,wN.

所以,我们可以根据这个构造打包方法。 f ( w 1 ) = a 1 , f ( w 2 ) = a 2 , ⋯   , f ( w N ) = a N f(w_1)=a_1,f(w_2)=a_2,\cdots,f(w_N)=a_N f(w1)=a1,f(w2)=a2,,f(wN)=aN,这样根据多项式插值,可以得到唯一的一个 N − 1 N-1 N1次多项式,也就是我们的明文多项式 f ( x ) f(x) f(x).

由于我们在计算多项式的乘法的时候,多项式的次数会增加,而我们是在换上进行的运算,所以会模多项式 x N + 1 x^N+1 xN+1. 也就是将结果多项式中的 x N x^N xN替换为 − 1 -1 1,因为在环 R R R x N + 1 = 0 x^N+1=0 xN+1=0.
但是我们注意到 w i N = − 1 w_i^N=-1 wiN=1,所以,模多项式并不会影响在原根处的求值结果。

现在我们证明这样是全同态的,设 f 1 ( w i ) = a i , f 2 ( w i ) = b i f_1(w_i)=a_i,f_2(w_i)=b_i f1(wi)=ai,f2(wi)=bi,
加法:
a + b = f 1 ( w i ) + f 2 ( w i ) = ( f 1 + f 2 ) ( w i ) a+b=f_1(w_i)+f_2(w_i)=(f_1+f_2)(w_i) a+b=f1(wi)+f2(wi)=(f1+f2)(wi).
乘法:
a b = f 1 ( w i ) f 2 ( w i ) = ( f 1 f 2 ) ( w i ) ab=f_1(w_i)f_2(w_i)=(f_1f_2)(w_i) ab=f1(wi)f2(wi)=(f1f2)(wi).

OpenFHE代码示例

OpenFHE中的PackEncoding使用的就是上面的方法。注意的是,我们在选择参数的时候,明文模需要满足上述条件, 2 N 2N 2N必须整除$p-1.

这里用的是openfhe的python库openfhe-python

from openfhe import *
parameters = CCParamsBGVRNS()
parameters.SetPlaintextModulus(536903681)
parameters.SetMultiplicativeDepth(4)

crypto_context = GenCryptoContext(parameters)
# Enable features that you wish to use
crypto_context.Enable(PKESchemeFeature.PKE)
crypto_context.Enable(PKESchemeFeature.KEYSWITCH)
crypto_context.Enable(PKESchemeFeature.LEVELEDSHE)

# Sample Program: Step 2: Key Generation

# Generate a public/private key pair
key_pair = crypto_context.KeyGen()
crypto_context.EvalMultKeyGen(key_pair.secretKey)
vector_of_ints1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
plaintext1 = crypto_context.MakePackedPlaintext(vector_of_ints1)

# Second plaintext vector is encoded
vector_of_ints2 = [-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12]
plaintext2 = crypto_context.MakePackedPlaintext(vector_of_ints2)

c1 = crypto_context.Encrypt(key_pair.publicKey, plaintext1)
c2 = crypto_context.Encrypt(key_pair.publicKey, plaintext2)

# Homomorphic additions
ciphertext_add12 = crypto_context.EvalAdd(c1, c2)

# Homomorphic Multiplication
ciphertext_mult12 = crypto_context.EvalMult(c1, c2)

plaintext_add_result = crypto_context.Decrypt(ciphertext_add12,key_pair.secretKey)
plaintext_mult_result = crypto_context.Decrypt(ciphertext_mult12,key_pair.secretKey)

print(plaintext_add_result)
print(plaintext_mult_result)

  • 23
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答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控件的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值