当前位置: 首页 > news >正文

同态加密和SEAL库的介绍(三)BFV - Batch Encoder

写在前面:

        在上一篇中展示了如何使用 BFV 方案执行一个非常简单的计算。该计算在 plain_modulus 参数下进行,并且仅使用了 BFV 明文多项式中的一个系数。这种方法有两个显著的问题:

  1. 实际应用通常使用整数或实数运算,而不是模运算;
  2. 仅使用了明文多项式的一个系数。这实际上是非常浪费的,因为明文多项式很大,而且无论如何都会被整体加密。

        如果直接增加 plain_modulus 参数,直到没有溢出发生,就能让计算表现得像整数运算。但是问题在于增加 plain_modulus 会增加噪声预算的消耗,并且还会减少初始噪声预算。接下来介绍其他将数据布局到明文元素(编码)的方法,这些方法可以允许更多的计算而不会发生数据类型溢出,并且可以充分利用整个明文多项式。

一、批处理介绍

[BatchEncoder] (适用于 BFV 或 BGV 方案)

        令 N 表示 poly_modulus_degree,T 表示 plain_modulus。批处理允许将 BFV 明文多项式视为 \left [ 2,\frac{N}{2} \right ] 矩阵,每个元素是模 T 的整数。在矩阵视图中,加密操作对加密矩阵进行逐元素操作,使用户能够在完全可向量化的计算中获得数个数量级的速度提升。
        因此,除了最简单的计算,批处理应是与 BFV 一起使用的首选方法,并且如果使用得当,其实现将比不使用批处理的任何实现都要出色。
        此外,批处理对于 BGV 方案的工作方式与此示例中的 BFV 方案类似。例如,只需将`scheme_type::bfv` 更改为 `scheme_type::bgv`  即可使此示例适用于 BGV 方案。

1.1 参数设置

EncryptionParameters parms(scheme_type::bfv);
size_t poly_modulus_degree = 8192;
parms.set_poly_modulus_degree(poly_modulus_degree);
parms.set_coeff_modulus(CoeffModulus::BFVDefault(poly_modulus_degree));

        要启用批处理,我们需要将 plain_modulus 设置为一个与 2*poly_modulus_degree 同余于 1 的素数。这个需要特别注意,因为这与普通的Encode不同,并且设置不正确的话 BatchEncoder会校验,设置为满足  T= 2*N*k+1\left ( k=1,2,\cdots \right ) 的素数即可。
        同时,Microsoft SEAL 提供了一个辅助方法来找到这样的素数。在这个示例中,我们创建了一个支持批处理的 20 位素数。

parms.set_plain_modulus(PlainModulus::Batching(poly_modulus_degree, 20));

        然后就可以用参数创建环境,并且可以通过查看 SEALContext 创建的加密参数限定符来验证批处理是否确实启用了。

SEALContext context(parms);
print_parameters(context);
auto qualifiers = context.first_context_data()->qualifiers();
cout << "批处理已启用:" << boolalpha << qualifiers.using_batching << endl;

        这里输出为:

1.2 创建其他实例

        这里与上篇相同,创建加解密需要的实例:

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 类的实例进行。:

BatchEncoder batch_encoder(context);

二、批处理运算

        这里需要格外注意槽的概念,批处理 `槽` 的总数等于 poly_modulus_degree,N,这些槽被组织成 \left [ 2,\frac{N}{2} \right ] 矩阵,可以对其进行加密和计算。每个槽包含一个模 plain_modulus 的整数。
        
这里每一个明文或者密文块,可以用的槽数量就是 N,但是内部不是一整个连续存储。逻辑上可以认为是两行的一个矩阵,但是物理上其实是类似于单链表的一种存储形式。
        这里可以查看可用的槽数量,当然为了清晰一行有多少个,可以定义一个 row_size:

size_t slot_count = batch_encoder.slot_count();
size_t row_size = slot_count / 2;

 为了帮助大家理解存储的逻辑形式,这里放几个数字并打印:

vector<uint64_t> pod_matrix(slot_count, 0ULL);
pod_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;

2.1 输入的编码与加密

        使用 BatchEncoder 将矩阵编码成一个明文多项式,并加密:(注意上面是根据 solt_count 创建的输入容器,编码完成后是一个 Plaintext 块,加密完是 Ciphertext 块)

