本篇文章对最新版的HEAAN库进行研究,老版的介绍见 HEAAN库学习

主要参考:slide-HEAAN.pdf

HEAAN介绍

HEAAN是一个支持在加密的复数数组之间进行操作的库,方案的安全性取决于\(log_Q\)、\(log^N\)和高斯分布的标准差\(\sigma =3.2\)。如果使用 Martin’s LWE parameter estimator,你可以检测这个方案的安全性。

lwe-estimator,是一个Sage函数【Sage更多:参考】,用于测试求解LWE问题的运行时间

个人理解,求解LWE运行时间越长,越安全,所以推荐用此时的参数?后面单独花时间再研究这个,在这里我就理解成从这里这里选取更好的参数。

下面是难点之一编码,将一个复数向量编码成一整数多项式:

\[encode: (m_1,...,m_l)\in \mathbb{C}^l\Rightarrow \left \lfloor \Delta m(x)\right \rceil\in \mathbb{Z}[X]/(X^N+1)
\]

密文是一对多项式\((a(x),b(x))\in\mathbb{Z}_Q\),例如:对于私钥是\(s(x)\),\(\mathbb{Z}=\mathbb{Z}[X]/(X^N+1)\),\(\mathbb{Z}_Q=\mathbb{R}/Q\mathbb{R}\)

\[b(x)=-a(x)s(x)+\left \lfloor\Delta m(x)\right \rceil+e(x),其中a(x)\in \mathbb{R}[X]/(X^N+1)
\]

下面是主要函数

\(encode:\)输入\(\overrightarrow{m}\in \mathbb{C^l}\),输出一个多项式\(m(x)\)

\(decode:\)输入\(m(x)\),输出一个复数向量\(\overrightarrow{m}\)

\(encrypt:\)输入\(\overrightarrow{m}\),编码,加密,返回密文\((a(x),b(x))\)

\(decrypt:\)输入\((a(x),b(x))\),解密,解码,返回\(\overrightarrow{m}\)

\(add:\)输入两个密文,返回密文\(\overrightarrow{m_1}+\overrightarrow{m_2}\)

\(square:\)输入一个密文,返回密文\(\overrightarrow{m}+\overrightarrow{m}\)

\(mult:\)输入两个密文,返回密文\(\overrightarrow{m_1}*\overrightarrow{m_2}\)

\(rotate:\)输入一个密文,返回旋转后的密文

HEAAN使用

预备知识

首先需要确定缩放因子\(\Delta\)和目标电路深度(乘法次数)\(L\),这将会确定最大模数\(Q=\Delta^L\)。使用安全参数\(\lambda\)和LWE参数评估器(这里理解为lwe-estimator),我们将会选择密文多项式的维数(次数)\(N\)。

Context context(logN, logQ);

用于编码和解密时计算复数,这个类包含encodedecode函数,这个类在老版本中出现。

ZZX mx = context.encode(mvec,slots,pBits);

返回编码结果\(m(x)\),即一个整数多项式;这里的pBits是\(log_2^{\Delta}\)。

密钥生成

在HEAAN方案中,我们需要额外的公钥,即用于乘法运算的计算密钥,这是在\(\mathbb{R}_{PQ}^2\)上的一对多项式,这里的\(P\)是一个特殊的模数,和\(Q\)有相同的比特位数,其安全性基于\(RLWE(2log^Q,log^N,\sigma)\)问题

SecretKey sk(logN, h);

生成私钥(一个稀疏多项式)\(s(x)\),该多项式的系数取自\(HWT(h)=\left\{-1,0,1 \right\}\)分布,即多项式系数中有\(h\)个正整数。

Scheme scheme(sk, context);

生成下面两个公钥:

\[pk_{enc}=(a(x),-a(x)s(x)+e(x))\in \mathbb{Z}_{PQ}^2
\]
\[pk_{mult}=(a(x),-a(x)s(x)+Ps^2(x)+e(x))\in \mathbb{Z}_{PQ}^2
\]

如果需要旋转功能的话,也需要生成一个公钥:

scheme.addConjKey(sk);

scheme.addLeftRotKey(sk,i);

scheme.addRightRotKey(sk.i);

为左旋转和右旋转生成对应的公钥

\[pk_{leftRot,i} =(a(x),-a(x)s(x)+P*s^2(x^k)e(x))\in \mathbb{Z}_{PQ}^2
\]

其中\(k=5^I mod N\),共轭情况下\(k=2N-1\),用作右旋转下\(k=5^{-i}\),该公钥用于索引为i的明文数组的左旋转,如果运行scheme.addLeftRotKeysscheme.addRightRotKeys将会产生两个方向上旋转的公钥。

