同态加密和SEAL库的介绍(六)BGV 方案

news2024/9/20 1:02:36

         前面介绍 BFV 和 CKKS 加密方案,这两者更为常用。并且也解释了 Batch Encoder 和 级别的概念,这对接下来演示 BGV 会很有帮助。

一、BGV简介

        BGV (Brakerski-Gentry-Vaikuntanathan) 方案 是一种基于环学习同态加密(RLWE)问题的加密方案。BGV 方案可以实现任意计算电路的同态加密,特别适合于加密数据的复杂运算。

特点

  • 同态运算:支持加法和乘法的任意组合,这意味着它可以评估任意计算电路。
  • 级联密文:密文可以通过一系列同态运算来处理,而不需要在每一步进行解密和重新加密。
  • 噪声管理:在每次同态运算之后,密文中的噪声会增加。BGV 方案采用了噪声管理技术(例如重新线性化和模数切换)来控制噪声增长,确保运算的正确性。

优点

  • 灵活性:支持任意复杂的计算。
  • 效率:通过噪声管理技术提高了运算效率。
  • 安全性:基于环学习同态加密问题的安全性高。

缺点

  • 复杂性:实现和使用BGV方案比一些其他方案更为复杂。
  • 资源消耗:噪声管理和重新线性化等操作增加了计算和存储的开销。

二、3种方案比较:

先看发展顺序

  • BGV 方案:2011年 Brakerski、Gentry 和 Vaikuntanathan 提出。
  • BFV 方案:2012年 Fan 和 Vercauteren 提出。
  • CKKS 方案:2017年 Cheon、Kim、Kim 和 Song 提出。

分别的适用场景:

  • 如果需要对整数进行精确计算,BFV 方案是一个好的选择。
  • 如果需要对浮点数进行近似计算,CKKS 方案是更合适的。
  • 如果需要复杂的计算电路,BGV 方案提供了最大的灵活性。

        每种方案都有其独特的优势和适用场景,在实际应用中,选择适合的方案可以最大化地发挥同态加密技术的优势。

三、BGV 示例

        在本示例中,计算8次多项式 x^8 ,并且在整数 1、2、3、4上的加密 x。多项式的系数可以看作是明文输入计算在 plain_modulus == 1032193 模数下进行。

        在BGV方案中对加密数据进行计算类似于BFV。这个例子的主要目的是解释BFV和BGV在密文系数模数选择和噪声控制方面的区别

3.1 参数设置和创建实例

这里先使用 BFVDefault 创建 coeff_modulus,后面会介绍如何更好的设置。

EncryptionParameters parms(scheme_type::bgv);
size_t poly_modulus_degree = 8192;
parms.set_poly_modulus_degree(poly_modulus_degree);
parms.set_coeff_modulus(CoeffModulus::BFVDefault(poly_modulus_degree));
parms.set_plain_modulus(PlainModulus::Batching(poly_modulus_degree, 20));
SEALContext context(parms);

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);

        这里想再次强调一下,因为用的是 Batch 批处理,所以在设置 plain_modulus 的时候,要求是与 2倍 poly_modulus_degree 同余 1 的素数,这与普通的 Encoder 要求不同。上面代码中是用 PlainModulus::Batching 自动生成满足条件的随机数。
        这里输出设置的参数:

3.2 设置输入并编码

        批处理和槽操作在 BFV 和 BGV 中是相同的:

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

        这里特意设置 row_size 变量,是因为之前讲批处理的时候,强调过内部在逻辑上会编码成两行,故其实就是  \left [ 2, slotcount /2\right ] 。当然这个结构对于编码和计算是基本无感的,只有在考虑行旋转和列旋转的时候会有影响,这个下一篇会具体介绍(挖坑 + 1)。

vector<uint64_t> pod_matrix(slot_count, 0ULL);
pod_matrix[0] = 1ULL;
pod_matrix[1] = 2ULL;
pod_matrix[2] = 3ULL;
pod_matrix[3] = 4ULL;
Plaintext x_plain;
batch_encoder.encode(pod_matrix, x_plain);

这里对编码结果打印输出一下:


3.3 直接运算

