Lattigo安装入门
Lattigo简介
Lattigo是一个开源的库,为实现基于格的同态加密(Homomorphic Encryption,HE)算法提供了一系列的工具。它是用Go语言编写的,并通过提供易于使用的API来简化同态加密的实现。
同态加密是一种在加密数据上进行计算的方法,结果也是加密的,可以在不解密数据的情况下对其进行操作。这使得同态加密在需要处理敏感数据的场景(如云计算、隐私保护等)中非常有用。
Lattigo库实现了两种形式的同态加密:BFV方案和CKKS方案。
- BFV方案:BFV方案是一种支持任意数量的加法和乘法操作的整数同态加密方案。它允许用户在加密的整数上执行算术运算。
- CKKS方案:CKKS方案是一种近似的同态加密方案,它允许在复数或浮点数上执行算术运算,并得到一个近似的结果。
Lattigo的优势在于,相比较微软的SEAL库,Lattigo提供了一系列进阶操作,如多密钥的BFV方案、多密钥的CKKS方案和自举等,这些操作能使同态支持更多操作,完成更多运算。
初识Go语言
使用Lattigo首先需要了解什么是Go语言,Go语言的基本语法。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Robert Griesemer、Rob Pike和Ken Thompson在2007年开始设计Go,后在2009年正式公布。Go的语法接近C语言,但对于变量声明、函数返回值、错误处理、并发、内存分配和其他特性有一些改进。
安装Go
Go语言的安装十分简单,访问Go官网下载安装对应操作系统的安装包即可,参照官网给出的安装步骤。
-
Linux:
-
通过删除
/usr/local/go
文件夹来删除任何以前的 Go 安装 (如果存在),然后将您刚刚下载的存档解压缩到/usr/local
中,创建一个新的/usr/local/go
:rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.1.linux-amd64.tar.gz
(您可能需要以 root 身份或通过 )运行该命令。
sudo
不要将存档解解压到现有的
/usr/local/go
目录中,会导致Go 安装产生损坏。 -
将
/usr/local/go/bin
添加到环境变量PATH
中。为此,您可以将以下行添加到您的 $HOME/.profile 或 /etc/profile(用于系统范围的安装):export PATH=$PATH:/usr/local/go/bin
**注意:**对配置文件所做的更改不会立即生效,需直接运行 shell 命令更新配置文件。如:
source $HOME/.profile
-
通过打开命令提示符并键入 以下命令:
go version
-
确认该命令打印已安装的 Go 版本。
-
-
Mac:
-
打开下载的软件包文件,然后按照提示进行安装Go。
该软件包将 Go 发行版安装到
/usr/local/go
。同时应该将/usr/local/go/bin
目录放在您的环境变量PATH
中。您可能需要重新启动任何 打开终端会话以使更改生效。 -
通过打开命令提示符并键入以下命令:
go version
-
确认该命令打印已安装的 Go 版本。
-
-
Windows:
-
打开下载的软件包文件,然后按照提示进行安装Go。
-
在 Windows 中,单击**“开始**”菜单;在菜单的搜索框中,键入
cmd
,然后按 Enter 键;在出现的命令提示符窗口中。 -
键入以下命令命令:
go version
-
确认该命令打印已安装的 Go 版本。
-
Go语言入门
Go语言的使用可以参考教程Tutorial: Get started with Go,在这我只给出一些基本操作,首先创建一个空白文件夹。
-
项目初始模块,如果项目还不是模块的话,可以用过在目录下运行命令:
go mod init <模块名>
这里的
<模块名>
是你的模块标识符,通常是一个可以解析到你项目的路径(例如一个GitHub仓库的URL、本地的example/hello
、hello
等)。运行完成后,在目录下会生成go.mod
文件,会用来管理代码程序所用的依赖。 -
添加依赖,在Go语言中当你需要使用别人的库时,你就可以使用
go get
来下载一个库了。下面是go get
命令的基本用法:go get <库的路径>
这里的
<库的路径>
是你想要下载的库的导入路径。在Go语言官网下,你可以直接搜索Go支持的库Go管理库。例如你想安装Lattigo依赖,你可以访问lattigo package,那么在命令行中输入:go get github.com/tuneinsight/lattigo/v5
即可完成导入Lattigo包。如果你想下载特定版本的库,你可以在库的路径后面加上
@版本号
。注:如果在安装时,出现网络问题,导致无法下载相应库,可以通过修改代理来解决:
go env -w GOPROXY=https://goproxy.io,direct
-
调整项目依赖,使用
go mod tidy
命令确保你的go.mod
和go.sum
文件包含了所有正确的依赖项和它们的版本,同时移除不再需要的依赖项。这个命令还会检查你的模块是否缺失某些必需的依赖项,并尝试下载它们:go mod tidy
这样,你就能够确保你的项目依赖是最新和正确的。
-
运行程序,Go语言通过
go run
来运行程序:go run . go run <package>
go run .
是编译并运行当前目录中的代码,适合快速测试本地代码;而go run package
用于编译并运行指定的 Go 包,适合当你需要运行的代码位于不同的目录或包中时使用。 -
生成可执行文件,Go语言可以直接用
go build
生成可执行文件:go build . go build <package>
此外,Go语言还有一些其它用法,例如包之间的调用,写测试代码以及错误返回等,具体可以查看入门 - Go 编程语言,其中的图书。
一个简单例子
在本节中,我们写一个简单例子。
-
首先,创建一个文件夹:
mkdir hello cd hello
-
初始化模块:
go mod init example/hello
会在当前文件夹下生成
go.mod
文件。 -
创建
hello.go
文件,并复制如下代码:package main import ( "fmt" "time" ) func main() { fmt.Println("Hello, World!") fmt.Println("Program will pause for 5 seconds...") time.Sleep(5 * time.Second) // 暂停5秒 fmt.Println("Program resumed.") }
-
运行文件
go run .
-
打印输出结果
D:\code\go\hello>go run . Hello, World! Program will pause for 5 seconds... Program resumed.
-
编译成可执行文件
go build .
在Go语言中,一些默认的包:
包名 | 描述 |
---|---|
fmt | 用于格式化输入输出,包括打印到控制台和读取用户输入。 |
io 和 ioutil | 用于基本的输入输出功能,如文件读写和数据流操作。 |
os | 提供了与操作系统交互的功能,包括文件系统操作、环境变量、进程管理等。 |
net | 用于网络相关的操作,包括TCP/UDP通信,HTTP客户端和服务端实现。 |
http | 用于处理HTTP请求和响应,构建Web服务器和客户端。 |
encoding/json | 提供了JSON的序列化和反序列化功能。 |
time | 提供了测量和显示时间和日期的功能。 |
strconv | 用于基本类型与其字符串表示的相互转换。 |
bytes 和 strings | 提供了对字节切片和字符串的操作函数。 |
math | 包含基本的数学函数和常量。 |
sort | 提供了对切片和用户定义集合的排序和搜索功能。 |
sync 和 sync/atomic | 用于同步不同的goroutine,实现互斥锁和原子操作。 |
log | 用于记录日志信息,支持不同的日志级别。 |
regexp | 用于正则表达式匹配和查找。 |
flag | 用于解析命令行参数。 |
context | 提供了一个上下文接口,用于传递截止日期、取消信号以及其他请求范围的值。 |
errors | 用于创建和操作错误。 |
有了Go语言相关的基础,再搭配一款代码编辑器(推荐VScode),我们接下来可以开始尝试使用Lattigo了。