一直有一个疑惑,为什么要进行旋转?

因为明文都是向量(实数或复数),用旋转可以提升效率!

什么是旋转?

CKKS中的旋转大多就是进行对于矩阵的旋转,通俗一点讲就是,对于矩阵来说,旋转列可能就是将一列元素进行向左或者是向右进行平移。旋转行可能就是将矩阵的每两行进行对调,从而实现旋转的操作。旋转是不消耗任何的噪音预算的。

同态计算

同态加法有多种版本,注意,我们也可以在明文和密文之间进行加法。

  1. cipher3 = scheme.add(cipher1, cipher2);
  2. scheme.addAndEqual(cipher1, cipher2);
  3. cipher2 = scheme.addConst(cipher1, const);

这些算法相当快。对于常用参数,两个密文之间的相加只需要10毫秒到20毫秒。请注意,addAndEqual 将计算新结果直接赋值给输入的第一个密文,由于内存分配时间的原因,这会稍微快一点。

同态乘法有多种版本,注意,我们也可以在明文和密文之间进行乘法:

  1. cipher2 = scheme.square(cipher1);
  2. cipher2 = scheme.squareAndEqual(cipher1);
  3. cipher3 = scheme.mult(cipher1, cipher2);
  4. scheme.multAndEqual(cipher1, cipher2);
  5. cipher2 = scheme.multByConst(cipher1, const);

那些算法除了multByConst都会使用计算密钥\(pk_{mult}\),这大约需要100毫秒到1000毫秒,这取决于缩放因子\(\Delta\)和目标电路深度(乘法次数)\(L\)

重缩放

密文(缩放因子为\(\Delta\))相乘后缩放因子变为\(\Delta^2\),所以我们需要使用重缩放,其中pBits是\(log_2^{\Delta}\)。

  1. cipher2 = scheme.reScaleBy(cipher1, pBits);
  2. scheme.reScaleByAndEqual(cipher1, pBits);

缩放因子变为\(\Delta\),密文模数变为\(Q/\Delta\)

同态旋转

  1. cipher2 = scheme.leftRotateBy(cipher1, i);
  2. scheme.leftRotateByAndEqual(cipher1, i);
  3. cipher2 = scheme.rightRotateBy(cipher1, i);
  4. scheme.rightRotateByAndEqual(cipher1, i);

每一次旋转都需要使用对应的旋转公钥,如果没有,将自动 combine power of two shifting【没看太懂,是自动生成么?】

例子

  1. // Key Generation
  2. Context context(logN, logQ);
  3. SecretKey sk(logN);//私钥
  4. Scheme scheme(sk, context);//公钥、计算密钥
  5. scheme.addLeftRotKey(sk, 1);//左旋转密钥
  6. // Encrypt
  7. Ciphertext cipher1 = scheme.encrypt(mvec1, slots, pBits, logQ);
  8. Ciphertext cipher2 = scheme.encrypt(mvec2, slots, pBits, logQ);
  9. // Homomorphic Operations
  10. Ciphertext addCipher = scheme.add(cipher1, cipher2);
  11. Ciphertext multCipher = scheme.mult(cipher1, cipher2);//乘法
  12. scheme.reScaleByAndEqual(multCipher, pBits);//重缩放
  13. Ciphertext rotCipher = scheme.leftRotate(cipher1, 1);//将密文1向左旋转一位
  14. // Decrypt
  15. complex<double>* dvecAdd = scheme.decrypt(sk, addCipher);
  16. complex<double>* dvecMult = scheme.decrypt(sk, multCipher);
  17. complex<double>* dvecRot = scheme.decrypt(sk, rotCipher);

