文章目录

  • 一、batch_encoder (用于 BFV)
    • 1. 概述
    • 2. 数学原理
    • 3. 使用方法
    • 4. 代码示例
  • 二、ckks_encoder (用于 CKKS)


 在 1. bfv_basics.cpp 中,我们展示了如何使用BFV方案执行非常简单的计算。计算是在 plain_modulus 参数的模下执行的,并且 只使用了 BFV 明文多项式的一个系数。这种方法有两个显著的问题:

  1. 实际应用通常使用整数或实数算术,而不是模算术;
  2. 我们只使用了明文多项式的一个系数。这真的很浪费,因为明文多项式很大,无论如何都会被完整加密。

对于 (1),人们可能会问为什么不简单地 增加 plain_modulus 参数 直到不发生溢出,并且计算表现得像整数算术一样。问题是增加 plain_modulus 会 增加噪声预算消耗,并且也会 减少初始噪声预算

 在这些示例中,我们将讨论将数据布局到 明文元素 中的其他方法(编码),这些方法允许更多计算而不发生数据类型溢出,并且可以允许 充分利用整个明文多项式


一、batch_encoder (用于 BFV)

1. 概述

Batch Encoder 的目标是什么?通常,一个同态加密的密文只加密一个明文值。如果我们想对 两个数组 (向量) 逐项相加,就需要为每个元素单独加密成一个密文,然后对每对密文分别进行同态加法,这非常低效。
Batch Encoder 的作用就是将一个明文向量,比如 [a1,a2,...,ak][a_1, a_2, ..., a_k][a1,a2,...,ak] 打包编码到一个 单一的明文多项式 中。然后对这个单一多项式进行加密,得到一个 单一的密文。之后所有同态运算都作用在这一个密文上。一般称之为 SIMD 策略,这极大地提高了同态加密的吞吐量和效率。

 设 N 表示 poly_modulus_degreeT 表示 plain_modulus批处理 允许将 BFV 明文多项式 视为 2×(N/2) 矩阵每个元素 都是 模 T 的整数
 在 矩阵视图 中,加密操作对加密矩阵 按元素执行,允许用户在完全可向量化的计算中获得几个数量级的加速。
 因此,除了最简单的计算外,批处理应该是与 BFV 一起使用的首选方法,当正确使用时,将产生优于任何不使用批处理的实现。

2. 数学原理

 核心思想是,如果一个 模多项式 (在 BFV 中即 xN+1x^N+1xN+1) 可以其系数环 (这里是 ZtZ_tZt) 上分解为多个 两两互质的因子,那么原始的、复杂的商环就与这些因子定义的更简单的商环的 直积 (Direct Product) 存在一种被称为 同构 的深刻联系。

  1. 中国剩余定理
    Batch Encoder 的核心是基于 中国剩余定理 的多项式环分解。基本概念为:
    1. BFV 明文文空间是多项式环 Zt[x]xN+1\frac{Z_t[x]}{x^N+1}xN+1Zt[x]
    2. 其中 N=poly_modulus_degreeN=poly\_modulus\_degreeN=poly_modulus_degreet=plain_modulust=plain\_modulust=plain_modulus
    3. t满足特定条件的素数 时,这个环可以分解。这个条件就是 t≡1(mod2N)t \equiv 1\ \ (mod\ 2N)t1  (mod 2N)当满足这个条件时,多项式 xN+1x^N+1xN+1 可以完全分解为 N 个不同的线性因子。
  2. 环的分解
     当上面的条件满足的时候,我们有:Zt[x]xN+1≅Zt×Zt×...×Zt(N个副本)\frac{Z_t[x]}{x^N+1} \cong Z_t \times Z_t \times ... \times Z_t\ \ \ (N 个副本)xN+1Zt[x]Zt×Zt×...×Zt   (N个副本)≅\cong 是同构的意思,表示两个代数结构是同构的,即它们在结构上是相同的,尽管它们的元素可能不同。
     这意味着:
    • 一个度数小于 N 的多项式 <—> N 个独立的模 t 整数。
    • 多项式运算 <—> 对应位置的元素运算。
    • 实现了 SIMD 计算。
  3. 矩阵视图
     在 SEAL 中,N 个槽被组织为 2×(N/2)2 \times (N / 2)2×(N/2) 矩阵:
[ slot_0, slot_1, ..., slot_(N/2-1) ]
[ slot_(N/2), ..., slot_(N-1)      ]

