SEAL全同态加密开源库(八) rns源码解析(2)
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 ©, MemoryPoolHandle pool);RNSBase(const RNSBase ©) : 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)相关推荐
- SEAL全同态加密开源库(七) rns剩余数系统-源码解析
SEAL全同态加密开源库(七) rns剩余数系统-源码解析 2021SC@SDUSC 2021-11-14 前言 这是SEAL开源库代码分析报告第六篇,本篇将分析util文件夹中的rns.h和rns. ...
- SEAL全同态加密开源库(十二) CKKS-源码浅析
2021SC@SDUSC 2021-12-19 前言 前两篇我们讨论了SEAL对于BFV的实现.本篇开始我将开始讨论SEAL对于CKKS的实现. 照例我会先补充理论知识,然后分析源码native/ex ...
- SEAL全同态加密开源库(十一) BFV-源码浅析(2)
2021SC@SDUSC 2021-12-12 前言 从本篇开始,接上一篇的BFV分析,这里我们继续分析BFV源码.争取本篇结束战斗. 与之前的工作相比,这些代码显得更具整体性,也能更好体现出SEAL ...
- 轻触开源(三)-Gson项目源码解析_贰
2019独角兽企业重金招聘Python工程师标准>>> 转载请注明出处:https://my.oschina.net/u/874727/blog/750473 Q:102525062 ...
- JavaScript数字运算必备库——big.js源码解析
概述 在我们常见的JavaScript数字运算中,小数和大数都是会让我们比较头疼的两个数据类型. 在大数运算中,由于number类型的数字长度限制,我们经常会遇到超出范围的情况.比如在我们传递Long ...
- 最全的Android开源音乐播放器源码汇总
收集了很多音乐播放器类的Android项目源码,非常不错的开源项目,会让你事半功倍,希望大家补充...谢谢! Android基于经纬度切歌的冲绳音乐播放器源码 http://neast.cn/foru ...
- 轻触开源(二)-Gson项目源码解析_壹
2019独角兽企业重金招聘Python工程师标准>>> 上篇文章<轻触开源-Java泛型Type类型的应用和实践(一)> https://my.oschina.net/u ...
- mysql连接池源码_WCDB-数据库连接池源码解析
数据库类的简介 SQLiteOpenHelper: 管理SQLite的帮助类,提供获取SQLiteDatabase实例的方法, 它会在第一次使用数据库时调用获取实例方法时创建SQLiteDatabas ...
- 开源任务调度平台elastic-job-lite源码解析
前段时间写过一遍文章<一文揭秘定时任务调度框架quartz>,有读者建议我再讲讲elastic-job这个任务调度框架,年末没有那么忙,就来学习一下elastic-job. 首先一点,el ...
最新文章
- arcgis的server不可用
- Yii AR Model CRUD数据库操作
- btc比特币 钱包简介
- github push报 Unable to access ‘https://github.com/xxxx/xxxx.git/‘: OpenSSL SSL_read: Connection was
- 使用append之后数组维度消失_JAVA魅力之神奇的数组带给你不一样的乐趣
- 【Linux】GCC程序开发工具(上)
- Service OS maintain ( Reference Object )
- 3分钟tips:什么是特征向量?什么是特征值?
- javaWeb——日记本系统
- 方舟服务器炸了怎么修复,《方舟:生存进化》诸事不顺!退款BUG修复服务器又炸...
- yolov7调用大华工业相机进行识别
- 2.1 Apache Hadoop、HDFS - Apache Hadoop概述
- 第十二章:如何制定里程碑
- 功能升级 | Choerodon猪齿鱼“新”知识管理介绍
- android fragment 抽屉,android – Actionbar和Navigation抽屉 – 使用Activity / Fragment滑动Actionbar...
- IoTDB Can not establish connection
- 逻辑学是计算机 创始人,逻辑学的创始人:亚里士多德
- 54 计算机与信息科学类,关于信息科学与技术学院自动化类及计算机类2019级大类分专业学生名单公示的通知...
- 如何用迅捷PDF转换器获取PDF文件中的图片
- 【NDN学习】NDN的定义,基础,解决什么问题