Ciphertext x_encrypted;
cout << "Encrypt x_plain to x_encrypted." << endl;
encryptor.encrypt(x_plain, x_encrypted);
cout << "+ noise budget in freshly encrypted x: " << decryptor.invariant_noise_budget(x_encrypted) << " bits" << endl;

这里先对输入进行加密,并输出噪声预算:


先计算 x^2

Ciphertext x_squared;
evaluator.square(x_encrypted, x_squared);
cout << "+ size of x_squared: " << x_squared.size() << endl;
evaluator.relinearize_inplace(x_squared, relin_keys);
cout << "+ size of x_squared (after relinearization): " << x_squared.size() << endl;
cout << "+ noise budget in x_squared: " << decryptor.invariant_noise_budget(x_squared) << " bits" << endl;

        因为是 密文乘密文,为了减少乘法后的密文大小,这里进行了重新线性化,并输出了噪声预算,同时进行解密验证:

可以看出,运算中间结果是正确的,并且重新线性化后,密文大小从3减小到2。


再计算 x^4

Ciphertext x_4th;
evaluator.square(x_squared, x_4th);
cout << "+ size of x_4th: " << x_4th.size() << endl;
evaluator.relinearize_inplace(x_4th, relin_keys);
cout << "+ size of x_4th (after relinearization): " << x_4th.size() << endl;
cout << "+ noise budget in x_4th: " << decryptor.invariant_noise_budget(x_4th) << " bits" << endl;

同样进行了重新线性化,并输出目前噪声预算,同时进行解密验证:

可以看出这里的噪声预算下降的特别快,只剩 35 bits 了。


最后计算 x^8

Ciphertext x_8th;
evaluator.square(x_4th, x_8th);
cout << "+ size of x_8th: " << x_8th.size() << endl;
evaluator.relinearize_inplace(x_8th, relin_keys);
cout << "+ size of x_8th (after relinearization): " << x_8th.size() << endl;
cout << "+ noise budget in x_8th: " << decryptor.invariant_noise_budget(x_8th) << " bits" << endl;

        噪声预算已经达到0,这意味着解密无法得到正确的结果。故此,引出 BGV需要模数切换以减少噪声增长!


3.4 加入模数切换的运算

下面演示在每次重新线性化后插入模数切换:(避免啰嗦,这里直接完整计算)

cout << "+ noise budget in x_squared (previously): " << decryptor.invariant_noise_budget(x_squared) << " bits" << endl;
evaluator.square(x_encrypted, x_squared);
evaluator.relinearize_inplace(x_squared, relin_keys);
evaluator.mod_switch_to_next_inplace(x_squared);
cout << "+ noise budget in x_squared (with modulus switching): " << decryptor.invariant_noise_budget(x_squared) << " bits" << endl;

evaluator.square(x_squared, x_4th);
evaluator.relinearize_inplace(x_4th, relin_keys);
evaluator.mod_switch_to_next_inplace(x_4th);
cout << "+ noise budget in x_4th (with modulus switching): " << decryptor.invariant_noise_budget(x_4th) << " bits" << endl;

evaluator.square(x_4th, x_8th);
evaluator.relinearize_inplace(x_8th, relin_keys);
evaluator.mod_switch_to_next_inplace(x_8th);
cout << "+ noise budget in x_8th (with modulus switching): " << decryptor.invariant_noise_budget(x_8th) << " bits" << endl;

decryptor.decrypt(x_8th, decrypted_result);
batch_encoder.decode(decrypted_result, pod_result);

这里对中间结果也进行解密,并输出其噪声预算的变化:

        这里仔细对比可以发现:虽然通过模数切换 x_squared 的噪声预算比之前少,但噪声预算的消耗速率较慢,故最后可以正确解密。

四、总结

        通过之前的介绍实验,我们能发现,有时候进行模数切换会损耗噪声预算,但是进行到一定乘法深度后,再进行切换就不会损耗噪声,这种情况是一定适合加入模数切换的。
        同时上面发现虽然降低了 x_squared 的噪声预算,但是噪声预算的消耗减慢,故这种情况也适合加入模数切换

        但是这些不意味着在每次计算后都应该进行模数切换,因为要权衡减少的预算和减缓消耗的速度,最好自己进行实验比对。"故为了在应用中实现噪声预算的最佳消耗速率,需要仔细选择插入模数切换的位置,并手动选择 coeff_modulus。"


