一、bfv_basics

目录

  • 一、加密参数 EncryptionParameters类
    • 1. 三个重要的参数
    • 2. 参数的作用
    • 3. 同态加密方案
    • 4. 多项式模数的度 poly_modulus_degree (n)
    • 5. 密文模数 coeff_modulus (q)
    • 6. 明文模数 plain_modulus (t,这是 BFV 方案才有的,CKKS 没有)
  • 二、上下文 SEALContext 类
  • 三、密钥生成 KeyGenerator 类
  • 四、加密 Encryptor 类
  • 五、评估 Evaluator 类
  • 六、解密 Decryptor 类
  • 七、实例


一、加密参数 EncryptionParameters类

1. 三个重要的参数

表示含义
poly_modulus_degreen 多项式模数的度
coeff_modulusq 密文模数
plain_modulust 明文模数

2. 参数的作用

  1. 每个密文都有一个特定的量,称为 “噪声预算”,以 为单位测量。
  2. 噪声预算 是由 加密参数 决定的。
  3. 同态操作 消耗噪声预算的速率 也由 加密参数 决定。

3. 同态加密方案

 在 SEAL 中,同态加密方案的表示为:

  1. BFV 方案:scheme_type::bfv
  2. CKKS 方案:scheme_type::ckks
    EncryptionParameters parms(scheme_type::bfv);

例如:EncryptionParameters parms(scheme_type::bfv);

4. 多项式模数的度 poly_modulus_degree (n)

  • 这必须是 2 的正整数幂,表示 2 的幂次分圆多项式的度。暂时没有必要理解这意味着什么。
  • n 越大,密文大小 越大,同态操作 越慢,支持更复杂的加密计算。
  • 推荐的值有:1024、2048、4096 … …
    size_t poly_modulus_degree = 4096;parms.set_poly_modulus_degree(poly_modulus_degree);

5. 密文模数 coeff_modulus (q)

  • 这个参数是一个 大整数,它是 不同素数的 乘积每个素数 最多 60 位。它表示为 这些素数的 向量,每个素数由 Modulus类 的实例表示。coeff_modulus位长度 意味着其 素因子位长度的 总和
  • q 越大,噪声预算 越大。
  • q 的总位长n 决定,可自己定,也可以通过 CoeffModulus::BFVDefault(poly_modulus_degree) 来自动返回一个好的选择。
    parms.set_coeff_modulus(CoeffModulus::BFVDefault(poly_modulus_degree));

6. 明文模数 plain_modulus (t,这是 BFV 方案才有的,CKKS 没有)

  • 明文模数可以是 任何正整数,但是实际上,在许多情况下,人们可能希望它是素数。
  • 新的加密密文的 噪声预算大小 的计算方法为: l o g 2 ( c o e f f _ m o d u l u s p l a i n _ m o d u l u s ) = l o g 2 ( q t ) ( 位 ) log_2(\frac{coeff\_modulus}{plain\_modulus}) = log_2(\frac{q}{t}) \ \ \ (位) log2(plain_moduluscoeff_modulus)=log2(tq)   ()所以为了获得最佳性能,尽量保持 明文数据类型尽可能小 是至关重要的。
    parms.set_plain_modulus(1024);

二、上下文 SEALContext 类

  • 所有加密 参数 设置好后,就可以构造 SEALContext 对象 了,它会检查 加密参数兼容性和安全性
    SEALContext context(parms);/*打印我们选择的参数。*/print_line(__LINE__);cout << "设置加密参数并打印" << endl;print_parameters(context);/*当参数用于创建SEALContext时,Microsoft SEAL将首先验证这些参数。这里选择的参数是有效的。*/cout << "参数验证(成功):" << context.parameter_error_message() << endl;

三、密钥生成 KeyGenerator 类

  • 我们现在准备生成 私钥公钥。为此我们需要 KeyGenerator 类 的实例。
  • 构造 KeyGenerator 会自动生成 私钥。然后我们可以使用 KeyGenerator::create_public_key 为其创建 任意多个 公钥
  • 注意 KeyGenerator::create_public_key 有另一个重载,它不接受参数并返回 Serializable<PublicKey> 对象。我们将在 ‘6 serialization’ 中讨论这一点。
   // 创建密钥生成器,构造时自动生成私钥KeyGenerator keygen(context);// 获取自动生成的私钥SecretKey secret_key = keygen.secret_key();// 声明公钥对象PublicKey public_key;// 基于秘钥生成对应的公钥keygen.create_public_key(public_key);

四、加密 Encryptor 类

  • 为了能够加密,我们需要构造 Encryptor 实例。注意 Encryptor 只需要 公钥,这是预期的。
    // 创建加密器,使用公钥进行加密操作Encryptor encryptor(context, public_key);

