CKKS同态加密通用函数近似方法和openFHE实现
摘要
同态加密可以直接在密文上进行运算,尤其是CKKS,可以直接在实数的密文上进行运算。服务器可以利用强大的计算能力,在不泄露用户隐私的情况下,为用户提供便捷的外包运算服务。然而,CKKS只能进行算术运算(多项式函数),无法直接计算很多复杂的函数。本文介绍了如何使用CKKS计算近似任意函数,并介绍了利用openFHE进行代码实现。
多项式近似
根据魏尔斯特拉斯近似定理,定义在闭区间上的连续函数可被多项式函数任意接近地一致近似。也就是当多项式的次数足够高的时候,在闭区间上的任意一点,我们都可以得到非常好的近似结果。
因此,使用同态加密解决问题的一般流程如下:

多项式近似在同态加密的应用中具有非常重要的地位。
常用的多项式近似方法有:Remes近似、切比雪夫多项式近似、泰勒展开、最小二乘法等。其中切比雪夫多项式逼近可以最大限度地降低龙格现象,也就是不会在某一点上的误差特别大。
当然,并不是所有函数都可以这样做,因为很多函数不是连续的,比如符号函数,取模函数等。这些函数在某些区间上可以得到很好的近似,但是在断点附近,会产生很大的误差。这种函数通常的做法是,使用复合函数(逼近符号函数),或者首先使用三角函数等基本的连续函数去逼近(如取模函数),然后再使用多项式逼近。
openFHE实现
openFHE实现了一个使用切比雪夫多项式逼近的函数接口,官方例子。
密文上下文对象的 EvalChebyshevFunction 函数实现了任意函数的切比雪夫多项式近似。其输入为一个函数,需要计算的密文,输入区间的下界和上界,切比雪夫多项式的次数。
作为输入的函数,其参数是一个 double 类型的变量,输出是 double ,下面是一个例子:
double func(double x ){return std::sin(x);
}
输入密文需要留有足够的乘法深度。乘法的深度和切比雪夫多项式的次数有关系,下面是openFHE官方给的表格:

具体的多项式计算采用了树结构,所以多项式度数和乘法深度大约是对数关系。
近似是否准确,主要取决于两个因素,一个是输入的区间范围,一个是多项式的次数。多项式的次数越高,那么计算需要的时间越长。理论上的近似精度会更高,但这只是从全局的误差来看,具体的某个点的误差则不确定。
输入区间的范围对近似精度的影响非常大,所以,在选择区间的时候,需要格外注意。
下面是我从openFHE的GitHub上下载的代码,小改后的版本:
#include<iostream>
#include"openfhe.h"
//The functions or classes of OpenFHE are in the namespace lbcrypto
using namespace lbcrypto;
using namespace std;double modfunc(double x){return sqrt(x);
}void EvalFunctionExample() {std::cout << "--------------------------------- EVAL SQUARE ROOT FUNCTION ---------------------------------"<< std::endl;CCParams<CryptoContextCKKSRNS> parameters;// We set a smaller ring dimension to improve performance for this example.// In production environments, the security level should be set to// HEStd_128_classic, HEStd_192_classic, or HEStd_256_classic for 128-bit, 192-bit,// or 256-bit security, respectively.parameters.SetSecurityLevel(HEStd_128_classic);//parameters.SetRingDim(1 << 10);
#if NATIVEINT == 128usint scalingModSize = 78;usint firstModSize = 89;
#elseusint scalingModSize = 50;usint firstModSize = 60;
#endifparameters.SetScalingModSize(scalingModSize);parameters.SetFirstModSize(firstModSize);// Choosing a higher degree yields better precision, but a longer runtime.uint32_t polyDegree=50;// The multiplicative depth depends on the polynomial degree.// See the FUNCTION_EVALUATION.md file for a table mapping polynomial degrees to multiplicative depths.uint32_t multDepth = 13;parameters.SetMultiplicativeDepth(multDepth);CryptoContext<DCRTPoly> cc = GenCryptoContext(parameters);cc->Enable(PKE);cc->Enable(KEYSWITCH);cc->Enable(LEVELEDSHE);// We need to enable Advanced SHE to use the Chebyshev approximation.cc->Enable(ADVANCEDSHE);auto keyPair = cc->KeyGen();// We need to generate mult keys to run Chebyshev approximations.cc->EvalMultKeyGen(keyPair.secretKey);std::vector<std::complex<double>> input{1, 2, 3, 4, 5, 6, 7, 8, 9};size_t encodedLength = input.size();Plaintext plaintext = cc->MakeCKKSPackedPlaintext(input);auto ciphertext = cc->Encrypt(keyPair.publicKey, plaintext);double lowerBound = 0;double upperBound = 10;// We can input any lambda function, which inputs a double and returns a double.//auto result = cc->EvalChebyshevFunction([](double x) -> double { return std::sqrt(x); }, ciphertext, lowerBound,upperBound, polyDegree);auto result = cc->EvalChebyshevFunction(modfunc, ciphertext, lowerBound,upperBound, polyDegree);Plaintext plaintextDec;cc->Decrypt(keyPair.secretKey, result, &plaintextDec);plaintextDec->SetLength(encodedLength);std::vector<std::complex<double>> expectedOutput({sqrt(1), sqrt(2), sqrt(3), sqrt(4), sqrt(5), sqrt(6), sqrt(7), sqrt(8), sqrt(9)});std::cout << "Expected output\n\t" << expectedOutput << std::endl;std::vector<std::complex<double>> finalResult = plaintextDec->GetCKKSPackedValue();std::cout << "Actual output\n\t" << finalResult << std::endl << std::endl;
}int main(){EvalFunctionExample();
}
下面是lowerBound=0, upperBound=10时的结果:

