2021SC@SDUSC
2021-12-05
第十周完成事项
工作内容
本周的工作是分析rns,也就是剩余数系统。下面先来简单看一下什么是剩余数系统以及剩余数系统在全同态加密算法中的作用。
RNS——剩余数系统
与冗余数相反,剩余数表示系统(RNS,residue number system)是一种用较少的数表示较多的数的表示系统。RNS可显著提高信号处理应用中某些算法密集型场景的算法速度。此外,RNS也是研究快速算法极限理论的一个工具。
RNS的表示
1500年前的一位古代中国学者写下了这样一个问题:“已知三个数分别除以7、5、2得到的余数是2、3、2,试问这三个数分别是多少?”这可能是历史上第一个使用多剩余数表示的数字。这个问题的本质上是要将 模 (7|5|3) 的剩余数系统 上表示的数 (2|3|2) 转换为其对应的标准十进制形式。
在RNS中,一个数 x x x 由它分别除以相对质数 m k − 1 > . . . > m 1 > m 0 m_{k-1}>...>m_1>m_0 mk−1>...>m1>m0得到的所有余数 x i x_i xi 组成的余数列表示。
就是说, x x x 在RNS表示下第 i i i位的值 x i x_i xi 为: x i = x x_i=x xi=x m o d mod mod m i = [ x ] m i m_i=[x]_{m_i} mi=[x]mi
其中 m i m_i mi 是相对质数,并且 m i > m i − 1 m_i>m_{i-1} mi>mi−1, i = 0 , 1 , . . . , k − 1 i=0,1,...,k-1 i=0,1,...,k−1。
因此,这里将有总共0到k位 x i x_i xi ,且关于 x i x_i xi 的数集有 x i ∈ [ 0 , m i − 1 ] x_i∈[0,m_{i-1}] xi∈[0,mi−1]。
对于 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hf73Nt3k-1638714706810)(https://www.zhihu.com/equation?tex=x)] 在某个RNS系统下的表示,我们将其写为: x = ( x k − 1 ∣ x k − 2 ∣ . . . ∣ x 1 ∣ x 0 ) R N S ( m l − 1 ∣ . . . ∣ m 1 ∣ m 0 ) x=(x_{k-1}|x_{k-2}|...|x_1|x_0)_{RNS_{(m_{l-1}|...|m_1|m_0)}} x=(xk−1∣xk−2∣...∣x1∣x0)RNS(ml−1∣...∣m1∣m0)
该RNS系统有0到k-1种 m i m_i mi ,也称该RNS系统为k模RNS(k-modulus RNS),显然k就是其中 ( x k ∣ x k − 1 ∣ . . . ∣ x 1 ∣ x 0 ) (x_k|x_k-1|...|x_1|x_0) (xk∣xk−1∣...∣x1∣x0) 的位数,即该RNS系统下的一个数的位数。
例如对于开头讨论的中国古代问题有: x = ( 2 ∣ 3 ∣ 2 ) R N S ( 7 ∣ 5 ∣ 3 ) x=(2|3|2)_{RNS_{(7|5|3)}} x=(2∣3∣2)RNS(7∣5∣3) 。
动态范围
所有 m k m_k mk 的乘积 M M M 是其对应的RNS系统中所有不同值的数量(即 ( x k × x k − 1 × . . . × x 1 × x 0 ) (x_k×x_k-1×...×x_1×x_0) (xk×xk−1×...×x1×x0) 所有不同取值情况的数量),称其为动态范围(Dynamic range): M = m k − 1 × . . . × m 1 × m 0 M=m_{k-1}×...×m_1×m_0 M=mk−1×...×m1×m0
例子
例如对于上面的4模RNS系统 R N S ( 8 ∣ 7 ∣ 5 ∣ 3 ) RNS(8|7|5|3) RNS(8∣7∣5∣3) 就有 M = 8 × 7 × 5 × 3 = 840 M=8×7×5×3=840 M=8×7×5×3=840 ,840即该RNS下的剩余表示数 ( x 3 ∣ x 2 ∣ x 1 ∣ x 0 ) (x_3|x_2|x_1|x_0) (x3∣x2∣x1∣x0)所有可能的取值情况,即它有840种取值。
作为例子,下面是 R N S ( 8 ∣ 7 ∣ 5 ∣ 3 ) RNS(8|7|5|3) RNS(8∣7∣5∣3) 剩余数系统上的一些数:
RNS的补码
由于: [ − x ] = [ M − x ] m i [-x]=[M-x]_{m_i} [−x]=[M−x]mi,通过选定一个特别的互补常数 M M M ,我们可以让 R N S ( 8 ∣ 7 ∣ 5 ∣ 3 ) RNS(8|7|5|3) RNS(8∣7∣5∣3) 的840个可用值表示0~839,-420~+419或任何一个连续840个整数的范围。实际上,补数系统就是利用这个性质来实现负数表示的。
因此,给定 x x x 的RNS表示,其对应的 − x -x −x 的表示可以通过将每个 x i x_i xi 与其对应的 m i m_i mi 互补获得(即计算补码)(对于 x 0 x_0 x0 我们规定 m 0 = 0 m_0=0 m0=0)。
RNS的算术
如前所述,对于 x x x 的RNS表示,可以对其每个 x k x_k xk 相对于 m i m_i mi 互补以取反它的正负。同样地,其上面的加减乘的计算过程也可以每位分开地计算,例如对于RNS(8|7|5|3)有例子:
对于RNS的加减乘运算器,每位 x k x_k xk 都将会是一个较小的值,所以在RNS上,这些运算操作可以相当快速并简便,这是RNS算数的主要优势。
RNS对于全同态加密算法的作用
通过RNS,将数转化为RNS表示,可以加快整个算法的运算速度。
众所周知,传统的加密算法需要进行大规模运算,以保持算法整体的安全性,所以一般需要大规模的时间,通过将运算的数转化为RNS表示,利用RNS表示数的运算的优势,可以将运算的速度得到质的飞跃。
代码分析
class RNSBase
{
public:
RNSBase(const std::vector<Modulus> &rnsbase, MemoryPoolHandle pool);
RNSBase(RNSBase &&source) = default;
RNSBase(const RNSBase ©, MemoryPoolHandle pool);
RNSBase(const RNSBase ©) : RNSBase(copy, copy.pool_){}
首先定义基础的RNS类,上述为构造函数以及复制构造函数。
RNSBase &operator=(const RNSBase &assign) = delete;
SEAL_NODISCARD inline const Modulus &operator[](std::size_t index) const
{
if (index >= size_)
{
throw std::out_of_range("index is out of range");
}
return base_[index];
}
重载=和[]运算符,以便后续的计算。
SEAL_NODISCARD inline std::size_t size() const noexcept
{
return size_;
}
SEAL_NODISCARD bool contains(const Modulus &value) const noexcept;
SEAL_NODISCARD bool is_subbase_of(const RNSBase &superbase) const noexcept;
SEAL_NODISCARD inline bool is_superbase_of(const RNSBase &subbase) const noexcept
{
return subbase.is_subbase_of(*this);
}
SEAL_NODISCARD inline bool is_proper_subbase_of(const RNSBase &superbase) const noexcept
{
return (size_ < superbase.size_) && is_subbase_of(superbase);
}
SEAL_NODISCARD inline bool is_proper_superbase_of(const RNSBase &subbase) const noexcept
{
return (size_ > subbase.size_) && !is_subbase_of(subbase);
}
一些常规的功能性函数,比如说获取大小、判断是否包含模数、一个RNSbase是否为另一个RNSbase的子base或者是父base以及一个RNSbase是否为另一个RNSbase的正确的子base或者是父base等。
SEAL_NODISCARD RNSBase extend(const Modulus &value) const;
SEAL_NODISCARD RNSBase extend(const RNSBase &other) const;
SEAL_NODISCARD RNSBase drop() const;
SEAL_NODISCARD RNSBase drop(const Modulus &value) const;
最后是一些扩展性质的函数,增加模数、扩充当前RNSbase、丢弃当前RNSbase以及丢去某个模数。
总结
这次首先是了解了什么是剩余数系统,以及剩余数系统对于运算和全同态加密算法的作用。接下来将进一步对于代码进行分析。
最后,感谢孔老师的指导,感谢戴老师和其他审核老师的阅读!