Delphi源码学习与分析
Table of Contents
1.
2. Rust部分代码分析
2.1. algebra:
algebra文件夹提供了基本的代数操作,主要包括:
- 如何将一个整数表示为二进制流,以及对应的数字的写入写出
- 大整数
- 多项式操作
- 固定点
- 域相关
从中可以看出,algebra中不涉及到加密解密算法,仅仅是定义一些基本的结构和操作。
2.1.1. Polynomial
- struct
- Plymomial:该结构体主要用来存储多项式的参数,Vec<F>
- 方法:唯一值得重视的是evalute,给定一组二进制向量,计算带入多项式的结果
2.1.2. bytes
整数数据的二进制形式的读取与写入
- trait ToBytes, FromBytes:写入成byte,读取一个byte
- macro
- array_bytes,该宏用于负责u8,u16 u32 u64等数据的二进制的写入写出
- to_bytes:
- push_to_vec:
2.1.3. biginteger
- traits
- BigInteger,除了byte写入写出的操作,就是字节遍历的操作和各类数学运算
- BigInteger32
- BigInteger64
- mod
- arithmetic,封装了一些算术运算,不知道具体在哪里使用的
- adc, carry=a+b+carry
- sbb: borrow=a-b-borrow
- mac_with_carry: carry=a+b*c+carry
2.1.4. fixed_point
- trait
- FixedPointParameters:为一个固定点设置的参数
- 参数包括:MANTISSA_CAPACITY, EXPONENT_CAPACITY
- 函数:truncate_float
- FixedPointParameters:为一个固定点设置的参数
- Struct
- FixedPoint
- 参数:inner, inner满足域的性质。num_muls, u8。\_params: phantomdata类型的一个FixedPointParameters
- …
- FixedPoint
相关的操作运算:
- One
- Zero
- PhantomData
- Add,AddAssign
- Mul,M…
- Neg
- Sub,S…
2.1.5. fields
- trait
- Field,一个域满足很多数学计算性质,除此之外还有编程上的一些性质,无参数
- FpParameters, 有限域所涉及到的参数集合。所涉及到的变量
- 模数(modulus),模数的位数
- shave bits
- R,R^2,INVariant
- generator,一个乘法生成器,也是一个二次非剩余
- capacity,
- others…
- PrimeField,素数域的trait,包含如下的函数集合:
- from_repr,into_repr,即根据一个大数构造一个有效域出来
- from_random_bytes,根据一个bytes返回有限域中的一个元素
- characteristic,不知道,实现上返回了模数
- …
- SquareRootField,支持高效的平方根操作的field,包含以下函数:
- legendre,返回勒让得符号
- sqrt,…,平方根操作相关
- 其他
- 枚举变量勒让德符号,包括0,平方根剩余、平方根非剩余三种
- BitIterator,结构体包含变量的指针及其长度,可以遍历
- macros
- impl_filed_into_bigint:为大数构建对应的有限域!
- 函数
- batch_inversion: AES算法中涉及到的inversion操作
2.1.6. 其他
- trait
- UniformRandom
- 包含有一个函数,uniform。给定一个随机数,返回自身。
- UniformRandom
2.2. crypto-primitives
加密运算环节主要实现了三种简单的加密运算,分别是additive_share,beavers_mul以及garbled circuits。其中加法的共享主要用来进行线性的加密运算,beavers mul主要用来进行乘法同态运算,而gc则用来进行非线性激活函数的运算。
TODO beavers_mul缺少介绍
2.2.1. additive_share
- trait
- Share,一个复杂的trait,本身是一个变量,包含以下函数:
- share,将一个随机数一分为两个AdditiveShare变量
- share_with_randomness,完成1所用
- randomize_local_share(&AdditiveShare<Self>,&self::Ring),使用ring将当前的share岁计划.
- Share,一个复杂的trait,本身是一个变量,包含以下函数:
- Struct
- AdditiveShare,结构体,只有一个share类型的参数inner.方法包括:
- combine,解密
- add_constant…
- ShareIterator, 顾名思义,Share的一个iterator
- AdditiveShare,结构体,只有一个share类型的参数inner.方法包括:
- others
- 类型:FixedPoint<FixedPointparameters>
- From <Additiveshare<FixedPoint<Fixedpointparameters>>> 函数
- 为FixedPoint<FixedPointparameters> 实现Share trait
- 此时,Ring便是Field,constant类型与FixedPoint<FixedPointparameters>相同
- 类型:FixedPoint<FixedPointparameters>
2.2.2. beavers_mul
- struct
略
2.2.3. gc (garbled circuits)
略
2.3. neural-network
neural-network主要封装了:
- fc,conv等线性层
- relu,relu的多项式近似等非线性层
- input,output的additive share实现
- layer和neural network的抽象
2.3.1. layers
- LayerDims, 包含inputdims和outputdims
- Layer, 包含线性和非线性
- LayerInfo, 包含layerdims和linearlayerinfo等东西
其中linearlayer包含如下:
pub enum LinearLayer<F, C> { Conv2d { dims: LayerDims, params: Conv2dParams<F, C>, }, FullyConnected { dims: LayerDims, params: FullyConnectedParams<F, C>, }, FullyConnectedD { dims: LayerDims, params: FullyConnectedParamsD<F, C>, }, AvgPool { dims: LayerDims, params: AvgPoolParams<F, C>, }, Identity { dims: LayerDims, }, }
linear layer info包含如下:
pub enum LinearLayerInfo<F, C> { Conv2d { kernel: (usize, usize, usize, usize), padding: Padding, stride: usize, }, FullyConnected, FullyConnectedD, AvgPool { pool_h: usize, pool_w: usize, stride: usize, normalizer: C, _variable: PhantomData<F>, }, Identity, }
想查找哪些layer,请自己查。
2.3.2. tensors
tensors主要包括Input<T>和Output<T>两种范型,二者都是四维张量。 T的实例化一般就是share和AdditiveShare。
此处比较简单,故略
2.3.3. others
- enum
- EvalMethod, 其实就是device,是cpu还是cuda
- trait
- Evaluate,相当于pytorch中的forward,包含两种函数,一个是在cpu上forward,另一个是cuda上
- struct
- NeuralNetwork,包含一个layer的Vec,还有一个EvalMethod。包含以下函数:
- validate,返回一个bool值,代表该神经网络是否有效前一层的输出是否贴合后一层的输入
- from_numpy,给定npy文件的路径,读取得到神经网络模型中的所有参数
- Ealuate trait实现
- NeuralArchitecture,包含Vec<LayerInfo<F,C>>,主要就是介绍神经网络的结构信息
- NeuralNetwork,包含一个layer的Vec,还有一个EvalMethod。包含以下函数:
2.4. protocols-sys
protocols-sys定义了完整的密钥交换协议系统。主要包括:
- 调用C++的加密解密服务
- 为神经网络层和输入输出定义加密解密的结构体,实现对应的流程
2.4.1. client_cg
- struct & enum
- Conv2D,Fullyconnected, 二者都是包含了四个变量
- Metadata:有关于该层神经网络的一些元信息,被C++侧定义
- ClientFHE:同态加密的一些需求,如加密器,解密器等
- ClientShares:顾名思义
- SealclientCG,上述两种中的一种
- Conv2D,Fullyconnected, 二者都是包含了四个变量
- trait
- ClientCG,封装了上述结构体一些必须的操作,包括:
- 参数, 包括密钥、层信息、输入维度、输出维度等。
- 预处理
- 后处理
- 解密
- ClientCG,封装了上述结构体一些必须的操作,包括:
2.4.2. client_gen
- struct
- SealClientGen,仅包含一个参数,即上面提到的ClientFHE
- trait
- ClientGen,trait,包含三个函数
- new,略
- triples_preprocess
- triples_postprocess
- ClientGen,trait,包含三个函数
2.4.3. key_share
- struct
KeyShare. KeyShare便是C++版里的SerialCT,其定义为:
pub struct SerialCT { pub inner: *mut ::std::os::raw::c_char, pub size: u64, }
- trait
- KeyShare,最主要的函数就是generate。该函数会基于密钥构建出一个包含了同态加密和解密的函数
2.4.4. server_cg
类似于client_cg,略
2.4.5. server_gen
类似于client_gen,略
2.4.6. others
- struct
SealCT: SerialCT的rust封装,其格式类似于:
pub struct SerialCT { pub inner: *mut ::std::os::raw::c_char, pub size: u64, }
- 包含如下函数: en(de)crypt_vec,顾名思义,加解密一个向量
2.5. protocols
关于通讯的一些东西,略