3. 使用方法

  1. 第一步当然是设置 加密参数,其中加密方案、多项式模数次数、密文系数模数何止前的思路一样。但是要求将 plain_modulus 设置为一个 12*poly_modulus_degree 同余的素数。这一步 Microsoft SEAL 提供了一个辅助方法来寻找这样的素数。在这个示例中,我们创建一个支持批处理的 20 位素数
parms.set_plain_modulus(PlainModulus::Batching(poly_modulus_degree, 20));  // 设置支持批处理的明文模数
  1. 用设置好的参数生成上下文;
  2. 生成 KeyGeneratorEncryptorEvaluatorDecryptor
  3. 生成 BatchEncoder 的实例,批处理 '槽’的总数 等于 poly_modulus_degree = N,这些槽被组织成 2×(N/2) 矩阵,可以进行加密和计算。每个槽 包含一个 plain_modulus 的整数
  4. 先将数据存到 vector<uint64_t> pod_matrix(slot_count, 0ULL) 向量中。然后通过 BatchEncoder类 提供的方法 .encode,将矩阵编码为明文 Plaintext类 的实例中;
  5. 解码的过程完全相反,通过 BatchEncoder类 提供的 .decode 方法,将 Plaintext类 明文解码为 vector<uint64_t> 向量。
  6. 对明文进行加密和运算的方法同之前一摸一样。

4. 代码示例

    print_example_banner("Example: Encoders / Batch Encoder");EncryptionParameters parms(scheme_type::bfv);  // 创建BFV方案的加密参数对象size_t poly_modulus_degree = 8192;  // 设置多项式模数次数为8192parms.set_poly_modulus_degree(poly_modulus_degree);  // 应用多项式模数次数设置parms.set_coeff_modulus(CoeffModulus::BFVDefault(poly_modulus_degree));  // 设置系数模数为BFV默认值parms.set_plain_modulus(PlainModulus::Batching(poly_modulus_degree, 20));  // 设置支持批处理的明文模数SEALContext context(parms);  // 使用参数创建SEAL上下文对象KeyGenerator keygen(context);  // 创建密钥生成器对象SecretKey secret_key = keygen.secret_key();  // 生成私钥PublicKey public_key;  // 声明公钥对象keygen.create_public_key(public_key);  // 创建公钥RelinKeys relin_keys;  // 声明重线性化密钥对象keygen.create_relin_keys(relin_keys);  // 创建重线性化密钥Encryptor encryptor(context, public_key);  // 创建加密器,使用公钥Evaluator evaluator(context);  // 创建计算器Decryptor decryptor(context, secret_key);  // 创建解密器,使用私钥BatchEncoder batch_encoder(context);  // 创建批处理编码器对象size_t slot_count = batch_encoder.slot_count();  // 获取槽的总数size_t row_size = slot_count / 2;  // 计算每行的大小cout << "明文矩阵行大小: " << row_size << endl;vector<uint64_t> pod_matrix(slot_count, 0ULL);  // 创建大小为slot_count的向量,初始化为0pod_matrix[0] = 0ULL;  // 设置第一行第一个元素pod_matrix[1] = 1ULL;  // 设置第一行第二个元素pod_matrix[2] = 2ULL;  // 设置第一行第三个元素pod_matrix[3] = 3ULL;  // 设置第一行第四个元素pod_matrix[row_size] = 4ULL;  // 设置第二行第一个元素pod_matrix[row_size + 1] = 5ULL;  // 设置第二行第二个元素pod_matrix[row_size + 2] = 6ULL;  // 设置第二行第三个元素pod_matrix[row_size + 3] = 7ULL;  // 设置第二行第四个元素Plaintext plain_matrix;  // 声明明文对象batch_encoder.encode(pod_matrix, plain_matrix);  // 将矩阵编码为明文vector<uint64_t> pod_result;  // 声明结果向量batch_encoder.decode(plain_matrix, pod_result);  // 解码明文到向量print_matrix(pod_result, row_size);  // 打印结果矩阵Ciphertext encrypted_matrix;  // 声明密文对象encryptor.encrypt(plain_matrix, encrypted_matrix);  // 加密明文/*对密文的操作会导致在所有8192个槽(矩阵元素)中同时执行同态操作。为了说明这一点,我们构造另一个明文矩阵[ 1,  2,  1,  2,  1,  2, ..., 2 ][ 1,  2,  1,  2,  1,  2, ..., 2 ]并将其编码为明文。*/vector<uint64_t> pod_matrix2;  // 声明第二个矩阵向量for (size_t i = 0; i < slot_count; i++)  // 循环填充向量pod_matrix2.push_back((i & size_t(0x1)) + 1);  // 使用位运算生成1,2交替的模式Plaintext plain_matrix2;  // 声明第二个明文对象batch_encoder.encode(pod_matrix2, plain_matrix2);  // 编码第二个矩阵print_matrix(pod_matrix2, row_size);  // 第二个输入明文矩阵evaluator.add_plain_inplace(encrypted_matrix, plain_matrix2);  // 将密文与明文相加(就地操作)evaluator.square_inplace(encrypted_matrix);  // 对密文进行平方(就地操作)evaluator.relinearize_inplace(encrypted_matrix, relin_keys);  // 重线性化以减少密文大小/*我们还剩多少噪声预算?*/cout << "    + 结果中的噪声预算: " << decryptor.invariant_noise_budget(encrypted_matrix) << " 位" << endl;/*我们解密并分解明文以恢复矩阵形式的结果。*/Plaintext plain_result;  // 声明结果明文对象print_line(__LINE__);cout << "解密并解码结果。" << endl;decryptor.decrypt(encrypted_matrix, plain_result);  // 解密密文batch_encoder.decode(plain_result, pod_result);  // 解码明文到向量cout << "    + 结果明文矩阵 ...... 正确。" << endl;print_matrix(pod_result, row_size);

