Lattigo: 基于格的多方同态加密Go语言库
Lattigo是一个Go模块,实现了基于全RNS环-带误差学习(Ring-Learning-With-Errors)的同态加密原语和基于多方同态加密的安全协议。该库具有以下特点:
- 针对2的幂次循环域的优化算术运算。
- 先进且与方案无关的RLWE基础原语、密钥生成及其多方版本的实现。
- BFV/BGV和CKKS方案及其多方版本的实现。
- 支持RGSW、外部乘积和LMKCDEY盲旋转。
- 纯Go语言实现,支持跨平台构建,包括用于浏览器客户端的WASM编译,性能可与最先进的C++库相媲美。
Lattigo旨在支持分布式系统和微服务架构中的同态加密,而Go语言因其天然的并发模型和可移植性成为这些系统的常见选择。
库概览
Lattigo是一个严格层次化的库,其包形成了一个从低级算术功能到高级同态电路的线性依赖链。上图展示了Lattigo包的组织结构。
-
lattigo/ring
:最底层是ring
包,提供RNS基多项式的模运算,包括:RNS基扩展;RNS重缩放;数论变换(NTT);均匀、高斯和三元采样。 -
lattigo/core
:此包实现了库的核心密码学功能,直接基于ring
包提供的算术功能:-
rlwe
:通用RLWE基同态加密的公共基础。提供所有同态功能并定义了非方案特定的所有结构。包括明文、密文、密钥生成、加密、解密和密钥切换,以及其他更高级的原语,如RLWE重打包。 -
rgsw
:环GSW密文和外部乘积的全RNS变体。
-
-
lattigo/schemes
:RLWE基同态加密方案的实现位于schemes
包中:-
bfv
:Brakerski-Fan-Vercauteren尺度不变同态加密方案的全RNS变体。通过bgv
方案的包装器实例化。提供整数上的模运算。 -
bgv
:Brakerski-Fan-Vercauteren尺度不变(BFV)和Brakerski-Gentry-Vaikuntanathan(BGV)同态加密方案的全RNS泛化。提供整数上的模运算。 -
ckks
:近似数字算术同态加密(HEAAN,又称CKKS)方案的全RNS实现。在其经典变体中提供复数上的定点近似算术,在其共轭不变变体中提供实数上的定点近似算术。
-
-
lattigo/circuits
:circuits包为bgv
和ckks
密码系统提供了一系列选定的同态电路实现:-
bgv/lintrans
,ckks/lintrans
:bgv
和ckks
的任意线性变换和槽置换。方案通用对象和函数位于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 install golang.org/x/pkgsite/cmd/pkgsite@latest
$ cd lattigo
$ pkgsite -open .
版本和路线图
Lattigo库最初由EPFL数据安全实验室独家开发,直到2.4.0版本。
从3.0.0版本开始,Lattigo由Tune Insight SA维护和支持。
同样从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的当前版本(v5.x.x)正在快速发展和不断开发中。因此,在这个主要版本中仍会有向后不兼容的更改,以及许多错误修复和新功能。因此,我们鼓励所有Lattigo用户更新到最新的Lattigo版本。
有关当前和过去版本的信息,请参阅CHANGELOG.md。
稳定性
为了保持全面的历史记录,我们优先考虑对除main
之外的分支进行变基而不是合并。带有dev_
前缀的分支是正在积极开发的分支,将会频繁变基。因此,我们不建议依赖它们。
拉取请求
外部拉取请求只应用于提出实质性的新功能,这些功能如果由我们完成将需要相当多的工作。如果您计划打开这样的拉取请求,请在这样做之前与我们联系,以确保提议的更改与我们的开发路线图一致。
仅提出小改动或琐碎更改的外部拉取请求将被转换为问题并关闭。
外部贡献将需要签署贡献者许可协议(CLA)。 您可以使用以下电子邮件联系我们以获取CLA副本:lattigo@tuneinsight.com。
错误报告
Lattigo欢迎任何符合预设模板的错误/回归报告,该模板在创建新的空白问题时自动生成。不符合规定将导致问题被关闭而不被确认。
许可证
Lattigo根据Apache 2.0许可证获得许可。请参阅LICENSE。
联系方式
在直接联系我们之前,请确保您的请求无法通过问题解决。
如果您想为Lattigo做出贡献或报告安全问题,您有功能提议或请求,或者您只是想直接联系我们,请使用以下电子邮件:lattigo@tuneinsight.com。
引用
请使用以下BibTex条目引用Lattigo:
@misc{lattigo,
title = {Lattigo v5},
howpublished = {Online: \url{https://github.com/tuneinsight/lattigo}},
month = Nov,
year = 2023,
note = {EPFL-LDS, Tune Insight SA}
}
Lattigo徽标是由Renee French创作的原始Golang吉祥物的基于格的版本。