RLWE同态加密编码打包——系数打包

2024-02-25 20:36

本文主要是介绍RLWE同态加密编码打包——系数打包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RLWE同态加密的明文域

RLWE的加密方案,如BGV、BFV,加密的对象,实际上是分圆多项式环上的一个整系数多项式。而我们在平时接触到的需要加密的数据,如图像或者工资,通常是一个数。所以,在使用RLWE同态加密时,需要将数转化为多项式,这就是同态加密的明文编码,或者叫做明文的打包。

打包并不是说将数直接映射到多项式就可以了,我们需要保持打包的同态性质,这样才能使得同态运算的结果保持真正的同态性质。本文主要介绍更适用于加密同态加密的打包方法,系数打包。也就是将剩余环 Z T \mathbb{Z}_T ZT中的元素映射到多项式环 Z T [ x ] / ( x N + 1 ) \mathbb{Z}_T[x]/(x^N+1) ZT[x]/(xN+1)上。

单系数打包

最朴素的思想就是,一个数对应于一个多项式。设需要加密的数为 a a a, 则,我们可以用 a a a构造一个多项式,使得打包是加法同态的。

  1. a a a作为多项式的一个系数,其他的系数随机生成。
  2. a a a切分到多个系数,剩余的系数使用随机数。

方法1

固定位置 i i i,构造的明文多项式的第 i i i个系数等于需要打包的明文 a a a

P = p 0 + p 1 x + p 2 x 2 + ⋯ + p i x i + ⋯ + p N − 1 x N − 1 P=p_0+p_1x+p_2x^2+\cdots+p_ix^i+\cdots+p_{N-1}x^{N-1} P=p0+p1x+p2x2++pixi++pN1xN1,其中 p i = a p_i=a pi=a.

接下来我们证明这种打包是加法同态的。
假设明文 b b b打包成的明文多项式为 Q = q 0 + q 1 x + q 2 x 2 + ⋯ + q i x i + ⋯ + p N − 1 x N − 1 Q=q_0+q_1x+q_2x^2+\cdots+q_ix^i+\cdots+p_{N-1}x^{N-1} Q=q0+q1x+q2x2++qixi++pN1xN1,其中 q i = b q_i=b qi=b.
那么 S = P + Q = ∑ j = 0 N − 1 ( p j + q j m o d T ) x j S=P+Q=\sum_{j=0}^{N-1}(p_j+q_j \mod T)x^j S=P+Q=j=0N1(pj+qjmodT)xj
加法并不会导致多项式的次数增加,所以 S S S的次数为 N − 1 N-1 N1.
所以 S S S的第 i i i个系数 s i ≡ a + b m o d T s_i\equiv a+b \mod T sia+bmodT.
也就是打包是加法同态的。

方法2

a a a切分成随机的 k k k份,然后将这 k k k份作为明文多项式的其中一部分系数。
a = a 0 + a 1 + ⋯ + a k − 1 m o d T a=a_0+a_1+\cdots+a_{k-1} \mod T a=a0+a1++ak1modT.
P = a 0 + a 1 x + ⋯ + a k − 1 x k − 1 + p k x k + p k + 1 x k + 1 + ⋯ + p N − 1 x N − 1 P=a_0+a_1x+\cdots+a_{k-1}x^{k-1}+p_kx^k+p_{k+1}x^{k+1}+\cdots+p_{N-1}x^{N-1} P=a0+a1x++ak1xk1+pkxk+pk+1xk+1++pN1xN1.
同样由于加法不会导致多项式次数增加,从而模 x N + 1 x^N+1 xN+1,所以这样的打包是加法同态的。

相比于方法1,这样打包可以使得当 T T T较小的时候,需要加密的数很大,而且需要的加法次数比较多的时候,能避免溢出,从而保持正确的结果。

SIMD系数打包

SIMD是单指令多数据(Single Instruction Multiple Data)的缩写。对应于打包,也就是将 d d d个数映射为一个多项式, d d d叫做打包的批次大小。SIMD系数打包是单系数打包的一般性推广,也就是单系数打包是打包批次为1时的SIMD打包。

设要加密的数据为 A = ( a 0 , a 1 , a 2 , ⋯ , a d − 1 ) A=(a_0,a_1,a_2,\cdots,a_{d-1}) A=(a0,a1,a2,,ad1),则 P = a 0 + a 1 x + a 2 x 2 + ⋯ + a d − 1 x d − 1 + p d x d + p d + 1 x d + 1 + ⋯ + p N − 1 x N − 1 P=a_0+a_1x+a_2x^2+\cdots+a_{d-1}x^{d-1}+p_dx^d+p_{d+1}x^{d+1}+\cdots +p_{N-1}x^{N-1} P=a0+a1x+a2x2++ad1xd1+pdxd+pd+1xd+1++pN1xN1
这样的打包方式,显然是加法同态的。

代码示例

在OpenFHE中实现了SIMD的系数打包,但是其效率并不是很高。
下面是一个怎么使用系数打包的例子。

/*
OpenFHE test code by zyf.
coefficient packing example of bgv.
*/
#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 bgvCCParams<CryptoContextBGVRNS> parameters;//plaintext modulusparameters.SetPlaintextModulus(536903681);//set the multiplication depthparameters.SetMultiplicativeDepth(4);CryptoContext<DCRTPoly> cryptoContext = GenCryptoContext(parameters);//enable the functions of scheme.cryptoContext->Enable(PKE);cryptoContext->Enable(LEVELEDSHE);//cryptoContext->Enable(ADVANCEDSHE);KeyPair<DCRTPoly> keyPair;//generate keykeyPair = cryptoContext->KeyGen();cryptoContext->EvalMultKeyGen(keyPair.secretKey);//cout<<"ring dimension "<<cryptoContext->GetCryptoParameters()->GetElementParams()->GetRingDimension()<<endl;//original datavector<int64_t> v1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};vector<int64_t> v2 = {-1, -2, -3, 1, 2, 3, 4, 5, 6, 7, 8, 9};//pack the original data to plaintext polynomialPlaintext p1,p2;p1=cryptoContext->MakeCoefPackedPlaintext(v1);p2=cryptoContext->MakeCoefPackedPlaintext(v2);//encryptionauto c1 = cryptoContext->Encrypt(keyPair.publicKey, p1);auto c2 = cryptoContext->Encrypt(keyPair.publicKey, p2);auto sum=c1+c2;//decryptionPlaintext ans_sum;cryptoContext->Decrypt(keyPair.secretKey,sum,&ans_sum);cout<<ans_sum<<endl;
}

这篇关于RLWE同态加密编码打包——系数打包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/746626

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

Java 中编码与解码的具体实现方法

《Java中编码与解码的具体实现方法》在Java中,字符编码与解码是处理数据的重要组成部分,正确的编码和解码可以确保字符数据在存储、传输、读取时不会出现乱码,本文将详细介绍Java中字符编码与解码的... 目录Java 中编码与解码的实现详解1. 什么是字符编码与解码?1.1 字符编码(Encoding)1

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获