Plaintext plain_matrix;
batch_encoder.encode(pod_matrix, plain_matrix);
Ciphertext encrypted_matrix;
encryptor.encrypt(plain_matrix, encrypted_matrix);
cout <<decryptor.invariant_noise_budget(encrypted_matrix) << " bits";

在示例中这里加密完后立刻解密进行验证,并输出噪声预算:

        对密文的操作会同时在所有 8192 个槽(矩阵元素)上同态执行。为了演示计算,这里编码一个明文矩阵:

vector<uint64_t> pod_matrix2;
for (size_t i = 0; i < slot_count; i++)
{pod_matrix2.push_back((i & size_t(0x1)) + 1);
}
Plaintext plain_matrix2;
batch_encoder.encode(pod_matrix2, plain_matrix2);

2.2 运算

这里展示的运算是:将第二个(明文)矩阵加到加密矩阵上,并对和进行平方

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) << " bits";
decryptor.decrypt(encrypted_matrix, plain_result);
batch_encoder.decode(plain_result, pod_result);

        从结果可以看出来,两个向量用 Batch Encoder 编码后进行的运算,是对应位置进行的加法和点乘

三、总结

        当所需的加密计算高度并行化时,批处理允许我们高效地使用整个明文多项式。但是,它尚未解决在文件开头提到的另一个问题:每个槽只包含一个模 plain_modulus 的整数,除非plain_modulus 非常大,否则我们可能会很快遇到数据类型溢出并在需要进行整数计算时得到意外的结果。请注意,溢出无法在加密形式中检测到。
        CKKS 方案(及其编码器 CKKSEncoder)解决了数据类型溢出问题,但代价是只能得到近似结果(下篇预告)。

相关文章:

同态加密和SEAL库的介绍(三)BFV - Batch Encoder

写在前面&#xff1a; 在上一篇中展示了如何使用 BFV 方案执行一个非常简单的计算。该计算在 plain_modulus 参数下进行&#xff0c;并且仅使用了 BFV 明文多项式中的一个系数。这种方法有两个显著的问题&#xff1a; 实际应用通常使用整数或实数运算&#xff0c;而不是模运算…...

Docker 环境下使用 Traefik v3 和 MinIO 快速搭建私有化对象存储服务

上一篇文章中&#xff0c;我们使用 Traefik 新版本完成了本地服务网关的搭建。接下来&#xff0c;来使用 Traefik 的能力&#xff0c;进行一系列相关的基础设施搭建吧。 本篇文章&#xff0c;聊聊 MinIO 的单独使用&#xff0c;以及结合 Traefik 完成私有化 S3 服务的基础搭建…...

玛雅房产系统源码开发与技术功能解析

引言 随着房地产市场的蓬勃发展&#xff0c;房产管理系统&#xff08;Real Estate Management System, REMS&#xff09;作为提升行业效率、优化资源配置的关键工具&#xff0c;其重要性日益凸显。房产系统源码开发不仅涉及复杂的业务逻辑处理&#xff0c;还融合了先进的软件开…...

c++----初识模板

大家好&#xff0c;这篇博客想与大家分享一些我们c中比较好用的知识点。模板。首先咧&#xff0c;我们都知道模板嘛&#xff0c;就是以前人的经验总结出来的知识。方便我们使用。这里的模板也是一样的。当我们学习过后&#xff0c;对于一些在c中的自定义函数&#xff0c;我们在…...

SpringBoot3热部署

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional> </dependency> 默认就是,无需配置 可以了…...

J. 二进制与、平方和

https://codeforces.com/gym/104095/problem/J 分析操作一 1&00 ,0&10&#xff0c;ai<qmi(2,24),说明每个数最多操作25次 维护区间或和&#xff0c;orsum & x orsum 就不用递归下去了 势能线段树code // Problem: J. 二进制与、平方和 // Contest: Codeforc…...

LVS中NAT模式和DR模式实战讲解

1DR模式 DR&#xff1a;Direct Routing&#xff0c;直接路由&#xff0c;LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行 转发&#xff0c;源MAC是DIP所在的接口的MAC&#xff0c;目标MAC是某挑选出的RS的RIP所在接口的MAC地址&#xff1b;源 IP/PORT&#xf…...

写给小白程序员的一封信

文章目录 1.编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略2.程序员的练级攻略3.编程语言的选择4.熟悉Linux5.学会git6.知道在哪寻求帮助7.多结交朋友8.参加开源项目9.坚持下去 1.编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略 编程已成为当代大学生的必…...

