🍊Authenticated Private Information Retrieval源码解析
2024-4-25
| 2024-4-27
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
🍊
这是一篇针对发表在USENIX 2023上的隐私信息检索论文Authenticated Private Information Retrieval的源码解析。该篇论文的具体内容参见文章

目 录

lib/utils

主要功能:实现了一些基础组件包括:配置导入、编码方法、LWE假设、高斯噪声等以方便后续其他包中使用
config.go

config.go

constants
N/A
variables
N/A
functions
  1. LoadConfig
go-toml 是 Go 语言中的一个包,用于处理 TOML(Tom's Obvious, Minimal Language)格式的文件。TOML 是一种配置文件格式,由于其简洁的设计,易于阅读。该包提供了一些函数,用于在 Go 中对 TOML 数据进行编码和解码。它允许您轻松地将 TOML 配置文件解析为 Go 数据结构,反之亦然。
types
  1. type Config struct
Config是一个结构体类型,其中包含一个map类型Servers(Servers的键类型是string,值类型是一个结构体类型Server。)以及一个字符串数组切片Addresses。
  1. type Server struct
Server是一个结构体类型,其中包含三个类型变量:1)一个整型int变量Index,记录服务器索引;2)一个字符串变量string,记录服务器ip地址;3)一个int整型变量Port,记录服务器端口。
Source Files
 

encoding.go

constants
N/A
variables
N/A
functions
  1. Uint32SliceToByteSlice
  1. ByteSliceToUint32Slice
  1. ByteToBits
types
N/A

gauss.go

