tuneinsight/lattigo

GitHub: tuneinsight/lattigo

Lattigo 是一个基于格的 Go 语言多方同态加密库,为密文上的直接计算和分布式安全协议提供高性能的密码学基础设施。

Stars: 1436 | Forks: 214

# Lattigo:基于格的 Go 多方同态加密库

![Go 测试](https://github.com/tuneinsight/lattigo/actions/workflows/ci.yml/badge.svg) Lattigo 是一个 Go module,实现了基于全 RNS(Residue Number System)和 Ring-Learning-With-Errors 的同态加密基础组件,以及基于多方同态加密的安全协议。该库具有以下特点: - 针对 2 的幂次循环环进行了优化的算术运算。 - 对基于 RLWE 的基础组件、密钥生成及其多方版本,提供了先进且与方案无关的实现。 - 实现了 BFV/BGV 和 CKKS 方案及其多方版本。 - 支持 RGSW、外部乘积和 LMKCDEY 盲旋转。 - 纯 Go 语言实现,支持跨平台构建,包括面向浏览器客户端的 WASM 编译,其性能可与最先进的 C++ 库相媲美。 Lattigo 旨在支持分布式系统和微服务架构中的 HE,在这些场景下,得益于 Go 天然的并发模型和可移植性,它是一个常见的选择。 ## 库概览

lattigo-hierarchy

Lattigo 是一个具有严格层级的库,其包形成了一条从底层算术功能到高级同态电路的线性依赖链。上图描绘了 Lattigo 包的组织结构。 - `lattigo/ring`:最底层是 `ring` 包,它提供了 RNS 基础下多项式的模运算操作,包括:RNS 基扩展;RNS 缩放;数论变换(NTT);均匀分布、高斯分布和三值分布采样。 - `lattigo/core`:该包实现了该库的核心加密功能,并直接构建在 `ring` 包提供的算术功能之上: - `rlwe`:通用 RLWE 同态加密的通用基础。 它提供了所有的同态功能,并定义了所有非特定于方案的结构体。 这包括明文、密文、密钥生成、加密、解密和密钥切换, 以及其他更高级的基础组件,如 RLWE 重打包。 - `rgsw`:Ring-GSW 密文和外部乘积的全 RNS 变体。 - `lattigo/schemes`:基于 RLWE 的同态加密方案的实现可以在 `schemes` 包中找到: - `bfv`:Brakerski-Fan-Vercauteren 尺度不变同态加密方案的全 RNS 变体。该方案通过 `bgv` 方案的包装器进行实例化。 它提供了对整数的模算术。 - `bgv`:Brakerski-Fan-Vercauteren 尺度不变 (BFV) 和 Brakerski-Gentry-Vaikuntanathan (BGV) 同态加密方案的全 RNS 泛化。 它提供了对整数的模算术。 - `ckks`:用于近似数字算术的全 RNS 同态加密(HEAAN,又名 CKKS)方案。它提供了在复数域上(在其经典变体中)和实数域上(在其共轭不变变体中)的定点近似算术运算。 - `lattigo/circuits`:circuits 包为 `bgv` 和 `ckks` 密码系统提供了一组精选的同态电路实现: - `bgv/lintrans`, `ckks/lintrans`:适用于 `bgv` 和 `ckks` 的任意线性变换和 slot 排列。与方案无关的通用对象和函数位于 `common/lintrans` 中。 - `bgv/polynomial`, `ckks/polynomial`:适用于 `bgv` 和 `ckks` 的多项式求值电路。与方案无关的通用对象和函数位于 `common/polynomial` 中。 - `ckks/minimax`:适用于 `ckks` 的极小极大复合多项式评估器。 - `ckks/comparison`:适用于 `ckks` 方案的基于同态比较的电路,例如 `sign`、`max` 和 `step`。 - `ckks/inverse`:适用于 `ckks` 的同态求逆电路。 - `ckks/mod1`:使用 `ckks` 密码系统的 `mod1` 函数的同态电路。 - `ckks/dft`:适用于 `ckks` 方案的同态离散傅里叶变换电路。 - `ckks/bootstrapping`:用于实数和复数(即 `ckks` 方案)的定点近似算术的自举,支持共轭不变环、支持稀疏打包/较小环度密文的自动打包/解包的批量自举、任意精度自举,以及高级电路自定义/参数化。 - `lattigo/multiparty`:用于多方(又称分布式或阈值)密钥生成和使用秘密共享的私钥进行交互式密文自举的包。 - `mpckks`:从线性秘密共享份额同态解密和重新加密为线性秘密共享份额,以及为 `schemes/ckks` 包提供交互式密文自举。 - `mpbgv`:从线性秘密共享份额同态解密和重新加密为线性秘密共享份额,以及为 `schemes/bgv` 包提供交互式密文自举。 - `lattigo/examples`:演示 Lattigo 库使用的 Go 可执行程序。每个子包都包含进一步演示 Lattigo 基础组件用法的测试文件。 - `lattigo/utils`:通用实用方法。该包还包含以下子包: - `bignum`:任意精度线性代数和多项式近似。 - `buffer`:在 `io.Writer` 和 `io.Reader` 上进行读写的有效方法。 - `factorization`:适用于中等大小整数的各种因式分解算法。 - `sampling`:安全的字节采样。 - `structs`:用于映射、向量和矩阵的通用结构体,包括序列化。 ### 文档说明 各个包的完整文档可以使用官方 Golang 文档渲染工具 `pkgsite` 作为网页浏览,或者浏览 [Go doc](https://pkg.go.dev/github.com/tuneinsight/lattigo/v6)。 ``` $ go install golang.org/x/pkgsite/cmd/pkgsite@latest $ cd lattigo $ pkgsite -open . ``` ## 版本与路线图 在 2.4.0 版本之前,Lattigo 库最初完全由 EPFL 数据安全实验室 开发。 从 3.0.0 版本发布开始,Lattigo 由 [Tune Insight SA](https://tuneinsight.com) 维护和支持。 同样从 3.0.0 版本开始,模块名称更改为 `github.com/tuneinsight/lattigo/v[X]`,并且官方仓库已迁移至 https://github.com/tuneinsight/lattigo。这对依赖于 Lattigo 的模块有以下影响: - 依赖 `github.com/ldsec/lattigo/v2` 的模块仍然可以正确构建。 - 要升级到 X.y.z >= 3.0.0 的版本,依赖模块必须引入 `github.com/tuneinsight/lattigo/v[X]/`, 例如,将导入路径更改为 `github.com/tuneinsight/lattigo/v[X]/[package]` 并 运行 `go mod tidy`。 当前版本的 Lattigo (v6.x.x) 发展迅速且在不断开发中。因此, 除了许多错误修复和新功能外,在这个大版本内仍然会存在向后不兼容的更改。因此,我们鼓励所有 Lattigo 用户更新到最新的 Lattigo 版本。 有关当前和过去的版本,请参见 CHANGELOG.md。 ## 漏洞报告 请参见 [报告漏洞](SECURITY.md#report-a-vulnerability)。 ## 缺陷报告 Lattigo 欢迎任何符合预设模板的缺陷/回归报告,创建新的空白 issue 时会自动生成该模板。不符合规范的报告将导致 issue 被关闭且不予确认。 ## 开源许可 Lattigo 采用 Apache 2.0 许可证授权。请参见 [LICENSE](https://github.com/tuneinsight/lattigo/blob/master/LICENSE)。 ## 联系方式 在直接联系我们之前,请确保您的问题无法通过 issue 解决。 如果您想为 Lattigo 做出贡献或报告安全问题,或者您有功能提议或请求,亦或只是想直接联系我们,请使用以下邮箱:[lattigo@tuneinsight.com](mailto:lattigo@tuneinsight.com)。 ## 引用 引用 Lattigo 时,请使用以下 BibTex 条目: ``` @misc{lattigo, title = {Lattigo v6}, howpublished = {Online: \url{https://github.com/tuneinsight/lattigo}}, month = Aug, year = 2024, note = {EPFL-LDS, Tune Insight SA} } ``` Lattigo 的标志是由 [Renee French](http://reneefrench.blogspot.com/) 设计的原始 Golang 吉祥物的基于格的版本。
标签:EVTX分析, Go语言, 同态加密, 多方安全计算, 密码学库, 日志审计, 格密码学, 程序破解, 隐私计算