Leaf分布式ID

文章目录 系统对Id号的要求UUIDsnowflakeLeafLeaf-snowflakeLeaf-segmentMySQL自增主键segment双buffer 系统对Id号的要求 1、业务 1&#xff09;全局唯一性&#xff1a;不能出现重复的ID号&#xff0c;既然是唯一标识&#xff0c;这是最基本的要求 2&#xff09;趋势递增&a…...

Starrocks解析json数组

json数据 [{"spec": "70g/支","unit": "支","skuId": "1707823848651276346","amount": 6,"weight": 70,"spuName": "伊利 甄稀 苦咖啡味雪糕 流心冰淇淋 70g/支",&quo…...

安卓基本布局(下)

TableLayout 常用属性描述collapseColumns设置需要被隐藏的列的列号。shrinkColumns设置允许被伸缩的列的列号。stretchColumns设置允许被拉伸的列的列号。 <TableLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/TableL…...

Python中使用正则表达式

摘要&#xff1a; 正则表达式&#xff0c;又称为规则表达式&#xff0c;它不是某种编程语言所特有的&#xff0c;而是计算机科学的一个概念&#xff0c;通常被用来检索和替换某些规则的文本。 一.正则表达式的语法 ①行定位符 行定位符就是用来描述字符串的边界。"^&qu…...

三大口诀不一样的代码,小小的制表符和换行符玩的溜呀

# 小案例&#xff0c;打印输出加法口诀 for i in range(1,10):for j in range(1,10):if j>i:breakprint(f"{j}{i}{ji}".strip(),end\t)print() print(\n) for i in range(1,10):for j in range(1,10):if j>i:breakprint(f"{j}x{i}{j*i}",end\t)print…...

[qt] 线程等待与唤醒

对于生产者与消费者的数据处理的另一种好的解决方法是使用QWaitCondition类,允许线程在一定的条件下唤醒其他多个线程来共同处理。 一 定义公共变量 DataSize: 生产者生产数据的大小BufferSize: 也就是这个缓冲区的大小,每个单元是一个int&#xff0c;也有可能是一个链表,结构…...

Springboot 实现 Modbus Rtu 协议接入物联网设备

Modbus RTU 技术教程 引言 Modbus是一种开放标准的通信协议,它最初由Modicon(现施耐德电气)在1979年发布,旨在让可编程逻辑控制器(PLC)之间能够进行通信。随着时间的发展,Modbus已经成为工业自动化领域中最常用的通信协议之一,尤其适用于连接工业电子设备。本文将详细…...

鸿蒙笔记--装饰器

这一节主要了解一下鸿蒙里的装饰器,装饰器是一种特殊的语法结构&#xff0c;用于装饰类、结构体、方法以及变量; 1 Component在鸿蒙&#xff08;HarmonyOS&#xff09;开发中扮演着重要角色&#xff0c;主要用于定义可重用的UI组件,主要作用:1)组件化&#xff1a;Component装饰…...

不同环境下RabbitMQ的安装-3 操作RabbitMQ

前面两篇从不同环境下RabbitMQ的安装-1 为什么要使用消息服务 到同环境下RabbitMQ的安装-2 ARM架构、X86架构、Window系统环境下安装RabbitMQ介绍了关于如何在ARM架构、X86架构和Window系统下如何安装&#xff0c;各位小伙伴可以根据自己的实际开发场景参考安装。 到本篇是一些…...

postgregSQL配置vector插件

1.下载vector 下载vector&#xff1a;https://pgxn.org/dist/vector/0.5.1/ 放在&#xff1a;C:\Program Files\PostgreSQL\vector-0.5.1 2.安装Visual Studio 2022 下载&#xff1a;https://visualstudio.microsoft.com/zh-hans/downloads/ 安装Visual Studio是为了C编译环…...

PUMA论文阅读

PUMA: Efficient Continual Graph Learning with Graph Condensation PUMA&#xff1a;通过图压缩进行高效的连续图学习 ABSTRACT 在处理流图时&#xff0c;现有的图表示学习模型会遇到灾难性的遗忘问题&#xff0c;当使用新传入的图进行学习时&#xff0c;先前学习的这些模…...

算法学习day31(动态规划)

一、比特位计数 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 输入&#xff1a;n 2 输出&#xff1a;[0,1,1] 解释&#xff1a;0 --> 0 1 --> 1 2 -…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...