2021SC@SDUSC
本博客包含自己学习的密码学的前置知识,计划只写这一篇博客,后面会一直更新。为之后的PALISADE分析做准备。


目录

  • 1 全同态加密体系
    • 1.1 简介
    • 1.2 全同态加密体系定义
    • 1.3 全同态的四个阶段
    • 1.4 全同态中噪声
  • 2 格密码理论
    • 2.1 格与整数格
    • 2.2 整数格中的CVP问题
    • 2.3 LWE问题
    • 2.4 GSW
      • 4.4.1 第一阶段:矩阵的特征值与特征向量
      • 4.4.2 加入随机噪音
      • 4.4.3 二进制分解
      • 4.4.3 加入二进制分解(GSW系统)

一个密码体质可以用数学语言定义:

1 全同态加密体系

1.1 简介

简称FHE

要构建一个加密系统,往往都需要一个密钥(Key)。通过这个密钥,我们可以一头把明文的信息加密成密文,然后在另一头通过密钥再把密文变回原来的样子。如果没有这个Key的话,其他的人很难知道我们到底传递了什么信息。

上文的图例基本展示了所有常见加密体系的全貌。所有的加密体系,如果用比较正式的描述方法,无疑是做了三件事:

  1. 首先,通过一个生成算法KeyGen()来随机生成一对用于加密和解密的密钥(EncKey,DecKey)
  2. 加密方通过加密密钥EncKey和加密算法Encryption来加密原文 PlainText ,最后得到密文 Ciphertext
  3. 随后,在解密的时候,解密方可以通过解密密钥DecKey 和解密算法 Decryption 来解密密文,最后还原回来原来的原文。

加密体系分为两种:对称加密体系非对称加密体系。我们这里描述的这三个步骤,其实通用于任何加密体系。如果是对称的,那么加密和解密用的密钥就是一样的。如果是非对称的体系的话,那么加密用的就是公钥(Public Key),然后解密用的是不一样的私钥(Private Key)。

如果我们有一个加密函数 f , 把明文A变成密文A’, 把明文B变成密文B’,也就是说f(A) = A’ ,f(B) = B’ 。另外我们还有一个解密函数,

能够将 f 加密后的密文解密成加密前的明文。对于一般的加密函数,如果我们将A’和B’相加,得到C’。我们用

对C’进行解密得到的结果一般是毫无意义的乱码。但是,如果 f 是个可以进行加法同态加密的加密函数, 我们对C’使用

进行解密得到结果C, 这时候的C = A + B。而满足加法同态与乘法同态的加密函数被称为全同态加密。

1.2 全同态加密体系定义

系统性的定义一下全同态系统的正式定义。一个全同态加密系统,一共拥有四个算法:

  1. 密钥生成算法KenGen为了简单表示,我们这里假设这个加密系统是对称的(即加密密钥等于解密密钥)。
  2. 加密算法Enc(sk,m)->ct把原文m加密成密文ct
  3. 解密算法Dec(sk,ct)->m把密文 ct还原为原文m。解密算法不仅能对初始密文解密,还能够对计算后的密文解密
  4. 运算评估算法Eval(F,ct1,ct2...ctn)->ct_把n个密文组合起来,通过一个二进制逻辑电路 F,最后得到组合的密文ct_,通俗理解为将密文输入到函数f里进行计算。满足下面等式

与此同时,FHE系统还需要满足三大属性(properties)

  1. 正确性(Correctness):一个FHE系统必须要是正确的。具体来说,也就是加密之后的密文可以被成功解密,并且Eval运算输出的密文也可以成功解密回原文。
  2. 语义安全(Semantic Security):FHE系统输出的密文必须要难以分辨。具体来说,如果有一个网络窃听者看到了所有的密文,那么这个窃听者并不能分辨出哪个密文是对应哪个原文的。
  3. 简短性(Compactness):FHE的运算算法Eval输出的密文的长度一定要独立于功能F的所对应的电路的大小。这一属性代表就算运算功能复杂,输出的密文仍然在一个可以控制的长度范围内,确保了FHE系统的实用性。

简单来说,FHE要解决的问题是这样的。假设一个用户拥有一个私密的值x,但是他想要委托远程的服务器在不知晓x的情况下计算一个功能f(x)的值

基于我们定义的四个算法,首先用户需要使用FHE加密算法来加密他的私密输入,得到Enc(S),然后发送给云端。随后,云端将会使用运算算法Eval来计算得到Enc(f(x)),并返回给用户。最后用户使用FHE的密钥来解开密文,得到f(x)

1.3 全同态的四个阶段