五、评估 Evaluator 类

  • 对密文的计算 使用 Evaluator 类 执行。
  • 在实际用例中,Evaluator 不会由 持有秘钥 的同一方构造。
    // 创建计算器,用于对密文执行同态运算Evaluator evaluator(context);

六、解密 Decryptor 类

  • 构造 Decryptor 的实例。注意 Decryptor 需要 私钥
    // 创建解密器,使用秘钥进行解密操作Decryptor decryptor(context, secret_key);

七、实例

    cout << "~~~~~~ 计算4(x^2+1)(x+1)^2的更好方法。~~~~~~" << endl;/*噪声预算已达到 0,这意味着不能期望解密给出正确结果。这是因为密文x_sq_plus_one和x_plus_one_sq由于先前的平方运算都由3个多项式组成,对大密文的同态运算比对小密文的计算消耗更多噪声预算。对较小密文的计算在计算上也显著更便宜。"重线性化"是一种操作,它在乘法后将密文的大小减小回初始大小2。因此,在下一次乘法之前重线性化一个或两个输入密文可以对噪声增长和性能产生巨大的积极影响,尽管重线性化本身有显著的计算成本。只能将大小为3的密文重线性化为大小2,所以通常用户会想在每次乘法后重线性化以保持密文大小为2。重线性化需要特殊的"重线性化密钥",可以被认为是一种公钥。重线性化密钥可以用KeyGenerator轻松创建。重线性化在BFV和CKKS方案中使用类似,但在这个示例中我们继续使用BFV。我们重复之前的计算,但这次在每次乘法后重线性化。*/print_line(__LINE__);cout << "生成重线性化密钥。" << endl;// 声明重线性化密钥对象RelinKeys relin_keys;// 生成重线性化密钥keygen.create_relin_keys(relin_keys);/*我们现在重复计算,在每次乘法后重线性化。*/print_line(__LINE__);cout << "计算并重线性化x_squared (x^2)," << endl;cout << string(13, ' ') << "然后计算x_sq_plus_one (x^2+1)" << endl;// 声明存储x^2的密文对象Ciphertext x_squared;// 计算x^2evaluator.square(x_encrypted, x_squared);cout << "    + x_squared的大小:" << x_squared.size() << endl;// 重线性化:将大小从3减小到2(就地操作)evaluator.relinearize_inplace(x_squared, relin_keys);cout << "    + x_squared的大小(重线性化后):" << x_squared.size() << endl;// 计算x^2 + 1evaluator.add_plain(x_squared, plain_one, x_sq_plus_one);cout << "    + x_sq_plus_one中的噪声预算:" << decryptor.invariant_noise_budget(x_sq_plus_one) << "位"<< endl;cout << "    + x_sq_plus_one的解密:";decryptor.decrypt(x_sq_plus_one, decrypted_result);cout << "0x" << decrypted_result.to_string() << " ...... 正确。" << endl;// 声明存储x+1的密文对象Ciphertext x_plus_one;cout << "计算x_plus_one (x+1)," << endl;cout << string(13, ' ') << "然后计算并重线性化x_plus_one_sq ((x+1)^2)。" << endl;// 计算x + 1evaluator.add_plain(x_encrypted, plain_one, x_plus_one);// 计算(x + 1)^2evaluator.square(x_plus_one, x_plus_one_sq);cout << "    + x_plus_one_sq的大小:" << x_plus_one_sq.size() << endl;// 重线性化evaluator.relinearize_inplace(x_plus_one_sq, relin_keys);cout << "    + x_plus_one_sq中的噪声预算:" << decryptor.invariant_noise_budget(x_plus_one_sq) << "位"<< endl;cout << "    + x_plus_one_sq的解密:";decryptor.decrypt(x_plus_one_sq, decrypted_result);cout << "0x" << decrypted_result.to_string() << " ...... 正确。" << endl;cout << "计算并重线性化encrypted_result (4(x^2+1)(x+1)^2)。" << endl;// 将x_sq_plus_one乘以4evaluator.multiply_plain_inplace(x_sq_plus_one, plain_four);// 执行最终乘法evaluator.multiply(x_sq_plus_one, x_plus_one_sq, encrypted_result);cout << "    + encrypted_result的大小:" << encrypted_result.size() << endl;// 重线性化最终结果evaluator.relinearize_inplace(encrypted_result, relin_keys);cout << "    + encrypted_result的大小(重线性化后):" << encrypted_result.size() << endl;cout << "    + encrypted_result中的噪声预算:" << decryptor.invariant_noise_budget(encrypted_result) << "位" << endl;cout << endl;cout << "注意:注意剩余噪声预算的增加。" << endl;/*重线性化明显改善了我们的噪声消耗。我们仍然有大量的噪声预算剩余,所以我们可以期望解密时得到正确答案。*/print_line(__LINE__);cout << "解密encrypted_result (4(x^2+1)(x+1)^2)。" << endl;decryptor.decrypt(encrypted_result, decrypted_result);cout << "    + 4(x^2+1)(x+1)^2的解密 = 0x" << decrypted_result.to_string() << " ...... 正确。" << endl;cout << endl;/*对于x=6,4(x^2+1)(x+1)^2 = 7252。由于明文模数设置为1024,这个结果在整数模1024下计算。因此预期输出应该是7252 % 1024 == 84,或十六进制的0x54。*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89749.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI大模型LangChain架构介绍及其在环保领域的应用

