HEAAN新版学习
本篇文章对最新版的HEAAN库进行研究,老版的介绍见 HEAAN库学习
主要参考:slide-HEAAN.pdf
HEAAN介绍#
HEAAN是一个支持在加密的复数数组之间进行操作的库,方案的安全性取决于
lwe-estimator,是一个Sage函数【Sage更多:参考】,用于测试求解LWE问题的运行时间
个人理解,求解LWE运行时间越长,越安全,所以推荐用此时的参数?后面单独花时间再研究这个,在这里我就理解成从这里这里选取更好的参数。
下面是难点之一编码,将一个复数向量编码成一整数多项式:
密文是一对多项式
下面是主要函数:
HEAAN使用#
预备知识#
首先需要确定缩放因子
Context context(logN, logQ);
用于编码和解密时计算复数,这个类包含encode
和decode
函数,这个类在老版本中出现。
ZZX mx = context.encode(mvec,slots,pBits);
返回编码结果pBits
是
密钥生成#
在HEAAN方案中,我们需要额外的公钥,即用于乘法运算的计算密钥,这是在
SecretKey sk(logN, h);
生成私钥(一个稀疏多项式)
Scheme scheme(sk, context);
生成下面两个公钥:
如果需要旋转功能的话,也需要生成一个公钥:
scheme.addConjKey(sk);
scheme.addLeftRotKey(sk,i);
scheme.addRightRotKey(sk.i);
为左旋转和右旋转生成对应的公钥
其中scheme.addLeftRotKeys
和scheme.addRightRotKeys
将会产生两个方向上旋转的公钥。
一直有一个疑惑,为什么要进行旋转?
因为明文都是向量(实数或复数),用旋转可以提升效率!
什么是旋转?
CKKS中的旋转大多就是进行对于矩阵的旋转,通俗一点讲就是,对于矩阵来说,旋转列可能就是将一列元素进行向左或者是向右进行平移。旋转行可能就是将矩阵的每两行进行对调,从而实现旋转的操作。旋转是不消耗任何的噪音预算的。
同态计算#
同态加法有多种版本,注意,我们也可以在明文和密文之间进行加法。
cipher3 = scheme.add(cipher1, cipher2);
scheme.addAndEqual(cipher1, cipher2);
cipher2 = scheme.addConst(cipher1, const);
这些算法相当快。对于常用参数,两个密文之间的相加只需要10毫秒到20毫秒。请注意,addAndEqual
将计算新结果直接赋值给输入的第一个密文,由于内存分配时间的原因,这会稍微快一点。
同态乘法有多种版本,注意,我们也可以在明文和密文之间进行乘法:
cipher2 = scheme.square(cipher1);
cipher2 = scheme.squareAndEqual(cipher1);
cipher3 = scheme.mult(cipher1, cipher2);
scheme.multAndEqual(cipher1, cipher2);
cipher2 = scheme.multByConst(cipher1, const);
那些算法除了multByConst
都会使用计算密钥
重缩放#
密文(缩放因子为pBits
是
cipher2 = scheme.reScaleBy(cipher1, pBits);
scheme.reScaleByAndEqual(cipher1, pBits);
同态旋转#
cipher2 = scheme.leftRotateBy(cipher1, i);
scheme.leftRotateByAndEqual(cipher1, i);
cipher2 = scheme.rightRotateBy(cipher1, i);
scheme.rightRotateByAndEqual(cipher1, i);
每一次旋转都需要使用对应的旋转公钥,如果没有,将自动 combine power of two shifting
【没看太懂,是自动生成么?】
例子#
// Key Generation
Context context(logN, logQ);
SecretKey sk(logN);//私钥
Scheme scheme(sk, context);//公钥、计算密钥
scheme.addLeftRotKey(sk, 1);//左旋转密钥
// Encrypt
Ciphertext cipher1 = scheme.encrypt(mvec1, slots, pBits, logQ);
Ciphertext cipher2 = scheme.encrypt(mvec2, slots, pBits, logQ);
// Homomorphic Operations
Ciphertext addCipher = scheme.add(cipher1, cipher2);
Ciphertext multCipher = scheme.mult(cipher1, cipher2);//乘法
scheme.reScaleByAndEqual(multCipher, pBits);//重缩放
Ciphertext rotCipher = scheme.leftRotate(cipher1, 1);//将密文1向左旋转一位
// Decrypt
complex<double>* dvecAdd = scheme.decrypt(sk, addCipher);
complex<double>* dvecMult = scheme.decrypt(sk, multCipher);
complex<double>* dvecRot = scheme.decrypt(sk, rotCipher);
作者:Hang Shao
出处:https://www.cnblogs.com/pam-sh/p/15884427.html
版权:本作品采用「知识共享」许可协议进行许可。
声明:欢迎交流! 原文链接 ,如有问题,可邮件(mir_soh@163.com)咨询.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地
· 程序员转型AI:行业分析