构成FHE系统的四个不同阶段

  1. 部分同态(Partially Homomorphic Encryption):在这一阶段下,我们可以运算的功能F只能够要么由加法/线性组合,要么由乘法构成。常见的例子有RSA(乘法同态)以及ElGamal(加法同态)
  2. 近似同态(Somewhat Homomorphic Encryption):这一阶段的算法拥有不完整的同态属性,比如拥有Pairing配对的ElGamal循环群,具有完整的加法同态属性,但是只有非常薄弱的乘法同态属性。
  3. 有限级数全同态(Leveled Fully Homomorphic Encryption):这一阶段的算法可以同态运算任意形式的功能F,但是功能F所转换成的电路的复杂度不能超过上限L,不然就会噪音太大丢失信息。
  4. 全同态(Fully Homomorphic Encryption):最后的阶段就是我们想要得到的FHE了。在这一阶段我们可以计算任意复杂度的功能F,并且噪音可以被完美的控制在可控范围内。

1.4 全同态中噪声

在全同态加密的方案里,密文都是含有噪音的,密文的计算会导致噪音的增长,如果把函数 f 表示成电路,那么Evaluate算法实际上只能够对有限深度L的电路进行计算,超过这个深度L的电路就不行了。而全同态加密追求的就是Evaluate算法能够对任意电路进行计算。

然而,在若要在全同态加密的密文状态下评估该布尔电路(这里给你一个神奇的透视镜,让你能够看到加密密文里面加密的明文,越清晰说明噪声越小,越模糊说明噪声越大),不但评估时间变得十分漫长,噪声也随着经过的门电路的数量增加而增长,如果经过过多的门电路,则很可能导致最终的解密错误(解密后无法分辨0和1)。

2 格密码理论

2.1 格与整数格

设有一组线性无关的向量v1,...vn属于Rn,由这组向量生成的格L是指向量v1,...vn的线性组合构成的向量集合,且其系数均在Zm中,m指vn的维度。

举个例子,假如线性空间V拥有两个基向量b0,b1,那么这个空间中的任何一个向量v都可以被表示为:

这里c0,c1可以是任何数字。我们也可以通过改变c0,c1这两个数字的值来改变最后生成的向量v。用这种方法可以生成的所有向量v最后就会组成一个线性空间V,我们称这个空间为b0,b1两个基向量的线性生成空间(Span)

我们日常生活中最常见的线性生成空间,就是**XY坐标系(笛卡尔坐标系)**了。笛卡尔坐标系的基向量就是两根坐标轴对应的单位向量

任何在XY坐标系中的向量

都可以用i,j的线性组合来代表。

如果所有的系数c0,c1都只能用整数的话,那么我们不断的变动c0,c1这两个系数的值,形成的向量v不能组成一个连续的线性空间了。反而,这些向量会构成一个密布的、网格状的离散集合。就想上面的图例所示,其中每一个点都代表一个可以被表达成基向量的线性组合的一个独特向量。

因为图片上看上去是网格状的,我们把这样的一个离散的基向量生成空间集合,称之为整数格(Integer Lattice)。

2.2 整数格中的CVP问题

回到刚刚说的线性生成空间的问题上。在b0,b1组成的连续的二维线性生成空间中,因为系数c0,c1可以是任何数字,所以我们可以表达这个二维坐标系统里的任意向量。但假如我们把这个问题约束到一个整数格中,我们就没有办法这么做了。

之前举的笛卡尔坐标系的例子里,笛卡尔空间的基向量是

现在假设我们在i,j构成的整数格中,想要表达一个向量

我们会发现没有任何办法可以表达它,因为在整数格中系数c0,c1必须要是整数。

正因为我们无法完美的用整数格中的线性组合来表达我们想要得到的向量,这个问题衍生出了一个新的问题:是否可以找到一个最接近于想要表达的向量v的值v1,并且v1恰好在这个整数格可以表达的范围当中?

重新转述一下这个问题的话,也就是说:能否找到一组整数系数c0,c1,使得