下篇介绍对密文进行的 行旋转 和 列旋转(未完待续。。。)

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

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

相关文章

霍尼韦尔落地灯怎么样?书客、霍尼、柏曼护眼大路灯多维度实测

霍尼韦尔落地灯怎么样&#xff1f;护眼大路灯作为最适合新时代学生照明工具&#xff0c;以良好的作用表现得到了许多家长及社会人士的认同&#xff0c;但同时也因为火爆&#xff0c;市面上的品牌繁杂&#xff0c;出现了许多劣质或者不专业的产品&#xff0c;促使一些人不知道如…

学习java的日子 Day64 学生管理系统 web2.0 web版本

MVC设计模式 概念 - 代码的分层 MVC&#xff1a;项目分层的思想 字母表示层理解MModle模型层业务的具体实现VView视图层展示数据CController控制器层控制业务流程&#xff08;跳转&#xff09; 1.细化理解层数 Controller&#xff1a;控制器层&#xff0c;用于存放Servlet&…

中职云计算实训室

一、实训室建设背景 随着信息技术的飞速发展&#xff0c;云计算已成为推动数字化转型、促进经济社会发展的重要力量。《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》明确提出&#xff0c;要加快数字化发展&#xff0c;建设数字中国。云计算作为数…

我的创新大赛经验分享:打造一份出色的商业计划书

我的创新大赛经验分享&#xff1a;打造一份出色的商业计划书 前言封面和目录&#xff1a;第一印象至关重要执行摘要&#xff1a;一语中的项目背景&#xff1a;市场与行业的深度剖析产品/服务&#xff1a;展现独特性和竞争力市场分析&#xff1a;深入洞察目标市场商业模式&#…

等保测评练习卷30

等级保护初级测评师试题30 姓名&#xff1a; 成绩&#xff1a; 一、判断题&#xff08;10110分&#xff09; 1.要想使用远程桌面的SSL加密功能&#xff0c;运行的操作系统必须为Windows 2000 Server或以上版本。&#xf…

排序算法1:堆排序,直接插入排序与希尔排序

前言 前些时间&#xff0c;博主带领着大家学习了数据结构&#xff0c;数据结构中的二叉树更是其中的重中之重&#xff0c;我们之前了解了二叉树是现实计算机存储数据的一种重要形式。借助其结构&#xff0c;我们还能实现更多高效的功能。 今天我们将进入排序算法的章节&#…

Spring MVC框架学习笔记

学习视频:10001 Spring MVC概述_哔哩哔哩_bilibili~11005 请求映射方式_哔哩哔哩_bilibili 目录 1.概述 Java EE三层架构 Spring MVC在三层架构中的位置 ​编辑 Spring MVC在表现层的作用 Spring MVC的特点 2.Spring MVC入门程序 代码实现 Spring MVC工作原理 Spring …

ETF套利有什么好用的软件?ETF套利神器—万得宏汇

ETF套利全场景覆盖&#xff0c;支持瞬时、趋势、事件套利等业务场景。丰富的组合交易工具、灵活高效的窗口设置&#xff0c;叠加ETF利润计算器联动&#xff0c;让ETF投资更轻松。 L2行情极速柜台&#xff0c;交易快人一步 市场行情瞬息万变&#xff0c;行情速度决定交易速度&a…

智能化解决方案:提升汽车制造图文档发送效率,实现高效传输

汽车制造业企业数据外发需求频繁&#xff0c;不仅有与异地研发机构间、供应商之间的协同研发文件交换&#xff0c;还有与外包供应商及零部件供应商之间的基于价值链的协同关系。主要涉及的数据类型有&#xff1a;汽车制造图文档发送、研发数据发送、项目文件发送、反馈数据与协…

用 GO 开发一个windows桌面图形化软件入门

项目采用的是walk技术方案 一、初始化项目 创建一个文件夹比如demo&#xff0c;然后进入demo执行 go mod init demo 二、安装walk模块 go get github.com/lxn/walk go get github.com/lxn/win 三、安装rsrc 安装&#xff1a; go install github.com/akavel/rsrc 生成*…

