CKKS加密简介

CKKS是目前比较流行的同态加密方案,出自于论文《Homomorphic encryption for arithmetic of approximate numbers》,名称是其作者的首字母简称。

CKKS相较于BGV和BFV,最大的优势是能够处理浮点数,甚至是复数。CKKS的明文域是复数向量。

其实,CKKS是基于BGV或者BFV构造的,其亮点,是编码。但是其编码需要的数学知识很复杂,在这里只是大概介绍一下。

首先,有一个多项式f(x)=x^d+1,其中d是2的整数次幂,也就是一个分圆多项式。构造环R=\mathbb{Z}[x]/f(x)。CKKS的明文空间\mathbb{C}^{\frac{d}{2}}(维度为d/2的复数向量)与环R是同构的。编码就是将明文从\mathbb{C}^{\frac{d}{2}}映射到环R上,使得加密的明文是一个多项式m。其解码是编码的逆过程。其具体过程是通过f(x)的单位本原根来实现的。把f(x)的本原根代入,每一个本原根对应向量中的一个值。实际上是两个本原根对应一个复数。然后,多项式的系数,得到一个实多项式。

但是,一个实多项式,并不能够直接加解密。所以呢,需要乘以一个大整数\Delta,然后借取整数部分,使之变为整数系数多项式。这样完全就可以使用BGV或者BFV来加密。但是,CKKS这里采用的并不是像BGV或者BFV采用的是噪声在一定范围内,是无误差解密的。CKKS采用的是有小差错的解密。也就是私钥和密文点乘以后,得到的结果是m+ee是一个小的噪声,也就是解密误差。但是,在解码的时候除以\Delta后,就可以将误差控制得非常小了。

在具体介绍CKKS的加解密时,首先介绍一下CKKS中提出的重缩放技术。CKKS是一个层次的加密,其乘法的深度在初始化参数中就已经确定。每一次重缩放操作,会在减少噪声的同时,降低密文的层次。将CKKS的深度记为L,那么我们需要一个递增的密文模序列\{q_0,q_1,q_2,...,q_L\},相邻密文模的商应该接近\Delta。每一次的重缩放操作,将密文从密文模q_l降到q_{l-1}。我描述为密文从q_l降到了q_{l-1}。具体做法是,假设密文为\mathbf{c},则重缩放后的密文\mathbf{c^\prime}=\lfloor \frac{q_{l-1}}{q_l}\rceil \mathbf{c} \mod q_{l-1}

接下来描述CKKS的密钥生成和加解密。

假设噪声分布为\chi是一个与安全级别\lambda有关的在环R上的离散高斯分布,\chi ^\prime是环R上的均匀随机分布。

密钥生成:在噪声\chi中采样得到s,则私钥sk=(1,s)。然后,在\chi ^\prime中采样得到aa^\prime,在\chi中采样得到ee^\prime,计算公钥pk=(b=-as+e,a),辅助密钥evk=-a^\prime s+e^\prime +Ps^2 \mod P \cdot q_L,其中P是一个大数。

加密m是编码过的明文多项式,在\chi ^\prime中采样得到v,在\chi中采样得到e_0e_1。则密文\mathbf{c}=v \cdot pk +(m+e_0,e_1) \mod q_L。注意,加密得到的新鲜密文都是q_L层的。

解密:\mathbf{c}=(c_0,c_1)q_l层的密文,则m+e=\mathbf{c} \cdot sk=c_0+c_1s \mod q_l,e是解密噪声。

重线性化:两个q_l层的密文(b_0,a_0)(b_1,a_1)相乘后,得到(d_0,d_1,d_2)=(b_0b_1,b_0a_1+b_1a_0,b_1a_1) \mod q_l\mathbf{c^\prime}=(d_0,d_1)+\lfloor P^{-1} \cdot d_2 \cdot evk \rceil \mod q_l,将三维的密文,变为两维,且私钥不变。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值