同态加密库Openfhe的介绍与安装

同态加密的基本概念

所谓的加密,其实是明文空间到密文空间的映射关系。明文空间里面的元素,叫做明文,是我们想要保护的信息,通常会含有一些特殊的信息。常见的明文有图像,视频、个人资料等等。明文空间里面的元素,我们通常叫做密文,是用来保护明文的。对于一个安全的加密来说,如果不知道解密密钥,密文应该是十分接近随机数,其分布在密文空间应该是均匀随机的。密文本身不应该含有明文的任何信息,也就是语义安全性。

同态加密是一种特殊的加密方法。他可以允许我们直接对密文进行运算,其解密后的结果就是对应明文运算后的结果。这对于隐私计算是一个非常好用的工具,使得很多隐私计算协议变得简单直接。

假设加密函数为 c = E n ( m , P k ) c=\mathtt{En}(m,P_k) c=En(m,Pk),输入为明文 m m m和加密密钥(通常是公钥) P k P_k Pk.输出一个密文 c c c.
解密函数为 m = D e ( c , S k ) m=\mathtt{De}(c,S_k) m=De(c,Sk),输入为密文 c c c和解密密钥 S k S_k Sk.
加法同态是说 m 1 + m 2 = D e ( E n ( m 1 , P k ) ⨁ E n ( m 2 , P k ) , S k ) m_1+m_2=\mathtt{De}(\mathtt{En}(m_1,P_k)\bigoplus \mathtt{En}(m_2,P_k),S_k) m1+m2=De(En(m1,Pk)En(m2,Pk),Sk). 其中 ⨁ \bigoplus 是定义的两个密文的加法。
乘法同态是说 m 1 × m 2 = D e ( E n ( m 1 , P k ) ⨂ E n ( m 2 , P k ) , S k ) m_1\times m_2=\mathtt{De}(\mathtt{En}(m_1,P_k)\bigotimes \mathtt{En}(m_2,P_k),S_k) m1×m2=De(En(m1,Pk)En(m2,Pk),Sk).其中 ⨂ \bigotimes 是定义的两个密文的乘法。

OpenFHE是一个比较成熟的使用C++写的同态加密库[1],实现了基于RLWE的常见的同态加密方案,包括BGV [2],BFV [3],CKKS [4],FHEW/TFHE [5]. 具体实现的版本是剩余整数系统(RNS)变体,也就是使用64位的整数去表示大整数。
支持的运算有公钥加密,私钥加密,同态加法,层级同态乘法,自举(bootstrapping),密钥交换,最新的进展可以查阅他们的github网站OpenFHE github。

OpenFHE安装

OpenFHE 使用的是 Cmake 来组织编译,所以,在编译之前,首先需要确保你已经配置好了 Cmake 的环境。下面主要介绍在 linux 上安装的方法。

如果你的网络没有问题,那么安装是一件比较简单愉快的事情。
第一步要做的事情就是从 github 上下载源代码:

git clone https://github.com/openfheorg/openfhe-development.git

那么遇到没办法直接用命令下载怎么办呢?可能服务器暂时不支持访问 github 网站。这时候,你可以直接去OpenFHE github下载 ZIP 的压缩包。然后把压缩包上传到你的 linux 机器上。但是你会发现,下载压缩包的方法并不是很愉快的,如果编译的时候你的网络还是不能访问 github 的话,会出错。因为直接下载的 ZIP 里面的第三方依赖库没有自动下载。你会发现在目录 \openfhe-development-main\third-party\ 下的几个文件夹是空的。

下载 ZIP 压缩包 openfhe-development-main.zip 并上传到服务器。使用下面命令解压:

unzip openfhe-development-main.zip

然后进入下列路径:

cd openfhe-development-main/third-party

使用 ls 命令查看,里面有四个目录 cereal google-benchmark google-test gperftools, 这时候,如果这四个目录是空的,那么需要到 github 上下载。在OpenFHE github里面,找到 third-party目录,然后点进去,里面是4个链接。分别点进去下载 ZIP 压缩包,然后解压到对应的目录。

下面演示 cereal 的解压。首先将下载的 cerea-***.zip文件解压到对应目录

unzip -o cereal-your number.zip -d openfhe-development-main/third-party

然后进入 openfhe-development-main/third-party 目录,将解压后的文件改名为 cereal,(你应该先删除原来的 cereal 目录)
其他三个类似。