HEAAN新版学习的更多相关文章

  1. HEAAN库学习

    本文主要学习HEAAN同态库,选择最老的一版:地址,最新版在:位置,HEAAN是CKKS17论文的主要代码复现. 版本 1.地址这是最老的一版,对应的论文CKKS17 2.在1的基础上,实现了boot ...

  2. ROS机器人程序设计(原书第2版)补充资料 (零) 源代码、资料和印刷错误修订等 2017年01月01日更新

    ROS机器人程序设计(原书第2版)补充资料 (零) 源代码等 ROS官网 版)部分内容修订 页:第1行,删去$ 页:第6行,float64 y 前面加一个空格 页:中间创建主题:下面程序不用换行,(& ...

  3. 深度学习框架搭建之最新版Python及最新版numpy安装

    这两天为了搭载深度学习的Python架构花了不少功夫,但是Theano对Python以及nunpy的版本都有限制,所以只能选用版本较新的python和nunpy以确保不过时.但是最新版Python和最 ...

  4. 最新版WinRAR5.61去广告代码教程分享(仅供学习交流)

    最新版WinRAR5.61去广告代码教程分享(仅供学习交流) 第一步:到WinRAR官网www.rarlab.com下载自己需要的版本,选择Chinese Simplified 64bit 安装即可. ...

  5. 写给大忙人的ELK最新版6.2.4学习笔记-Logstash和Filebeat解析(java异常堆栈下多行日志配置支持)

    接前一篇CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南,继续对ELK. logstash官方最新文档https://www.elastic.co/g ...

  6. java学习路线图(2018年最新版)

    最近有些网友问我如何自学 Java 后端,还有些是想从别的方向想转过来,但都不太了解 Java 后端究竟需要学什么,究竟要从哪里学起,哪些是主流的 Java 后端技术等等,导致想学,但又很迷茫,不知从 ...

  7. C语言学习书籍推荐《C程序设计语言(第2版•新版)》下载

    克尼汉 (作者), 等 (作者, 译者), 徐宝文 (译者) 下载地址:点我 <C程序设计语言(第2版•新版)>是由C语言的设计者Brian W.Kernighan和Dennis M.Ri ...

  8. 学习Java必看的Java书籍(高清中文最新版附下载链接)

    今年下半年,我正式系统地学习Java(之前学习C++).最近把学习Java所用到的书籍整理了一下,分享出来,希望对正在学习或准备学习Java的人有一定的帮助. 关于Java的学习路线,和IDE工具In ...

  9. JavaWeb学习路线图(2020年最新版)

    Java基础 做java开发,java基础是最需要下功夫的一项.在校招时最注重的就是基础,拿不出像样的项目没关系,但是基础万万不可不牢固. 想要基础扎实,看书沉淀是必须的,有一些编程基础的同学推荐阅读 ...

随机推荐

  1. 『无为则无心』Python函数 — 32、递归

    目录 1.什么叫递归函数 2.递归的应用场景 3.递归的特点 4.应用:3以内数字累加和 5.应用:阶乘 6.总结 1.什么叫递归函数 Python中,在函数内部,可以调用其他函数.如果一个函数在内部 ...

  2. 解决ubuntu 18.04(桌面版)搜狗输入法不能正常使用的问题

    ubuntu下搜狗输入法的配置文件在~/.config目录下,一般有三个目录SogouPY.SogouPY.users.sogou-qimpanel 执行命令 $ cd ~/.config $ rm ...

  3. Vue系列教程(三)之vue-cli脚手架的使用

    一.Vue-cli的环境准备 目的:(1)快速管理依赖 (2)确定项目结构 1.安装node.js Node.js是一个可以让前端运行在服务器上的一个工. 下载:https://nodejs.org/ ...

  4. java邮件打包在linux备份数据库练习

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6812982512256549387/ 承接上一篇文档<Java实现163邮箱发送邮件到QQ邮箱> 主方 ...

  5. CentOS6.5-Hadoop2.7.3安装hive-2.1.1

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627723801960382979/ 系统版本,Hadoop已安装完成 Mysql安装完成 准备的解压包 安装zi ...

  6. 安装Apache-storm-0.9.1-incubating图解教程

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6596214331988247054/ 安装步骤 (1) 安装Zookeeper集群,可以参考前一篇文章,本文已安装 ...

  7. HITsz 数据库笔记

    这是 HITsz 数据库笔记,欢迎到我的 GitHub 上查看,有笔记说明和源码,作业和实验报告,希望对你有帮助 博客园显示图片异常 数据库基本概念 数据抽象 通过抽象来对用户屏蔽复杂性,以简化用户与 ...

  8. PaddleOCRSharp,2022年,你来的晚了些,一款.NET离线使用的高精度OCR

    一款免费且离线的.NET使用的OCR,爱你又恨你!恨你来的太晚了. PaddleOCRSharp 本项目是一个基于百度飞桨的PaddleOCR的C++代码修改并封装的.NET的类库.包含文本识别.文本 ...

  9. HW防守 | Linux应急响应基础

    最近也是拿到了启明星辰的暑期实习offer,虽然投的是安服,但主要工作是护网,昨天在公众号Timeline Sec上看到有一篇关于护网的文章,所以在这里照着人家写的在总结一下,为将来的工作打点基础. ...

  10. promise到底怎么理解

    Promise的含义promise是异步编程的一种解决方法.所谓promise,简单说是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,从语法上说,promise是一个对象,从 ...