二、ckks_encoder (用于 CKKS)

暂时掠过

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

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

相关文章

数据一致性解决方案总结

数据一致性解决方案总结 我们在系统中&#xff0c;主要进行了数据冗余&#xff0c;那么就会带来数据一致性的问题。常见的数据一致性问题有&#xff1a;数据库主从同步延迟导致的读数据不一致&#xff1b;数据库主主之间数据的不一致&#xff1b;缓存和数据库之间的数据不一致。…

17.Spring Boot的Bean详解(新手版)

文章目录1. 什么是Bean&#xff1f;从零开始理解1.1 Bean的定义1.2 为什么需要Bean&#xff1f;1.3 Bean vs 普通对象的区别2. Spring容器&#xff1a;Bean的家2.1 什么是Spring容器&#xff1f;2.2 容器的工作流程3. Bean的声明方式详解3.1 使用Component及其专门化注解3.1.1 …

cherryStudio electron因为环境问题无法安装解决方法或打包失败解决方法

$env:ELECTRON_MIRROR"https://npmmirror.com/mirrors/electron/"; $env:ELECTRON_CUSTOM_DIR"{{ version }}"; yarn install1. 上面是关于electron安装失败的解决方法. 也可以通过到git上下面包,解压后,放到对应的目录下面,并把里面的build文件夹删除, b…

微服务架构中数据一致性保证机制深度解析

在微服务架构中&#xff0c;数据一致性是分布式系统设计的核心挑战。由于服务拆分后数据自治&#xff08;每个服务独立数据库&#xff09;&#xff0c;跨服务操作的一致性保障需突破传统单体事务的局限。本文从一致性模型、核心解决方案、技术实现及面试高频问题四个维度&#…

【Gin】HTTP 请求调试器

文章目录 项目概述代码功能详解1. 导入必要的包2. 主函数和路由设置3. 请求信息捕获4. 请求参数和头信息5. 请求体处理5.1 JSON 数据处理5.2 表单数据处理5.3 Multipart 表单数据处理5.4 其他类型数据处理6. 构造响应对象7. 返回 JSON 响应功能特点使用场景完整代码项目概述 这…

物联网(IoT)领域的协议

物联网&#xff08;IoT&#xff09;领域的通信协议种类繁多&#xff0c;不同协议适用于不同的应用场景&#xff08;如低功耗设备、工业自动化、家庭智能设备等&#xff09;。以下是主要物联网协议的分类及详细解释&#xff1a;一、物联网协议分类物联网协议通常分为两大类&…

专题一_双指针_四数之和

一&#xff1a;题目解析 题目链接&#xff1a;18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 注&#xff1a;本题是在上题的基础上讲解的&#xff1a;专题一_双指针_三数之和-CSDN博客 解析&#xff1a;和三数之区别在于找四元组和为targe的数字 而不是0 二&#xff1a…

Spring Boot多数据源配置详解

Spring Boot多数据源配置详解 在实际企业开发中&#xff0c;随着业务复杂度提升&#xff0c;单一数据源已无法满足所有场景需求。比如&#xff1a;读写分离、分库分表、数据迁移、微服务整合等&#xff0c;这时就需要用到多数据源配置。本文将从原理、配置、常见问题和最佳实践…