当源文件下载完成后,剩下的就比较简单了。
首先进入 OpenFHE 的源文件目录,然后使用 mkdir build 建立一个新的名叫 build 的文件夹,进入 build 文件夹.

cmake ../

生成编译的make文件。可以在 cmake 的时候指定最后安装的目录

cmake ../ -DCMAKE_INSTALL_PREFIX=/my_path

然后你会看到输出里面有这句话:

***** INSTALL IS AT /my_path; to change, run cmake with -DCMAKE_INSTALL_PREFIX=/your/path

然后在命令行继续输入

make 

这个命令会执行编译,将源文件编译为可执行文件和库。可以使用" -j"选项使用多线程编译,如" make -j4 ".
编译完成后,就可以将 OpenFHE 安装到常用路径了。

make install

如果你安装到默认路径 \usr\lcoal 那么你可能需要使用 sudo 命令才能安装 “sudo make install”.

安装成功测试

下面给出一个简单的测试源代码 test.cpp:

/*
test.cpp OpenFHE test code by zyf.
*/
#include<iostream>
#include"openfhe.h"
//The functions or classes of OpenFHE are in the namespace lbcrypto
using namespace lbcrypto;
using namespace std;
int main(){// set the parameters of bgvCCParams<CryptoContextBGVRNS> parameters;parameters.SetMultiplicativeDepth(0);parameters.SetPlaintextModulus(536903681);parameters.SetSecurityLevel(HEStd_128_classic);CryptoContext<DCRTPoly> cryptoContext = GenCryptoContext(parameters);cryptoContext->Enable(PKE);cryptoContext->Enable(KEYSWITCH);cryptoContext->Enable(LEVELEDSHE);KeyPair<DCRTPoly> keyPair;keyPair = cryptoContext->KeyGen();vector<int64_t> v1 = {-1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};cout<<"The original data is ";for(size_t i=0;i<v1.size();i++){cout<<v1[i]<<" ";}cout<<endl;Plaintext p1;p1=cryptoContext->MakePackedPlaintext(v1);Ciphertext<DCRTPoly> c1 = cryptoContext->Encrypt(keyPair.publicKey, p1);Plaintext p2;cryptoContext->Decrypt(keyPair.secretKey,c1,&p2);cout<<p2<<endl;
}

在test.cpp同一个目录添加 CMakeLists.txt 文件:

cmake_minimum_required (VERSION 3.5.1)
project(demo CXX)
set(CMAKE_CXX_STANDARD 17)
option( BUILD_STATIC "Set to ON to include static versions of the library" OFF)
find_package(OpenFHE)
set( CMAKE_CXX_FLAGS ${OpenFHE_CXX_FLAGS} )
include_directories( ${OPENMP_INCLUDES} )
include_directories( ${OpenFHE_INCLUDE} )
include_directories( ${OpenFHE_INCLUDE}/third-party/include )
include_directories( ${OpenFHE_INCLUDE}/core )
include_directories( ${OpenFHE_INCLUDE}/pke )
### add directories for other OpenFHE modules as needed for your project
link_directories( ${OpenFHE_LIBDIR} )
link_directories( ${OPENMP_LIBRARIES} )
if(BUILD_STATIC)set( CMAKE_EXE_LINKER_FLAGS "${OpenFHE_EXE_LINKER_FLAGS} -static")link_libraries( ${OpenFHE_STATIC_LIBRARIES} )
else()set( CMAKE_EXE_LINKER_FLAGS ${OpenFHE_EXE_LINKER_FLAGS} )link_libraries( ${OpenFHE_SHARED_LIBRARIES} )
endif()
add_executable(test test.cpp )

然后使用

cmake ./
make

就可以生成可执行文件 test 了。如果不能找到 OpenFHE库,可以尝试手动设置,将安装的路径添加到搜索路径中,如在 find_package 命令之前使用 include_directories(your path)将你的安装路径添加进去。

参考文献