1.LangChain 概述与架构 LangChain 是一个面向大型语言模型&#xff08;LLM&#xff09;应用的开发框架&#xff0c;其核心理念是将复杂的基于语言的 AI 系统拆分为可复用的模块&#xff0c;简化 LLM 与数据源的集成。LangChain 官方文档将其定义为“一个用于开发以 LLM 为驱动…

centos 7 安装NVIDIA Container Toolkit

要在 CentOS 7 上离线安装 NVIDIA Container Toolkit&#xff0c;需确保已安装 NVIDIA 驱动和 Docker 环境。以下是完整步骤及注意事项&#xff1a; ⚙️ 一、环境准备 验证 NVIDIA 驱动 运行 nvidia-smi 确认驱动已正确安装&#xff0c;若未安装需先离线安装驱动&#xff1a; …

C++学习之STL学习:list的使用

本篇我们将学习STL中list的使用 目录 list的初始和官方文档 list的官方文档 list的构造与析构 构造函数 析构函数 运算符重载 迭代器 正向迭代器 反向迭代器 const正向迭代器 const反向迭代器 容量 empty size max_size 访问 访问第一个元素​编辑 访问最后一个元素 修…

USB服务器在证券公司虚拟化进程中的应用分析

在证券公司全面拥抱虚拟化、云化的技术浪潮中&#xff0c;一个看似微小却至关重要的环节曾长期阻碍进程&#xff1a;分散在各业务环节的银行前置机U盾、各种系统认证Ukey等物理USB安全设备的管理难题。这些承载着资金划拨、交易认证核心权限的“小钥匙”&#xff0c;在传统模式…

网闸内部架构设计:分层与微服务的生死博弈

引言 “物理隔离是网闸的命脉,而架构设计决定其生死。” 在数据安全领域,网闸(安全隔离与信息交换系统)是守护核心网络的钢铁长城。但当开发者试图将现代架构思想(如微服务)引入其内部时,却可能引发灾难性冲突。本文通过深度拆解分层架构与微服务在网闸中的适用性,揭示…

通过MaaS平台免费使用大模型API

文章目录 一、引言&#xff1a;MaaS平台——免费使用大模型API的新选择二、模型代码与限制术语详解&#xff08;一&#xff09;模型代码含义解析&#xff08;二&#xff09;模型使用限制术语缩写详解 三、5个MaaS平台详细介绍&#xff08;一&#xff09;OpenRouter&#xff08;…

进程代理单窗口单IP技术:原理、应用与实现

“在当今数字化时代&#xff0c;网络隐私保护与多账号管理需求日益增长。单窗口单IP技术通过为每个进程分配独立网络身份&#xff0c;巧妙地解决了多账号管理中的IP关联难题。从游戏多开防封到数据采集优化&#xff0c;从隐私保护到测试验证&#xff0c;这项技术的应用场景不断…

Java教程——线程池和future

Future 详解 1. Future 是什么? Future 是 Java 中的一个接口(java.util.concurrent.Future),代表异步计算的未来结果。它允许你: 提交任务后立即返回在需要时检查任务是否完成获取任务结果(完成后)取消任务2. 怎么使用 Future? 通过线程池提交任务: ExecutorServ…

洛谷P1351 [NOIP 2014 提高组] 联合权值

洛谷P1351 [NOIP 2014 提高组] 联合权值 洛谷题目传送门 题目背景 NOIP2014 提高组 D1T2 题目描述 无向连通图 G G G 有 n n n 个点&#xff0c; n − 1 n-1 n−1 条边。点从 1 1 1 到 n n n 依次编号,编号为 i i i 的点的权值为 W i W_i Wi​&#xff0c;每条边的长…

Apache Doris Profile 深度解析:从获取到分析,解锁查询性能优化密码

