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

news2024/11/6 9:55:23

写在前面:

        在上一篇中展示了如何使用 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)解决了数据类型溢出问题,但代价是只能得到近似结果(下篇预告)。

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

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

相关文章

解决postGis无法打开的问题

问题 无法打开PostGIS PostGIS Bundle 3 for PostgreSQL x64 12 Shapefile and DBF Loader Exporter 弹出窗口 找不到libcrypto-1 postgis libcrypto libssl-1-x64等问题 解决方法 打开PostgreSQL安装目录下的Bin文件夹 查找缺少的文件 将其复制到 postgisgui 下 复制后即可…

网站建设网络公司如何选择

在选择网站建设网络公司时&#xff0c;需要考虑多个因素&#xff0c;以确保您的网站能够满足业务需求并取得成功。以下是一些建议&#xff0c;帮助您在选择网站建设网络公司时做出明智的决策。 首先&#xff0c;您应该考虑公司的经验和专业知识。选择一家有丰富经验的公司&…

实战从零开始实现Raft|得物技术

一、前言 Raft算法是一种分布式一致性算法&#xff0c;由Diego Ongaro和John Ousterhout在2013年提出。它主要用于分布式系统中&#xff0c;保证系统中的数据在多个节点间保持一致性。 Raft算法被广泛应用于众多分布式系统中&#xff0c;尤其是在需要强一致性保证的场景中&am…

【C++】-----多态及原理

目录 前言 一、是什么&#xff1f; 二、怎么样&#xff1f; Ⅰ、构成条件 Ⅱ、虚函数 Ⅲ、虚函数的重写 1.常规情况下 2.虚函数重写的三个例外 ①返回值的类型可以不同 ②析构函数的重写 ③子类虚函数可以不加virtual关键字(不建议) 3.override和final关键字 Ⅳ、重…

极米RS10 Plus VS当贝X5S Pro!最强客厅投影仪选当贝投影才是正解

不知道为什么&#xff0c;2024年的投影仪市场迭代迅猛&#xff0c;尤其是很多头部品牌小升级不断&#xff0c;机型后缀错综复杂让消费者更难下定决心做出抉择。而在今天又有一款新品极米RS10 Plus正式发布&#xff0c;同价位其实早前就有热门人气选手当贝X5S Pro坐镇&#xff0…

ChatGPT的封号和停止注册应对和常见问题丨出海笔记

ChatGPT "亚洲区封号"和“停止注册”的事情大家都听说过吧&#xff0c;我认为&#xff0c;官方有一定程度的“控频”&#xff0c;但并没有一杆子打死&#xff0c;更没有自媒体吹嘘的所谓封号和无法注册&#xff0c;因为我曾给朋友注册了2个以及升级plus成功&#xff…

MM 12 -采购- 成本中心采购

思维导图 说明 采购申请 手工或BPM接口创建 物料组&#xff1a; 必输 科目分配类别K &#xff0c;标签页会增加 科目分配 标签页 会计科目&#xff1a; 根据物料组带出 或者直接输入&#xff0c;根据情景。 成本中心需要填写。 采购订单 科目分配类别K &#xff0c;标签页会增…

【Windows】EFI系统盘重新安装操作系统遇到磁盘MBR分区解决办法

【Windows】EFI系统盘重新安装操作系统遇到磁盘MBR分区解决办法 1.背景2.问题3.解决 1.背景 本博客使用ventoy软件制作USB闪存启动盘。 相关博客&#xff1a; 【windows10】ventoy软件制作USB闪存启动盘-CentOS8 https://blog.csdn.net/jn10010537/article/details/123283985…

C到C++——C++基础

C是一种通用的、静态类型的、跨平台的编程语言。它是在1979年由Bjarne Stroustrup创建的&#xff0c;最初是作为C语言的扩展来支持面向对象编程。 C在保留C语言的特性的同时&#xff0c;添加了许多其他的功能&#xff0c;包括类、对象、继承、多态、模板等。这使得C成为了一种…

“金牌挑战——奥运知识大比拼”微信小程序线上知识竞赛答题活动复盘总结

一、活动背景 奥运会进行得如火如荼&#xff0c;为了弘扬奥运精神&#xff0c;激发公众对于奥林匹克运动的兴趣和热情&#xff0c;我们特别策划了“金牌挑战——奥运知识大比拼”线上知识竞赛活动。本次活动依托微信小程序&#xff0c;通过趣味性和互动性强的知识竞答&#xf…