组成的向量v`在这个整数格中距离目标向量v的距离最近?
我们把这一类在离散线性集合中逼近目标向量的问题,统称为最近向量问题(Closest Vector Problem,CVP)。

2.3 LWE问题

我们求解线性方程组Ax=b时通常对增广矩阵做初等行变换求解,现在,我们把这个问题变化一下,给它增加一些难度:增加噪音。假如这个问题变成,如果已知一个矩阵A,并且我们还知道一个向量

其中e是我们在一个固定数值范围内随机采集的一个随机噪音向量

加上这么一个随机噪音之后,我们线性代数的方法就已经不管用了,因为如果我们使用高斯消除法对每一行进行消除的时候,同时还会带着噪音进去。

带上了噪音之后,这个问题就变成了已知一个矩阵A,和它与一个向量x乘得到的乘积再加上一定的误差(error)e如何有效的还原(learn)未知的向量。我们把这一类的问题统称为误差还原(Learning With Error, LWE)问题。

这个LWE问题与我们之前提到的CVP最近向量问题有着惊人的相似。其实两个问题都一样,我们都是需要找到一组“系数”(我们可以用向量x表示),使得一组基向量(我们用矩阵A来表示)的线性组合无限逼近我们想要的目标向量b。这里我们使用误差噪音e的大小来定义到底我们需要距离目标向量b多近。

正式定义:

  1. 素数有限域2. LWE

2.4 GSW

GSW系统是Gentry,Sahai,Waters三位大牛在2013年提出的第三代同态加密系统。整套加密系统围绕了一个核心概念:矩阵的近似特征向量

整个系统也分为三个阶段,每一个阶段都提出了一个LFHE系统的尝试,并且评估了这一尝试是否可行。

从FHE的定义来看,只要我们能够构建一个加密体系,并且可以保证Eval算法可以任意计算加法乘法,那么这个体系就是全同态的。

参考博客:初探全同态加密之三:构建GSW全同态加密系统 - 知乎 (zhihu.com)

4.4.1 第一阶段:矩阵的特征值与特征向量

第一阶段主要就是利用了Ax=rx的线性关系,其中r是特征值。

  • 密钥生成KeyGen:我们只需要随机选取一个向量S,然后作为我们加密的密钥。

  • “加密”算法EncEnc(s,u)->C

    如果我们要加密任意一个数字u,我们只需要找到一个矩阵C,使得C满足:
    C ∗ s ⃗ = u ∗ s ⃗ C*\vec{s} = u*\vec{s} C∗s =u∗s
    等式中s是矩阵的特征向量,加密的数字u是这个矩阵的特征值,C是密文

  • 解密算法Dec:如果需要解密一个密文矩阵C,只需C*s就会得到u*s了

  • 运算算法Eval:一个体系只要可以运算加法以及乘法,那么这个体系就是全同态的。接下来,我们看一看这个体系能否完成对于这两个功能的运算。

    • Eval(+,C1,C2)
      ( C 1 + C 2 ) ∗ s ⃗ = C 1 ∗ s ⃗ + C 2 ∗ s ⃗ = u 1 ∗ s ⃗ + u 2 ∗ s ⃗ = ( u 1 + u 2 ) ∗ s ⃗ (C_1+C_2)*\vec{s}=C_1*\vec{s}+C_2*\vec{s}=u_1*\vec{s}+u_2*\vec{s}=(u_1+u_2)*\vec{s} (C1​+C2​)∗s =C1​∗s +C2​∗s =u1​∗s +u2​∗s =(u1​+u2​)∗s

    • Eval(x,C1,C2)
      ( C 1 ⋅ C 2 ) ⋅ s ⃗ = C 1 ⋅ u 2 ⋅ s ⃗ = u 2 ⋅ C 1 ⋅ s ⃗ = ( u 1 ⋅ u 2 ) ⋅ s ⃗ (C_1\cdot C_2)\cdot\vec{s}=C1\cdot u_2\cdot\vec{s}=u_2\cdot C1\cdot\vec{s}=(u_1\cdot u_2)\cdot \vec{s} (C1​⋅C2​)⋅s =C1⋅u2​⋅s =u2​⋅C1⋅s =(u1​⋅u2​)⋅s

    然而这个加密体系可以轻松的被破解,不需要密钥s,我们可以根据C找到特征向量与特征值

4.4.2 加入随机噪音

我们可以尝试把原本的特征向量等式转换为:
C ∗ s ⃗ = u ∗ s ⃗ + e ⃗ ( e ⃗ 为 随 机 噪 声 ) C*\vec{s} = u*\vec{s}+\vec{e} (\vec{e}为随机噪声) C∗s =u∗s +e (e 为随机噪声)
我们系统性的定义一下这一体系的具体构造。

  • 密钥生成KeyGen

  • 加密算法Enc

  • 解密算法Dec

  • 运算算法Eval

虽然在原有的特征向量系统中加入噪音可以有效的使整个FHE系统变得安全,但是与此同时也使得整个FHE系统丢失了原本的全同态特性——因为运算乘法的时候会引入过大的噪音,导致运算结果无法被成功解密。

我们观察到最后一项C1*e2取值没有上限的原因是因为矩阵C1是在素数有限域Zq中任意取值的。这么说矩阵C的无限范数(infinity norm)就是
∣ ∣ C ∣ ∣ ∞ < = q / 2 ||C||_\infty<=q/2 ∣∣C∣∣∞​<=q/2
有没有什么办法,可以让我们使得C的无限范数下降到一个可控的小范围内,但是仍然保证C矩阵中的数字是随机取的呢?

4.4.3 二进制分解

4.4.3 加入二进制分解(GSW系统)

上一次尝试中,最后不完美的部分在于计算乘法运算的时候,我们会得到一个没有约束的噪音项

过对于矩阵C的观察之后,我们发现只要确保矩阵C里面的值可以被约束在一个小的区间,那么整体来说这一个噪音项就不会带来太大的噪音上限。

刚才我们也学习了二进制分解可以很有效的把一个高范数的矩阵C分解为一个低范数的二进制bit矩阵C`,并且二进制重组的过程可以被完美的描述为一个线性变换(矩阵)

  • 密钥生成KeyGen

  • 加密算法Enc

  • 解密算法Dec

  • 运算算法Eval