[1] Al Badawi, Ahmad, et al. “Openfhe: Open-source fully homomorphic encryption library.” Proceedings of the 10th Workshop on Encrypted Computing & Applied Homomorphic Cryptography. 2022.
[2] Brakerski, Zvika, Craig Gentry, and Vinod Vaikuntanathan. “(Leveled) fully homomorphic encryption without bootstrapping.” ACM Transactions on Computation Theory (TOCT) 6.3 (2014): 1-36.
[3] Fan, Junfeng, and Frederik Vercauteren. “Somewhat practical fully homomorphic encryption.” Cryptology ePrint Archive (2012).
[4] Cheon, Jung Hee, et al. “Homomorphic encryption for arithmetic of approximate numbers.” Advances in Cryptology–ASIACRYPT 2017: 23rd International Conference on the Theory and Applications of Cryptology and Information Security, Hong Kong, China, December 3-7, 2017, Proceedings, Part I 23. Springer International Publishing, 2017.
[5] Ducas, Léo, and Daniele Micciancio. “FHEW: bootstrapping homomorphic encryption in less than a second.” Annual international conference on the theory and applications of cryptographic techniques. Berlin, Heidelberg: Springer Berlin Heidelberg, 2015.

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

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

相关文章

net 一台路由器如何让两个不同网段的终端可以通信。

# 终端设备自己设置就行了 # 路由器的设置 The device is running! #################################################### <Huawei> Feb 1 2024 21:21:09-08:00 Huawei %%01IFPDT/4/IF_STATE(l)[0]:Interface GigabitEt hernet0/0/0 has turned into UP state. <…

C++层uevent获取

本文用的是#include <cutils/uevent.h> 主要讲述android中怎么在C层接收uevent uevent 是 kernel层向用户层发送的一个事件 首先创建一个线程用于循环去获取uevent void testUevent {//创建一个线程一直循环pthread_t thread;int ret pthread_create(&thread, nu…

Win11系统连接带HDMI接口的显示器后,电脑没有声音如何调试

解决这个问题的方法很简单&#xff0c;没有那么复杂。之所以使用HDMI接口连接了显示器后没声音&#xff0c;原因就是HDMI接口是包含音频视频两种信号的接口。当电脑的HDMI接口被使用时&#xff0c;系统就会默认从HDMI设备输出声音信号了&#xff0c;而此时如果HDMI设备没有声音…

取巧方式el-select单选重复选择

前言&#xff1a;之前产品是可以多选&#xff0c;我就一想在el-select 加个multiple不就完事了吗&#xff1f;我兴高采烈几分钟就实现了这个选择框&#xff0c;可是后面说单选也要重复多选几个&#xff0c;顿时我就****,又不想自己写个 首先安装element-plus 一定要安装2.5版本…

什么是模板方法模式?它的实现方式有哪些?

什么是模板方法模式&#xff1f;它的实现方式有哪些&#xff1f; 模板方法模式是一种行为型模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;而将算法的一些步骤延迟到子类中实现&#xff0c;使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 模…

OSPF排错

目录 实验拓扑图 实验要求 实验排错 故障一 故障现象 故障分析 故障解决 故障二 故障现象 故障分析 故障解决 故障三 故障现象 故障分析 故障解决 故障四 故障现象 故障分析 故障解决 故障五 故障现象 故障分析 故障解决 故障六 故障现象 故障分析 …

wespeaker项目grpc-java客户端开发

非常重要的原始参考资料&#xff1a; 链接: triton-inference-server/client github/grpc java ps&#xff1a; 使用grpc协议的其它项目python/go可以参考git hub目录client/tree/main/src/grpc_generated下的其它项目 其它链接&#xff1a; 想要系统了解triton-inference-ser…

【linux】运维-磁盘空间不足-用到的命令(简洁)

【linux】运维-磁盘空间不足-用到的命令 常用&#xff1a; 注&#xff1a;du -s 和 -d 不能同时都用, -s | -d n 注&#xff1a;df -H 和 -h 区别 -H 1K1000 -h 1K1024 #-T 显示文件系统类型 -h 高可读性显示 df -Th #-c显示总和 ;sort -r 倒序显示 ;2>/dev/nul…

小白初探|神经网络与深度学习

一、学习背景 由于工作的原因&#xff0c;需要开展人工智能相关的研究&#xff0c;虽然不用参与实际研发&#xff0c;但在项目实施过程中发现&#xff0c;人工智能的项目和普通程序开发项目不一样&#xff0c;门槛比较高&#xff0c;没有相关基础没法搞清楚人力、财力如何投入&…

Mask-Free Video Instance Segmentation

论文地址&#xff1a;[2303.15904] 无掩码视频实例分割 (arxiv.org) 论文代码&#xff1a;https://github.com/SysCV/MaskFreeVis 目录 一、摘要 二、介绍 三、方法 3.1 时间掩码一致性 3.2 时间KNN-patch Loss 3.3 训练MaskFreeVIS 四. 数据集 五.消融实验 六. 结果 七…

