SEAL全同态加密开源库(七) rns剩余数系统-源码解析

2021SC@SDUSC

2021-11-21

前言

这是SEAL开源库代码分析报告第七篇,本篇将继续分析util文件夹中的rns.h和rns.cpp,也即剩余数系统。

理论知识补充

推荐一篇很好的初学者入门博客,陈志罡教授写的:科学网—整数上全同态加密方案分析(1)–献给全同态加密的初学者 - 陈智罡的博文 (sciencenet.cn)

本期的理论知识补充,我们介绍RNS,剩余数系统。

剩余数表示系统(RNS,residue number system)是一种用较少的数表示较多的数的表示系统。RNS可显著提高信号处理应用中某些算法密集型场景的算法速度。此外,RNS也是研究快速算法极限理论的一个工具。

可能上面的看起来有些困难,这里举个例子,帮助理解。

1500年前的一位古代中国学者写下了这样一个问题:“已知三个数分别除以7、5、2得到的余数是2、3、2,试问这三个数分别是多少?”这可能是历史上第一个使用多剩余数表示的数字。这个问题的本质上是要将 模 (7|5|3) 的剩余数系统 上表示的数 (2|3|2) 转换为其对应的标准十进制形式。用RNS表示,x=(2|3|2)RNS(7|5|2).

对于我们的全同态加密而言,不难看出,其可以应用于用来进行大整数表示以及运算。

rns.h源码解析

首先是RNSBase类。

构造器如下:

RNSBase(const std::vector<Modulus> &rnsbase, MemoryPoolHandle pool);RNSBase(RNSBase &&source) = default;RNSBase(const RNSBase &copy, MemoryPoolHandle pool);RNSBase(const RNSBase &copy) : RNSBase(copy, copy.pool_){}

&operator=和&operator[]重构了运算符=和[],比较简单。

剩下的大多为布尔函数,结合rns.cpp分析即可。

然后是BaseConverter类,实现基于base基数的转换。

构造器如下:除了常规的线程池,传入了两个前面提到的RNSBase类的引用,在其中实现了rns.cpp的初始化操作。

BaseConverter(const RNSBase &ibase, const RNSBase &obase, MemoryPoolHandle pool): pool_(std::move(pool)), ibase_(ibase, pool_), obase_(obase, pool_){if (!pool_){throw std::invalid_argument("pool is uninitialized");}initialize();}

然后是一堆返回size和引用的函数,没有分析的必要。

最后是RNSTool类。

divide_and_round_q_last_ntt_inplace函数借助了前文提到的NTT算法,其中提到扩展的基数必须支持NTT算法,否则报错。

最实用的部分在下面,实现各种求余数的操作。其具体的形式都在注释中给出了。

// Base converter: q --> B_skPointer<BaseConverter> base_q_to_Bsk_conv_;// Base converter: q --> {m_tilde}Pointer<BaseConverter> base_q_to_m_tilde_conv_;// Base converter: B --> qPointer<BaseConverter> base_B_to_q_conv_;// Base converter: B --> {m_sk}Pointer<BaseConverter> base_B_to_m_sk_conv_;// Base converter: q --> {t, gamma}Pointer<BaseConverter> base_q_to_t_gamma_conv_;// prod(q)^(-1) mod BskPointer<MultiplyUIntModOperand> inv_prod_q_mod_Bsk_;// prod(q)^(-1) mod m_tildeMultiplyUIntModOperand neg_inv_prod_q_mod_m_tilde_;// prod(B)^(-1) mod m_skMultiplyUIntModOperand inv_prod_B_mod_m_sk_;// gamma^(-1) mod tMultiplyUIntModOperand inv_gamma_mod_t_;// prod(B) mod qPointer<std::uint64_t> prod_B_mod_q_;// m_tilde^(-1) mod BskPointer<MultiplyUIntModOperand> inv_m_tilde_mod_Bsk_;// prod(q) mod BskPointer<std::uint64_t> prod_q_mod_Bsk_;// -prod(q)^(-1) mod {t, gamma}Pointer<MultiplyUIntModOperand> neg_inv_q_mod_t_gamma_;// prod({t, gamma}) mod qPointer<MultiplyUIntModOperand> prod_t_gamma_mod_q_;