【突发】国内大量家用路由器网络访问异常和流量劫持事件分析

以下内容由WebRAY和Panabit联合发布 0x01 事件背景 从2024年5月开始&#xff0c;国内部分家用路由器开始出现间歇性断网、域名解析延迟高以及解析到海外IP等情况&#xff0c;今年8月该现象变得尤为严重。前几天在做应急响应时候发现某企业暴露在公网上的路由器配置的DNS地址被莫…

无线自组网应急指挥系统解决方案详解

随着全球自然灾害频发和社会应急事件的增加&#xff0c;如地震、洪水、泥石流等&#xff0c;传统的通信手段在面对这些极端情况时往往显得力不从心。尤其是在灾区&#xff0c;基础设施的损毁往往导致通信网络瘫痪&#xff0c;使得救援行动陷入困境。如何在这种紧急情况下迅速建…

深度学习入门(六):无监督学习

一、K-means算法 K-means算法是一种常用的聚类算法&#xff0c;旨在将数据集划分成 k 个簇&#xff0c;使得每个簇中的数据点尽可能相似&#xff0c;而不同簇之间的数据点差异尽可能大。该算法是基于迭代的方法来寻找最优的簇中心&#xff0c;并通过不断调整簇的划分来最小化簇…

【web安全】权限漏洞之未授权访问

一.Jenkins未授权访问漏洞 步骤一&#xff1a;使用以下fofa语法进行搜索 port"8080" && app"JENKINS" && title"Dashboard [Jenkins]" 步骤二&#xff1a;进入执行页面http://xxx.xxx.xxx.xxx:xxxx/manage/script/index.php 执…

预训练大语言模型综述来了!中国人民大学教授发表包含了416个参考文献的大语言模型综述

尽管大语言模型在最近今年发展十分迅速&#xff0c;但是相关的综述却相对比较落后。本文是由中国人民大学教授Wayne Xin Zhao等人前几天刚公开的关于大语言模型的综述&#xff0c;论文正文部分共32页&#xff0c;包含了416个参考文献。内容十分详实。 这份大模型综述我已经打包…

【iOS多线程(三)】优先级反转问题

优先级反转 实时操作系统的一个基本要求就是基于优先级的抢占系统。保证优先级高的线程在“第一时间”抢到执行权&#xff0c;是实时系统的第一黄金准则。 但是这种基于优先级抢占的系统&#xff0c;有一个著名的问题需要关注&#xff0c;就是“优先级反转”&#xff08;Prio…

优思学院:标准化作业在精益管理之屋中的位置

除了两大支柱&#xff0c;我们必须要对整个精益之屋进行理解&#xff0c;才可以知道精益生产的全貌。精益之屋由4部分组成&#xff1a;地基、2个支柱和屋顶。 首先&#xff0c;地基就是5S活动、目视化管理、标准化作业来建立稳定性。 而标准化作业正正是大家都忽略&#xff0…

计算机网络408考研 2020

2020 湖科大教书匠的个人空间-湖科大教书匠个人主页-哔哩哔哩视频 计算机网络408考研 历年真题解析&#xff08;有字幕无背景音乐版&#xff09;_哔哩哔哩_bilibili 计算机网络408考研2020年真题解析_哔哩哔哩_bilibili 1 2 3 41 11 1

cmake 编译教程

一、只有一个源文件的程序编译 首先在当前目录下创建两个文件 hello.cpp CMakeLists.txt &#xff08;注意CMakeLists大小写&#xff0c;不要写错了&#xff09; cmake_minimum_required (VERSION 2.8)project (learn_cmake)add_executable(hello hello.cpp) 第一行意思是…

基于R语言绘制GGE双标图4

参考资料&#xff1a; https://cran.r-project.org/web/packages/GGEBiplots/GGEBiplots.pdf 1、数据整理 使用GGEBiplots包绘制双标图&#xff0c;分析用数据是二维数据表&#xff08;行表示品种或基因型&#xff0c;列表示试验点或环境&#xff09;。当我们的数据表是一维数…