SOPHGO算能科技BM1684盒子占用空间满的问题解决

目录 1 问题由来 2 问题排查与解决 1 问题由来 安装软件的时候发现&#xff0c;软件根本安装不上了&#xff0c;用df -h看到根目录已经满了 rootbm1684:~# df -h Filesystem Size Used Avail Use% Mounted on overlay 5.8G 5.7G 0 100% / devtmpfs …

【实战】MFC客户端Python后端之仿造QQ聊天

项目概述 这里介绍一个很多年以前做的一个小项目&#xff0c;新手小白可以参考学习。本项目旨在开发一个功能丰富的即时通讯及聊天室系统&#xff0c;类似于QQ&#xff0c;具备客户端与服务端通讯、多人聊天室、界面友好度、一对一聊天、通讯内容加密、服务端与数据库交互等功能…

十八.核心动画 - 使用CAGradientLayer图层构建渐变视图

引言 在现代的UI设计中&#xff0c;渐变色和圆角已经成为了不可或缺的元素。无论是应用程序的背景&#xff0c;按钮&#xff0c;还是图标&#xff0c;这些设计趋势不仅使界面更加美观&#xff0c;还能提升用户体验。特别是渐变色&#xff0c;它通过颜色的平滑过渡&#xff0c;…

如何利用绩效考核来强化员工对TPM的参与度?

TPM&#xff08;Total Productive Maintenance, 全面生产维护&#xff09;作为一种追求生产系统效率最大化的管理模式&#xff0c;其核心在于通过全员参与和持续改进&#xff0c;实现设备综合效率的最大化。然而&#xff0c;要让这一理念深入人心&#xff0c;并转化为员工的日常…

图片转为pdf怎么弄?亲测有效的8个pdf转换方法安利

图片转PDF怎么弄&#xff1f;在日常的办公生活中&#xff0c;我们经常会需要处理一些文档格式转换难题&#xff0c;图片转成PDF格式就是其中一个&#xff0c;图片转换成PDF格式的话&#xff0c;方便我们传输分享&#xff0c;毕竟现在PDF格式凭借着自身的稳定性和可移植性已经成…

李晨晨的嵌入式学习 DAY20

今天主要对zuot学习函数进行了补充 一&#xff0c;文件IO函数 1.fileno函数 类型转换函数 函数原型&#xff1a;int fileno(FILE *stream); 功能&#xff1a;fileno函数用于取得参数stream指定的文件流所使用的文件描述符。文件描述符是一个非负整数&#xff0c;用于在底层…

C/C++开发,opencv光流法跟踪特征点

目录 一、Lucas-Kanade光流法 1.1cv::ORB特征点提取方法 1.2 cv::calcOpticalFlowPyrLK函数 二、完整案例实现 2.1 程序代码 2.2 程序编译及输出 2.3 读取视频文件方式补充 一、Lucas-Kanade光流法 在 OpenCV 中&#xff0c;使用 特征检测器(例如ORB ,Oriented FAST and…

基于深度学习的地磁活动、扰动预测模型

注&#xff1a;包括SYM-H Index和Storm Intensity index A transformer-based framework for predicting geomagnetic indices with uncertainty quantification Journal of Intelligent Information Systems 18 November 2023 A transformer-based framework for predicting…

IP地址怎样实现安全的HTTPS访问?

IP实现HTTPS访问是一个涉及证书申请、服务器配置及网络安全的过程。以下是实现IP实现HTTPS访问的详细步骤&#xff1a; 公网IP地址的重要性&#xff1a;要实现HTTPS访问&#xff0c;必须拥有一个公网IP地址&#xff0c;这是从互联网直接访问网站的基础条件。 管理权限的必要性&…

高效批量提取PPT幻灯片中图片的方法

处理包含大量图片的PPT&#xff08;PowerPoint&#xff09;幻灯片已成为许多专业人士的日常任务之一。然而&#xff0c;手动从每张幻灯片中逐一提取图片不仅耗时耗力&#xff0c;还容易出错。为了提升工作效率&#xff0c;减少重复劳动&#xff0c;探索并实现一种高效批量提取P…