SEAL全同态加密开源库(八) rns源码解析(2)相关推荐

  1. SEAL全同态加密开源库(七) rns剩余数系统-源码解析

    SEAL全同态加密开源库(七) rns剩余数系统-源码解析 2021SC@SDUSC 2021-11-14 前言 这是SEAL开源库代码分析报告第六篇,本篇将分析util文件夹中的rns.h和rns. ...

  2. SEAL全同态加密开源库(十二) CKKS-源码浅析

    2021SC@SDUSC 2021-12-19 前言 前两篇我们讨论了SEAL对于BFV的实现.本篇开始我将开始讨论SEAL对于CKKS的实现. 照例我会先补充理论知识,然后分析源码native/ex ...

  3. SEAL全同态加密开源库(十一) BFV-源码浅析(2)

    2021SC@SDUSC 2021-12-12 前言 从本篇开始,接上一篇的BFV分析,这里我们继续分析BFV源码.争取本篇结束战斗. 与之前的工作相比,这些代码显得更具整体性,也能更好体现出SEAL ...

  4. 轻触开源(三)-Gson项目源码解析_贰

    2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处:https://my.oschina.net/u/874727/blog/750473 Q:102525062 ...

  5. JavaScript数字运算必备库——big.js源码解析

    概述 在我们常见的JavaScript数字运算中,小数和大数都是会让我们比较头疼的两个数据类型. 在大数运算中,由于number类型的数字长度限制,我们经常会遇到超出范围的情况.比如在我们传递Long ...

  6. 最全的Android开源音乐播放器源码汇总

    收集了很多音乐播放器类的Android项目源码,非常不错的开源项目,会让你事半功倍,希望大家补充...谢谢! Android基于经纬度切歌的冲绳音乐播放器源码 http://neast.cn/foru ...

  7. 轻触开源(二)-Gson项目源码解析_壹

    2019独角兽企业重金招聘Python工程师标准>>> 上篇文章<轻触开源-Java泛型Type类型的应用和实践(一)> https://my.oschina.net/u ...

  8. mysql连接池源码_WCDB-数据库连接池源码解析

    数据库类的简介 SQLiteOpenHelper: 管理SQLite的帮助类,提供获取SQLiteDatabase实例的方法, 它会在第一次使用数据库时调用获取实例方法时创建SQLiteDatabas ...

  9. 开源任务调度平台elastic-job-lite源码解析

    前段时间写过一遍文章<一文揭秘定时任务调度框架quartz>,有读者建议我再讲讲elastic-job这个任务调度框架,年末没有那么忙,就来学习一下elastic-job. 首先一点,el ...

最新文章

  1. arcgis的server不可用
  2. Yii AR Model CRUD数据库操作
  3. btc比特币 钱包简介
  4. github push报 Unable to access ‘https://github.com/xxxx/xxxx.git/‘: OpenSSL SSL_read: Connection was
  5. 使用append之后数组维度消失_JAVA魅力之神奇的数组带给你不一样的乐趣
  6. 【Linux】GCC程序开发工具(上)
  7. Service OS maintain ( Reference Object )
  8. 3分钟tips:什么是特征向量?什么是特征值?
  9. javaWeb——日记本系统
  10. 方舟服务器炸了怎么修复,《方舟:生存进化》诸事不顺!退款BUG修复服务器又炸...
  11. yolov7调用大华工业相机进行识别
  12. 2.1 Apache Hadoop、HDFS - Apache Hadoop概述
  13. 第十二章:如何制定里程碑
  14. 功能升级 | Choerodon猪齿鱼“新”知识管理介绍
  15. android fragment 抽屉,android – Actionbar和Navigation抽屉 – 使用Activity / Fragment滑动Actionbar...
  16. IoTDB Can not establish connection
  17. 逻辑学是计算机 创始人,逻辑学的创始人:亚里士多德
  18. 54 计算机与信息科学类,关于信息科学与技术学院自动化类及计算机类2019级大类分专业学生名单公示的通知...
  19. 如何用迅捷PDF转换器获取PDF文件中的图片
  20. 【NDN学习】NDN的定义,基础,解决什么问题

热门文章

  1. 【论文学习】《Tacotron: Towards End-to-End Speech Synthesis》
  2. ESP32 驱动ST7789 240*240 1.3寸 TFT 显示屏
  3. 怀念乔布斯的十种能力
  4. 分光光度计测量误差四大原因(附加仪器检测标准)SKJDN
  5. win10搜索不到蓝牙设备
  6. 小影的悲哀,重生~~
  7. PIM-DM与SM对比
  8. idea中Scala自动勾选Specify type
  9. 计算机教室如何防火,2020校园防火安全小知识_消防安全小知识顺口溜
  10. 平克四部曲之《语言本能》