下面是lowerBound=0, upperBound=20时的结果:

下面是lowerBound=0, upperBound=100时的结果:

相关文章:
CKKS同态加密通用函数近似方法和openFHE实现
摘要 同态加密可以直接在密文上进行运算,尤其是CKKS,可以直接在实数的密文上进行运算。服务器可以利用强大的计算能力,在不泄露用户隐私的情况下,为用户提供便捷的外包运算服务。然而,CKKS只能进行算术运算࿰…...
Webpack 5的新特性:Asset Modules与Dynamic Import
文章目录 Asset ModulesAsset Modules 类型配置示例分析 Dynamic Import动态导入语法配置示例分析 实际案例分析Asset Modules 实际案例Dynamic Import 实际案例 性能优化Asset Modules 性能优化Dynamic Import 性能优化 详细代码分析Asset Modules 代码分析Dynamic Import 代码…...
解释python requests包的timeout
解释python requests包的timeout 哈哈哈。。。。垃圾python又来了 1 问题 你能看懂下面两个timeout的含义就不用看下面的内容了。 requests.get(http://example.com, timeout(2, 5)) requests.get(http://127.0.0.1:5000/api,timeout1)官网解释!!&am…...
蒙语学习快速方法,速记蒙语单词怎么学习更高效!
要高效学习蒙古语和速记单词,首先要掌握基础知识,如字母表和发音规则。接着,专注于学习日常用语和基础词汇,并运用记忆技巧如联想、发音和构词法来帮助记忆。利用专门的学习软件,如“蒙语学习通”,可以提供…...
Vue3组件通信13种方法
在 Vue3 中,组件之间的通信是构建应用程序的关键 1. 父组件向子组件传递数据 (Props)「父组件:」「子组件:」 2. 子组件向父组件传递数据 (Emit)「父组件:」「子组件:」 3. 兄弟组件通信 (Mitt)「发送事件的组件:」「接收事件的组件:」 4. 透传 Attributes ($attrs)「父组件:」…...
Servlet入门:服务端小程序的初试(自己学习整理的资料)
目录 一.前言 二.建立基础结构编辑 三.具体步骤 找到Tomcat文件并打开Tomcat。 在webapps中创建一个自己的文件夹。 在classes中新建一个Java文件。 在lib中导入需要的jar文件包。 配置环境变量 在Java文件的目录下打开cmd并输入 javac -d . HelloServlet.java进行…...
代码随想录算法训练营第三七天| 动态规划:完全背包理论基础 518.零钱兑换II 377. 组合总和 Ⅳ 322. 零钱兑换
今日任务 动态规划:完全背包理论基础 518.零钱兑换II 377. 组合总和 Ⅳ 322. 零钱兑换 518.零钱兑换II 题目链接: . - 力扣(LeetCode) class Solution {public int change(int amount, int[] coins) {int[] dp new int[amount …...
[报错解决] 运行MATCHA时需要在线下载Arial.TTF字体,但是无法连接huggingface
一、报错详情 requests.exceptions.ConnectTimeout:(MaxRetryError("HTTPSConnectionPool(hosthuggingface.co, port443): Max retries exceeded with url: /ybelkada/fonts/resolve/main/Arial.TTF (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnec…...
B-树(不是B减树)原理剖析(1)
目录 B树的主要特性: B树的操作: B树的优点: 为什么要发明出B-树? B树的概念和原理剖析 原理图讲解(部分讲解在图中) 初始化结点: 处理数据数量计算(了解) 底层代码实现(加深理解) 前些日子我们学了AVl树&…...
【shell脚本8】Shell脚本学习--其他
目录 编辑 Shell输入输出重定向 重定向深入讲解 Here Document Shell输入输出重定向 Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端&…...
《深度学习》ResNet残差网络、BN批处理层 结构、原理详解
目录 一、关于ResNet 1、什么是ResNet 2、传统卷积神经网络存在的问题 1)梯度消失和梯度爆炸问题 2)训练困难 3)特征表示能力受限 4)模型复杂度和计算负担 3、如何解决 1)解决梯度问题 BN层重要步骤: 2…...
javadoc:jdk 9通过javadoc API读取java源码中的注释信息(comment)
几年前写过一博客:《java:通过javadoc API读取java源码中的注释信息(comment)》,简单介绍了通过javadoc API读取源码注释的流程。 那时还是用JDK 1.8。但是在JDK9环境下JDK 1.8的那一套API就不能用了。JDK 9提供了一套新的javadoc API实现注释代码的读取…...
nordic使用FDS保存数据需要注意的地方
FDS使用常见问题 大家在使用FDS模块时,经常碰到的问题有如下几种: FDS不支持掉电保护,所以在Flash操作过程中出现了掉电,FDS行为将未知OTA的时候,新固件的FDS page数目一定要等于老固件的FDS page数,否则将出现不可知行为fds_record_write或者fds_record_update后,强烈…...
docker-compose集群(单机多节点)环境搭建与使用
此方案已经经过生产环境验证,可放心大胆使用如果喜欢,欢迎点赞👍收藏❤️评论噢~ 略去 Docker 和 Docker Compose 安装部分,如果有需要的同学,可以评论,创建 docker-compose.yml 文件并配置 Nacos 集群和 M…...
从静态多态、动态多态到虚函数表、虚函数指针
多态(Polymorphism)是面向对象编程中的一个重要概念,它允许不同类的对象对同一消息做出不同的响应。多态性使得可以使用统一的接口来操作不同类的对象,从而提高了代码的灵活性和可扩展性。 一、多态的表现形式 1. 静态多态&…...
用 Pygame 实现一个乒乓球游戏
用 Pygame 实现一个乒乓球游戏 伸手需要一瞬间,牵手却要很多年,无论你遇见谁,他都是你生命该出现的人,绝非偶然。若无相欠,怎会相见。 引言 在这篇文章中,我将带领大家使用 Pygame 库开发一个简单的乒乓球…...
基于大数据可视化的化妆品推荐及数据分析系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...
Java项目实战II基于Java+Spring Boot+MySQL的汽车销售网站(文档+源码+数据库)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化时…...
数学基础 -- 微积分最优化之一个最简单的例子
微积分中的一个最简单的最优化例子 问题描述 假设你有一条长度为 10 米的栅栏,你需要围成一个矩形的鸡舍,使得围成的面积最大。求这个矩形的长和宽应是多少,以使得面积最大。 步骤 设定变量: 设矩形的长为 x x x 米࿰…...
kubernetes K8S 结合 Istio 实现流量治理
目录 1.Istio介绍? 1.1 Istio是什么? 1.2 Istio流量管理 1.2.1 熔断 1.2.2 超时 1.2.3 重试 2.Istio架构 3.istio组件详解 3.1 Pilot 3.2 Envoy 3.3 Citadel 3.4 Galley 3.5 Ingressgateway 3.5 egressgateway 扩展、k8s1.23及1.23以下版…...
FastAPI CSP:实现配置的终极指南
FastAPI CSP:实现配置的终极指南 【免费下载链接】fastapi FastAPI framework, high performance, easy to learn, fast to code, ready for production 项目地址: https://gitcode.com/GitHub_Trending/fa/fastapi FastAPI是一个高性能、易于学习、快速编码…...
千问3.5-2B在物流场景:运单图片自动识别+收发件信息结构化
千问3.5-2B在物流场景:运单图片自动识别收发件信息结构化 1. 物流行业的痛点与机遇 每天,物流企业需要处理数以百万计的运单信息录入工作。传统的人工录入方式存在三个明显问题: 效率低下:一个熟练的录入员每小时最多处理50-80…...
Delayed Job测试策略完整指南:如何在开发和测试环境中高效测试异步任务
Delayed Job测试策略完整指南:如何在开发和测试环境中高效测试异步任务 【免费下载链接】delayed_job 项目地址: https://gitcode.com/gh_mirrors/de/delayed_job Delayed Job是Ruby on Rails生态系统中最受欢迎的异步任务处理库之一,它让开发者…...
探索CVE-rs:安全漏洞数据库的 Rust 实现
探索CVE-rs:安全漏洞数据库的 Rust 实现 【免费下载链接】cve-rs Blazingly 🔥 fast 🚀 memory vulnerabilities, written in 100% safe Rust. 🦀 项目地址: https://gitcode.com/GitHub_Trending/cv/cve-rs 项目简介 是一…...
Cogito 3B实战案例:GitHub PR描述自动生成+变更点总结
Cogito 3B实战案例:GitHub PR描述自动生成变更点总结 1. 快速了解Cogito 3B模型 Cogito v1预览版是Deep Cogito推出的混合推理模型系列,这个3B版本在大多数标准基准测试中都表现出色,超越了同等规模的其他开源模型。简单来说,它…...
HoRain云--Vue3组件开发:从入门到精通的终极指南
🎬 HoRain 云小助手:个人主页 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。 目录 ⛳️ 推荐 …...
3分钟让Windows文件资源管理器焕然一新:ExplorerBlurMica毛玻璃效果完全指南
3分钟让Windows文件资源管理器焕然一新:ExplorerBlurMica毛玻璃效果完全指南 【免费下载链接】ExplorerBlurMica Add background Blur effect or Acrylic (Mica for win11) effect to explorer for win10 and win11 项目地址: https://gitcode.com/gh_mirrors/ex/…...
Anything to RealCharacters效果评测:与Stable Diffusion ControlNet写实方案对比
Anything to RealCharacters效果评测:与Stable Diffusion ControlNet写实方案对比 1. 项目概述 Anything to RealCharacters是一款专为RTX 4090显卡优化的2.5D转真人图像转换系统。这个工具基于通义千问Qwen-Image-Edit-2511图像编辑底座,集成了专门的…...
intv_ai_mk11开源模型教程:7B Llama架构对话机器人在GPU云上的安全沙箱实践
intv_ai_mk11开源模型教程:7B Llama架构对话机器人在GPU云上的安全沙箱实践 1. 什么是intv_ai_mk11对话机器人 intv_ai_mk11是一个基于7B参数Llama架构的AI对话助手,专门设计运行在GPU云服务器环境中。这个模型经过优化,能够在保持较高响应…...
Python安全开发之简易Xss检测工具(详细注释)
核心代码:import requests # requests 库 - HTTP 请求处理库 # 【常用功能】: # requests.get(url) - 发送 HTTP GET 请求 # requests.post(url, data) - 发送 HTTP POST 请求 # response.text - 获取响应体内容(字符串) #…...