Shell - 学习笔记 - 2.6 - Shell $*和$@之间的区别

$* 和 $ 都表示传递给函数或脚本的所有参数&#xff0c;我们已在《Shell特殊变量》一节中进行了演示&#xff0c;本节重点说一下它们之间的区别。 当 $* 和 $ 不被双引号" "包围时&#xff0c;它们之间没有任何区别&#xff0c;都是将接收到的每个参数看做一份数据&a…

深度解读NVMe计算存储协议-1

随着云计算、企业级应用以及物联网领域的飞速发展&#xff0c;当前的数据处理需求正以前所未有的规模增长&#xff0c;以满足存储行业不断变化的需求。这种增长导致网络带宽压力增大&#xff0c;并对主机计算资源&#xff08;如内存和CPU&#xff09;造成极大负担&#xff0c;进…

Python网络爬虫分步走之 – 第一步:什么是网络爬虫?

Python网络爬虫分步走之第一步&#xff1a;什么是网络爬虫&#xff1f; Web Scraping in Python Step by Step – 1st Step, What is Web Crawler? By JacksonML 1. 什么是网络爬虫&#xff1f; 在能够使用Google搜索引擎的场合&#xff0c;你是否尝试过简单搜索&#xff…

【C++】类和对象万字详解

目录 一、类与对象 1、类是什么 二、类和对象的基础知识 2.1 定义类&#xff1a;成员变量和成员函数 2.2 创建对象&#xff1a;实例化一个类的对象。 2.3对象的生命周期&#xff1a;构造函数和析构函数。 a. 构造函数 b. 析构函数 c.小结&#xff1a; 三、成员变量和…

Debezium系列之:深入理解GTID全局事务标识,并记录一次数据库重启造成数据丢失的原因和解决方案

Debezium系列之:深入理解GTID,并记录一次数据库重启造成数据丢失的原因和解决方案 一、背景二、深入理解什么是GTID三、深入理解gtid的uuid部分四、判断GTID之间的顺序大小五、解决方案一、背景 hive数据库的表与源头业务数据库的数据不一致,经过检查发现源头数据库发生了重…

腾讯云雾锁王国游戏服务器上线,10秒钟快速搭建!

随着科技的飞速发展&#xff0c;游戏行业也迎来了前所未有的繁荣。在这个时代&#xff0c;玩家们对游戏的体验需求日益增长&#xff0c;对服务器的稳定性和速度要求也越来越高。为了满足市场需求&#xff0c;腾讯云推出了雾锁王国游戏联机服务器及一键部署方案&#xff0c;只需…

❤ 做一个自己的AI智能机器人吧

❤ 做一个自己的AI智能机器人 看了扣子&#xff08;coze&#xff09;的模型&#xff0c;字节基于chatgpt搭建的一个辅助生成AI的网站&#xff0c;感觉蛮有意思&#xff0c;看了掘金以后&#xff0c;于是动手自己也实现了一个。 官网 https://www.coze.cn/ 进入的网站 1、 创…

java之基础知识、零碎知识

MENU java学习路程之篇一、知识点、path环境变量、计算机发展史、数据的存储和运算、人机交互、计算机语言java学习路程之篇二、知识点、JAVA背景介绍、配置JAVA_HOME、跨平台、JVM、JRE、JDKjava学习路程之篇三、知识点、类、模块、项目、操作、下载、安装、IDEA、开发工具jav…

CMake官方教程中文翻译 Step 6: Adding Support for a Testing Dashboard

鉴于自己破烂的英语&#xff0c;所以把cmake的官方文档用 谷歌翻译 翻译下来方便查看。 英语好的同学建议直接去看cmake官方文档&#xff08;英文&#xff09;学习&#xff1a;地址 点这里 或复制&#xff1a;https://cmake.org/cmake/help/latest/guide/tutorial/index.html …

速过计算机二级python——第二讲:基础语法

第二讲&#xff1a;基础语法 基础语法1. 变量2. 变量命名2.1语法规则2.1.1 区分大小写2.1.2 缩进 4 个空格2.1.3 # 注释 2.2 人机交互1. 输入函数&#xff1a;input()2. 转换函数&#xff1a;eval()3. 输出函数 print() 数据类型String&#xff08;字符串&#xff09;数字 组合…