2021SC@SDUSC-PALISADE(二)全同态与格密码相关推荐

  1. 2021SC@SDUSC PALISADE开源库(二)CKKS讲解系列(一)普通编码和解码

    2021SC@SDUSC 目录 介绍 CKKS编码 普通编码 例子 相关代码执行(重要) 编码器和解码器的实现过程: 具体分析[假设输入的向量的(1,2,3,4)] 测试过程 同态操作(编码和解码) ...

  2. @2021SC@SDUSC 源码分析: core/lib/encoding

    2021SC@SDUSC 看一看估计标准偏差过程是怎么样的 // Estimate standard deviation using the imaginary part of decoded vec ...

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

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

  4. @2021SC@SDUSC 源码分析: 格加密模块的初窥

    2021SC@SDUSC 这次对格密码层进行一个分析 首先可以看到格密码层也是分了相当多的文件 从名字上直观认识,大多都是数学后端上功能以及一些辅助的运算模块 先来看看lattice中的poly模块 ...

  5. 为什么格上能够构造全同态加密-3

    ** 为什么格上能够构造全同态加密-3 ** 本文由陈智罡博士撰写. 格上加密方案是一种噪音加密方案,这种方案与直觉非常吻合. 例如,你给一个非专业人士解释格加密的本质,就是往消息里添加一些噪音作为扰 ...

  6. 为什么格上能够构造全同态加密-2

    ** 为什么格上能够构造全同态加密-2 ** 本文由陈智罡博士撰写. 前面(https://editor.csdn.net/md/?articleId=104844689)我们说了,通过"抽 ...

  7. zbar下条形码和二维码的识别与解码Ⅲ|2021SC@SDUSC

    2021SC@SDUSC 4.对非标准的QR二维码图片,进行定位,然后用Zbar解码显示. 这里主要参考opencv二维码识别解码_nickchao的IT生涯-CSDN博客_opencv二维码识别的博 ...

  8. zbar下条形码和二维码的识别与解码Ⅰ|2021SC@SDUSC

    2021SC@SDUSC 对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. ...

  9. <2021SC@SDUSC>【Overload游戏引擎】OvUI源码模块分析(二)——ImGui

    <2021SC@SDUSC>[Overload游戏引擎]OvUI源码模块分析(二) 前言 案例分析 程序框架 1.基本案例 2.实现定制绑定/定制引擎 渲染函数 总结 前言 本篇我们来分析 ...

最新文章

  1. GitHub高赞,针对小白的算法训练仓库
  2. eureka的自我保护
  3. [网络安全自学篇] 十三.Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
  4. eclipse中js文件报missing semicolon
  5. windows下安装、卸载mysql服务
  6. iPhone 13与12对比图曝光:更厚、更大了
  7. Oracle解决Ora-01653无法扩展表空间问题
  8. Django 分页 以及自定义分页
  9. matlab中图例的字怎么改,matlab中legend函数在添加图例时的使用方法
  10. 【TSP】基于matlab混合粒子群算法求解旅行商问题【含Matlab源码 397期】
  11. 笔记31 笨办法学python练习39可爱的词典
  12. 五款实用思维导图模板分享
  13. vue+file-saver+xlsx 封装导出Excel表格方法
  14. 射频开关:SPDT、级联、树形和矩阵开关
  15. VSCode RemoteSSH 过程试图写入的管道不存在问题 解决
  16. Java IO流(下)
  17. EU.org免费域名申请教程
  18. 51nod1238(杜教筛)
  19. Word/Excel文档操作API哪家强?一张表带你了解Aspose和Spire系列全功能对比
  20. python作为最热门的编程语言你知道多少?

热门文章

  1. vba连接mysql代码_vba 连接数据库代码
  2. 如何下载网站以供离线访问
  3. 三星S9 S9+ 网络锁介绍
  4. 图片怎么转换成JPG格式
  5. Redisson 使用手册
  6. PHP 操作 ElasticSearch 7.X
  7. 解答一些GISer开发者的疑惑
  8. C++(三)之namespace的作用
  9. 思维导图APP开发独立源码部署
  10. 图的遍历——深度优先遍历与广度优先遍历