项目进度严重依赖关键人,如何分散风险

项目进度严重依赖关键人的风险&#xff0c;可以通过建立知识共享机制、强化团队协作模式、实施交叉培训和培养后备人才、优化流程标准化等措施有效分散。其中&#xff0c;实施交叉培训和培养后备人才尤为重要&#xff0c;通过培养多个成员具备相似的关键技能&#xff0c;能够迅…

【RK3568+PG2L50H开发板实验例程】FPGA部分 | 以太网传输实验例程

本原创文章由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com)1.实验简介实验目的&#xff1a;完成 DDR3 的读写测试。实验环境&#xff1a;Window11 PDS2022.2-SP6.4芯片型号&#x…

《每日AI-人工智能-编程日报》--2025年7月9日

介绍:AI 方面1. Manus 通用智能体初成型&#xff0c;开启 AIAgent 新时代​中泰证券发布研报称&#xff0c;首款通用型 AI 智能体 Manus 已问世&#xff0c;能够将复杂任务拆解为可执行的步骤链&#xff0c;并在虚拟环境中灵活调用工具&#xff0c;标志着 AI 从 “Reasoner” 走…

MyBatis之数据操作增删改查基础全解

目录 1. ➕MyBatis添加数据 1.1. 持久层接口添加方法 1.2. 映射文件添加标签 1.3. 编写测试方法 2. ✏️MyBatis修改数据 2.1. 代码的优化 2.2. 持久层接口添加方法 2.3. 映射文件添加标签 2.4. 编写测试方法 3. &#x1f5d1;️MyBatis删除数据与根据Id查询 3.1. 删…

kbmMemTable Pro 7.82 Delphi 11 源代码

kbmMemTable Pro 7.82 Delphi 11 源代码KbmMemTable 是一个用于在 Win 32/64、Mac OS、Android 和 iOS 32/64 应用程序中存储临时数据的组件&#xff0c;这些应用程序可以使用 RAD Studio、Delphi、C Builder 或 FPC 等编程语言创建&#xff0c;同时您还可以高速访问存储在数据…

LeetCode Hot 100 除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。请 不要使用除法&#xff0c;且在 O(n) 时间复杂度内…

VC Code--常用的配置

原文网址&#xff1a;VC Code--常用的配置-CSDN博客 简介 本文介绍VC Cod常用的配置。 1.字体大小 整体字体大小 左下角齿轮> Settings> Windows> Window: Zoom Level> 改为&#xff1a;2 编辑器字体大小&#xff08;如果调整了整体字体大小&#xff0c;此处…

大模型驱动的智能体:从GPT-4到o1的能力跃升

大模型驱动的智能体&#xff1a;从GPT-4到o1的能力跃升 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&#xf…

200nl2sql

‘train_runtime’: 1375.1089, ‘train_samples_per_second’: 0.025, ‘train_steps_per_second’: 0.007, ‘train_loss’: 0.0, ‘num_tokens’: 115914.0, ‘completions/mean_length’: 76.4125, ‘completions/min_length’: 27.8, ‘completions/max_length’: 151.2, …

Transformer、BERT、GPT以及Embedding之间的关系

1. Transformer架构的两大方向 Transformer分为两大类应用&#xff0c;但划分标准不是"分类vs生成"&#xff0c;而是编码方式&#xff1a; Encoder架构&#xff08;代表&#xff1a;BERT&#xff09;&#xff1a; 使用Transformer的​​编码器​​&#xff08;Encode…

ARM汇编编程(AArch64架构)课程 - 第7章:SIMD与浮点运算

目录1. NEON寄存器关键特性数据排列示例2. 浮点指令2.1 FMUL指令2.2 FADD指令2.3 FCMP指令1. NEON寄存器 AArch64架构提供32个128位NEON向量寄存器&#xff08;V0-V31&#xff09;&#xff0c;支持SIMD并行计算 关键特性 寄存器类型数量位宽数据视图Q寄存器32128bQ0-Q31D寄存…

Word2Vec模型详解:CBOW与Skip-gram

Word2Vec模型详解&#xff1a;CBOW与Skip-gram 目录 模型概述理论基础CBOW模型详解Skip-gram模型详解模型对比代码实现详解训练过程分析应用场景实验结果总结 模型概述 Word2Vec是一种用于生成词向量的神经网络模型&#xff0c;由Google在2013年提出。它包含两种主要架构&am…