在 Doris 数据库中&#xff0c;高效的查询性能是数据处理的关键。当我们遇到查询缓慢、资源消耗异常等问题时&#xff0c;Doris 提供的 Profile 工具就如同一位 “性能侦探”&#xff0c;能帮我们抽丝剥茧&#xff0c;找到问题根源。今天&#xff0c;我们就来深入聊聊如何分析 …

系统架构师

硬件&#xff1a; 运算器&#xff1a;1&#xff09;算术运算 加减乘除 2&#xff09;逻辑运算并进行逻辑测试&#xff1a;与或非 组件功能&#xff1a;算术逻辑单元ALU :处理数据 实现对数据的算术运算和逻辑运算 累加寄存器AC 通用寄存器&#xff0c;alu提供工作区 暂存运算结…

Unity HDRP + Azure IoT 工业设备监控系统实例

Unity HDRP Azure IoT 工业设备监控系统实例 下面是一个完整的工业设备监控解决方案&#xff0c;结合Unity HDRP&#xff08;高清渲染管线&#xff09;的高质量可视化与Azure IoT的实时数据处理能力。 系统架构 #mermaid-svg-XJnD6acrBbtbqYHW {font-family:"trebuchet…

(超详细)数据库项目初体验:使用C语言连接数据库完成短地址服务(本地运行版)

数据库项目初体验&#xff1a;使用C语言连接数据库完成短地址服务&#xff08;本地运行版&#xff09; 前言&#xff1a;初学者的思考 作为一个刚初学数据库的小白并且在之前我的博客中我有尝试使用C语言写过一个短地址服务&#xff0c;但是使用C语言编写的短地址服务只有短记…

mysql基础(一)快速上手篇

连接mysql 使用命令行窗口连接mysql数据库 语法&#xff1a;mysql –h主机名 –u用户名 –p密码 说明&#xff1a;-h参数指定数据库ip&#xff0c;本地服务器可以用localhost&#xff0c;-u参数指定用户名&#xff0c;-p参数指定用户密码。 注意&#xff1a;-p和密码值之间…

IntelliJ IDEA 2025- 下载安装教程图文版详细教程(附激活码)

目录 写在前面 一、介绍 二、下载 三、安装 &#x1f3c1; 写在最后 写在前面 > &#x1f680; 初学 Java&#xff1f;或者刚开始写项目&#xff0c;不知道该选哪个 IDE&#xff1f; 本篇教程手把手教你安装 IntelliJ IDEA —— JetBrains 出品的顶级 Java 开发环境&a…

数学经济专业大学四年规划

数学经济专业结合了数学的逻辑严谨性和经济学的现实应用性&#xff0c;为学生提供了强大的数理分析能力和经济洞察力。该专业毕业生在金融科技、量化投资、商业分析等领域具有显著优势&#xff0c;尤其在数字经济时代&#xff0c;这类复合型人才的需求量持续增长。一、数学经济…

局域网打印机共享怎么设置?如何配置内网本地网络打印机给异地电脑远程连接使用打印?

打印机共享怎么设置&#xff1f;如何设置本地内网的网络打印机共享给其他网络下电脑连接打印&#xff1f;打印机设置使用以及异地使用打印都是大家比较关注的问题&#xff0c;下面详细教程中分二步&#xff0c;先讲局域网内的打印机共享&#xff0c;再进一步介绍内网打印机地址…

Rust异步爬虫实现与优化

Rust 语言在爬虫领域的应用相对较少&#xff0c;尽管 Rust 的 async/await 已稳定&#xff0c;但其与线程安全、Pin 等概念的结合仍较复杂&#xff0c;而爬虫高度依赖并发处理&#xff0c;进一步提高了开发成本。这就导致了使用Rust语言爬虫用的人很少。 下面是一个使用 Rust 编…

Electron 安全最佳实践:构建安全的桌面应用

Electron 是一个流行的框架&#xff0c;允许开发者使用 Web 技术&#xff08;HTML、CSS、JavaScript&#xff09;构建跨平台桌面应用。许多知名应用&#xff0c;如 VS Code、Slack 和 Discord&#xff0c;都基于 Electron 开发。然而&#xff0c;由于其结合了 Node.js&#xff…

MySQL 事务详解:从基础操作到隔离级别与 MVCC 原理

前言 首先从概念上进行理解什么是事务&#xff0c;以及事务的4大属性&#xff0c;知道是什么还要知道为什么&#xff1f; 事务是如何进行操作的&#xff0c;最后在谈事务的隔离性、隔离级别&#xff08;最重要但是也很难理解&#xff09;&#xff0c;理解隔离级别体现在哪里 …