constants
N/A
variables
  1. cdf_table:一个双精度浮点型float64变量(adapted from https://github.com/ahenzinger/simplepir/blob/main/pir/gauss.go
functions
  1. GaussSample
types
N/A

lwe.go

constants
N/A
variables
  1. SeedMatrixA: 一个c长度为16的字节型数组,初始化一个用于AES加密的种子矩阵,用于生成密钥扩展的初始矩阵。在加密中,AES算法会使用这个种子矩阵以及密钥来生成一系列轮密钥,用于加密数据块。
functions
  1. ParamsDefault
  1. ParamsWithDatabaseSize
  1. computeB
  1. GetDefaultSeedMatrixA
  1. ParamsDefault128
  1. ParamsWithDatabaseSize128
types
  1. type ParamsLWE struct

profile.go

constants
 
variables
functions
  1. StartProfiling
这段代码是一个 Go 语言函数,名为 StartProfiling。它接收一个字符串类型的参数 filename,用于指定要写入的文件名。函数的主要功能是启动 CPU profiling,即在程序执行过程中定期记录 CPU 使用情况,并且在接收到操作系统的中断信号时,停止记录并退出程序。这对于分析程序的性能和寻找性能瓶颈非常有用。具体解析如下:
  • 函数开始时,首先尝试创建一个文件,文件名由参数 filename 指定。如果创建文件时出现错误,则调用 log.Fatal(err) 打印错误信息并退出程序。
  • 如果文件创建成功,接着调用 pprof.StartCPUProfile(f),开始 CPU profiling。这将导致程序在后台记录 CPU 使用情况到指定的文件 f 中。
  • 接下来,代码通过使用 os.Signal 来监听操作系统的信号,其中包括 os.Interrupt(通常是 Ctrl+C 中断信号)和 os.Kill(终止信号)。当收到这些信号时,会执行一段匿名函数。
  • 匿名函数中的 for range c 语句使其成为一个无限循环,等待信号的到来。
  • 当收到信号时,匿名函数内部执行 pprof.StopCPUProfile() 来停止 CPU profiling。然后调用 os.Exit(0) 退出程序。
2. StopProfiling
StopProfiling 函数的作用是停止 CPU profiling。它调用了 pprof.StopCPUProfile() 来停止记录 CPU 使用情况。这个函数通常在程序退出时调用,以确保 CPU profiling 已经结束并且数据已经保存。
  1. writeMemProfile
writeMemProfile 函数用于将内存分析数据写入到指定的文件中。它接收一个字符串类型的参数 filename 作为写入文件的名称。函数内部首先尝试创建文件,并在创建过程中处理可能出现的错误。然后,它调用 pprof.WriteHeapProfile(f) 来将内存分析数据写入到文件中。最后,关闭文件以确保写入完成并释放资源。
  1. StartMemProfiling
  • 函数首先创建一个用于接收操作系统中断信号的通道 c
  • 然后使用 signal.Notify(c, os.Interrupt) 来监听操作系统的中断信号,一旦收到中断信号,就会执行匿名函数。
  • 匿名函数中的 for range c 语句构成一个无限循环,等待中断信号的到来。
  • 当收到中断信号时,匿名函数内部会调用 writeMemProfile(filename) 函数来写入内存分析数据到指定的文件中。
  • 最后,调用 os.Exit(0) 退出程序。
  1. writeBlockProfile
  • func writeBlockProfile(filename string) {: 这是一个函数定义,函数名为 writeBlockProfile,它接受一个字符串参数 filename,表示文件名。
  • f, err := os.Create(filename): 在这行代码中,通过 os.Create 函数创建了一个名为 filename 的文件。返回的 f 是文件的句柄(File 类型),err 是可能出现的错误。
  • if err != nil { log.Fatal(err) }: 这行代码用于检查是否创建文件时发生了错误。如果 err 不为 nil,也就是发生了错误,那么通过 log.Fatal 函数记录错误并终止程序。
  • log.Printf("Writing block profile"): 这行代码简单地记录了一个日志消息,指示正在写入阻塞性能分析数据。
  • pprof.Lookup("block").WriteTo(f, 0): 这行代码使用 pprof.Lookup 函数查找名为 "block" 的性能分析数据,并将其写入到之前创建的文件中。第二个参数 0 表示写入所有数据。
  • f.Close(): 最后一行代码用于关闭之前创建的文件,释放资源。
StartBlockProfiling
  1. runtime.SetBlockProfileRate(1): 这行代码设置了阻塞性能分析的采样率为 1,这意味着每一个阻塞事件都会被记录下来,用于后续的分析。
  1. c := make(chan os.Signal, 1): 这行代码创建了一个缓冲大小为 1 的信号通道 c,用于接收操作系统发出的信号,例如中断信号。
  1. signal.Notify(c, os.Interrupt): 这行代码将 os.Interrupt 信号(通常是用户按下 Ctrl+C)注册到信号通道 c 上,表示当程序接收到中断信号时,将其发送到 c 通道中。
  1. go func() { ... }(): 这是一个匿名函数,通过 go 关键字开启了一个新的 goroutine,用于监听信号通道 c 上的中断信号。
  1. for range c { ... }: 这是一个无限循环,用于持续地等待接收信号通道 c 上的信号。一旦接收到信号,就执行下面的代码。
  1. writeBlockProfile(filename): 当接收到中断信号时,调用 writeBlockProfile 函数,将阻塞性能分析数据写入到指定的文件中。
  1. os.Exit(0): 然后调用 os.Exit 函数退出程序,参数 0 表示正常退出。
types

rand.go

constants
variables
functions
  1. RandInt
  1. MathRand
types
  1. PRGKey
  1. PRGReader
定义了一个结构体类型PRGReader,其中包含一个PRGKey类型(一个长度为aes.BlockSize的字节型数组),另一个是cipher包中的接口类型Stream。cipher.Stream 接口只有一个方法 XORKeyStream,该方法将输入的源数据(明文或密文)与密钥流进行异或操作,结果写入目标切片中。这种按字节异或的方式是流密码的基本操作。
  1. BufPRGReader
定义了一个结构体类型BufPRGReader,其中包含一个

tls.go

constants
 
variables
functions
types

utils.go

constants
 
variables
functions
types

lib/ecc

主要功能:定义了纠错码的参数,实现了Boyer-Moore Majority Vote算法

ecc.go

constants
 
variables
functions
types

参考文献


    ☎️
    有关这篇文章的任何问题,欢迎您在底部评论区留言,一起交流~ 🍊
     
    Go并发编程PLASMA: Private, Lightweight Aggregated Statistics against Malicious Adversaries
    • Twikoo
    目录