paillier加密算法原理详解
paillier加密算法是一种公钥加密算法,基于复合剩余类的困难问题。满足加法同态,即密文相乘等于明文相加:D(E(m1)·E(m2))=m1+m2。这里详细介绍其加密解密是如何推导的,需要具备数论、代数系统、模运算的相关知识,同时理解起来可能需要多阅读几遍并加以思考。
先将密钥生成和加解密过程罗列便于直观看
截图来源于:https://blog.csdn.net/sinianluoye/article/details/82855059
加密过程
在进行加解密之前,必须先产生可以用来加密的公钥n和g。n是两个大小相近的两个大素数的乘积:n=p·q。g是$ℤ_{n^{2}}$中的半随机数,同时g的阶必须在$ℤ^{*}_{n^{2}}$中并且能被n整除。由于g必须符合一些特殊性质(我们将在解密部分提出)所以$ℤ^{*}_{n^{2}}$中会有很少一部分元素不能用作g,意味着g是一个半随机数。为了简单计算,我们先选取两个小素数p=7,q=11计算得到n=p·q=77。从$ℤ^{*}_{n^{2}}$中选择g(g的阶必须是$ℤ^{*}_{n^{2}}$中元素并且是n的倍数。除此之外,g需要满足的另一个性质将会在解密时详细描述),在这里我们先选择5652作为g。因为g模n2的阶是2310且是77的倍数,并且在$ℤ^{*}_{n^{2}}$中。那么g所需要的包括未清楚定义的所有性质将会被满足。至此,我们找到了用来实际加解密运算过程的公钥(n,g)。随着公钥发布,任何人都能使用公钥加密数据并将密文传给私钥持有者。整个过程可用图一表示。
计算实例 |
公式 |
明文m=42 随机数r=23 c ≡ (5652)42·(23)77mod 5929 ≡ (4019)(606) ≡ 4624 mod 5929 |
创建明文消息m,m∈ℤn 随机选择非零整数 r∈$ℤ^{*}_{n}$ 计算密文c ≡ gm·rn mod n2 |
图1:n = 77, g = 5652时paillier系统加密 |
c是加密信息,私钥持有者解密时无需了解r的值。
解密过程
在已知p,q和g的情况下,任何人都可以将收到的加密消息c解密。我们注意到在已知p,q的情况下,卡迈克尔公式λ(n) = lcm[(p – 1)(q – 1)]很容易计算。我们也注意到,如果g ∈ $ℤ_{n^{2}}$,就像我们之前选作公钥的g,卡迈克尔定理保证gλ(n) ≡ 1 mod n成立。卡迈克尔定理表明如果两个整数a和n互质,那么关系式 aλ(n)≡ 1 mod n。因为g是模n2的单元,显然与n2互质,意味着g与n也是互质的。在这个基础上,卡迈克尔定理成立。解密时,忽略密文c的值,对于所有使用公钥对(n, g)进行的解密,计算gλ(n)mod n2都是必要的。gλ(n) mod n2计算得到的值是$ℤ_{n^{2}}$中的一个元素,由卡迈克尔定理可知,该值 ≡ 1 mod n。如果我们从结果值中减1得到的值可以被n整除。计算过程如图2。
计算实例 |
公式 |
λ(77) = lcm(6, 10) = 30 L(565230mod 5929) = L(3928) L(3928) = (3928 – 1)/77 = 3927/77 = 51 |
定义 L(u) = (u – 1)/n 计算L(gλ(n)mod n2)= k |
图2:已知n2=5926,g=5652计算L(gλ(n) mod n2) |
gλ(n) mod n2的结果可以看作一个大于等于0,严格小于n2的数,因此 gλ(n) mod n2 -1 除以n之后的结果k大于等于0,严格小于n,也就是说k∈Zn。因为n=p·q,只要k mod n的结果不是p或q的倍数,k会有逆,所以k∈$ℤ^{*}_{n}$。这个性质是之前在加密阶段提到的g需要符和未定义的性质。如果 gλ(n) mod n2的结果模n的值k是p或q的倍数,这个g必须被丢弃。在发布g之前先检查g是否符合要求,如果不符合就舍弃重新选择。现在我们假设随机选择的g符合条件即g∈$ℤ^{*}_{n^{2}}$,g的阶∈$ℤ^{*}_{n^{2}}$,k不是p或q的倍数(k存在模n的逆),接下来就可以计算µ ≡ k-1mod n,如图3所示。在解密过程中,公钥(n, g)相同的情况下,计算得到的µ值总是相同的,也是必不可少的。
计算实例 |
公式 |
µ ≡ 51-1≡74 mod 77 |
计算 µ ≡ k-1mod n |
图3:µ,L(gλ(n) mod n2)在$ℤ^{*}_{n}$中的逆在 解密过程中非常重要。这里n=77,L(gλ(n) mod n2) |
所有人在解密过程中必须计算m ≡ L(gλ(n) mod n2)·µ mod n,如图4所示。
计算实例 |
公式 |
m ≡ L(462430≡ 4852mod 5929)·74 mod 77 m ≡ 63·74 ≡ 4662 ≡ 42 mod 77 |
m ≡ L(cλ(n) mod n2)·µ mod n |
图4:paillier加密系统解密过程。 这里n = 77, c ≡ 4624 mod n,µ ≡ 74 mod n |
加解密中的数学原理
为了理解解密过程,我们首先介绍一个公式
$ε_{g}:ℤ_{n} * ℤ^{*}_{n}\rightarrow ℤ^{*}_{n^{2}}$
$ε_{g}(x, y)\rightarrow g^{x}*y^{n} mod n^{2}$
定义εg(m, r) 是使用随机数对m进行加密的加密公式。回想一下在加密阶段选择g的时候,我们要求g模n2的阶必须是n的倍数。如果g符合这个条件,则εg是双射的。我们将引用下边的引理来证明这个结论。
引理:两个阶相同的有限集A、B构成的函数f:A$\rightarrow$ B是满射的当且仅当这个函数是单射的。
定理:如果g的阶是n的非零倍数,则对于 εg(x, y) ≡ gx·yn mod n2 来说εg是双射的。
证明:假设g的阶是n的非零倍数。我们知道|$ℤ^{*}_{n^{2}}$|=φ(n2) = n·φ(n)=| ℤn x $ℤ^{*}_{n}$|,意味着$ℤ^{*}_{n^{2}}$和 ℤn x $ℤ^{*}_{n}$拥有相同个数。基于上边的引理如果εg是单射的,它也是满射的。因此,我们证明了εg是单射的可以充分的证明它也是双射的。
假设 gx1·y1n≡gx2·y2n·mod n2。我们可以得到 gx1-x2·(y1/y2)n ≡ 1·mod n2。等式两边同时取λ(n)次幂,得到 gλ(n)·(x1-x2)·(y1/y2)n·λ(n) ≡ 1·mod n2。卡迈克尔定理表明$ℤ^{*}_{n^{2}}$中的元素,取λ(n)次幂模n与1同余。该定理同时也表明$ℤ^{*}_{n^{2}}$中的元素,取n·λ(n)次幂模n2与1同余。y1和y2-1都是$ℤ^{*}_{n^{2}}$中的元素,所以他们的乘积y1/y2也是$ℤ^{*}_{n^{2}}$中的元素,由此我们可以得到 (y1/y2)n·λ(n) ≡ 1·mod n2,所以 gλ(n)·(x1-x2)·(y1/y2)n·λ(n) ≡ gλ(n)·(x1-x2) ≡ 1·mod n2。
以上证明表示 λ(n)·(x1-x2) 是g的阶的倍数。最开始的时候我们已经假设g的阶是n的非零倍数,所以 λ(n)·(x1-x2) 也是n的倍数。由于 λ(n)·(x1-x2) 可以被n整除,并且GCD(λ(n), n)=1,我们可以得出n整除x1-x2或者说x1-x2模n与0同余。而且x1和x2是 ℤn中的元素,它们的模n同余可以保证他们是相等的。
让我们再回到方程式 gx1-x2·(y1/y2)n ≡ 1·mod n2,当x1=x2时,我们得到 (y1/y2)n ≡ 1·mod n2,继而y1n≡y2n。当y1与y2模n同余时,上式成立。
所以根据y1,y2 ∈ $ℤ^{*}_{n}$,我们得到了x1=x2。
这意味着,给出任何一个属于$ℤ^{*}_{n^{2}}$的元素w,当n选定之后,选择一个符合要求的g,加密结果εg(x, y)≡w mod n2是独一无二的。为了便于标注,我们指定εg(x, y) ≡ gx·yn≡ w mod n2,定义[w]g为ℤn中唯一与之对应的元素x, 即[w]g =x。
因为εg可以映射到$ℤ^{*}_{n^{2}}$中所有元素,而且g本身也是$ℤ^{*}_{n^{2}}$中的一个元素,因此我们可以找到$ℤ^{*}_{n^{2}}$中另一个阶是n的非零倍数的元素t能够通过相同计算得到g。
ℤn2中元素(1+n)的幂 |
基于(1+n)∈$ℤ^{*}_{n^{2}}$: (1+n)2≡1+2n+n2≡1+2n mod n2 (1+n)3≡1+3n+n3≡1+3n mod n2 (1+n)v≡1+v·n+[n的高次幂]≡1+v·n mod n2
|
图5:(1+n)v和1+v·n模n同余 |
如图5所示,(1+n)n≡1+n·n≡1 mod n2。很明显,n本身是n的一倍,也是(1+n)的阶,并且(1+n)n-1是它在$ℤ^{*}_{n^{2}}$中的逆(表明(1+n)∈$ℤ^{*}_{n^{2}}$)。(1+n)符合t要求的性质,所以我们可以计算[g](1+n)。也就是说g≡ε(1+n)(t,z)≡(1+n)t·zn mod n2,t=[g](1+n)。
当我们加密信息m时,密文 c≡εg(m, r) ≡ gm·rn mod n2,我们之前刚刚证明g可以表示为g≡ε(1+n)([g](1+n),z)≡(1+n)[g](1+n)·zn mod n2。使用g的表达式来代替g,我们可以得到:
c≡gm·rn≡[(1+n)[g](1+n)·zn]m·rn mod n2
≡(1+n)m[g](1+n)·zmn·rn mod n2
≡(1+n)m[g](1+n)·(zm·r)n mod n2
由z∈$ℤ^{*}_{n}$, 可知zm∈$ℤ^{*}_{n}$,由r∈$ℤ^{*}_{n}$,可知zm·r∈$ℤ^{*}_{n}$,所以
c≡ε(1+n)(m·[g](1+n), zm·r) mod n2
c可以表示为[c](1+n)≡m·[g](1+n),即m≡[c](1+n)·{[g](1+n)}-1 mod n([c](1+n)是ℤn中元素,所以模n2与模n同余)。
由上述结果可知,无论c为何值,[g](1+n)的逆是一个定值。解密c需要计算[c](1+n),并将结果与定值[g](1+n)的逆相乘并模n。在解密时,我们计算了µ ≡ L(gλ(n)mod n2)-1 mod n,并声明这是一个和m,c或者r都无关的对于解密来说很必要的定值。结合上述证明我们有了µ的另一种形式 µ≡(L(gλ(n) mod n2)-1 ≡ {λ(n)·[g](1+n)}-1 mod n。现在让我们看看密文如何回到明文。
gλ(n) mod n2:
gλ(n) ≡ [(1+n)[g](1+n)·zn]λ(n)·znλ(n) mod n2
因为z∈$ℤ^{*}_{n^{2}}$,由卡迈克尔定理可知znλ(n) ≡ 1 mod n2。可得:
gλ(n) ≡ (1+n)λ(n)[g](1+n) mod n2
≡1+λ(n)·[g](1+n)·n+[n的高次幂] mod n2
≡1+λ(n)·[g](1+n)·n mod n2
现在将gλ(n) mod n2 代入L(u)(L(u)=(u-1)/n):
L(gλ(n) mod n2)≡L(1+λ(n)·[g](1+n)·n)mod n
≡{1+λ(n)·[g](1+n)·n-1}/n mod n
≡{λ(n)·[g](1+n)·n}/n mod n
≡λ(n)·[g](1+n) mod n
所以 L(gλ(n)mod n2) ≡ λ(n)·[g](1+n) mod n,µ ≡ L(gλ(n) mod n2)-1 ≡ {λ(n)·[g](1+n)}-1 mod n,我们同样可以用卡迈克尔定理简化L(cλ(n)mod n2):
cλ(n) mod n2:
cλ(n)≡[(1+n)[c](1+n)·dn]λ(n) mod n2
≡[(1+n)[c](1+n)·dnλ(n) mod n2
≡(1+n)[c](1+n) mod n2
≡1+λ(n)·[c](1+n)·n+[n的高次幂] mod n2
≡1+λ(n)·[c](1+n)·n mod n2
所以:
L(cλ(n) mod n2)≡L(1+λ(n)·[c](1+n)·n) mod n
≡{1+λ(n)·[c](1+n)·n-1}/n mod n
≡{λ(n)·[c](1+n)·n}/n mod n
≡λ(n)·[c](1+n) mod n
可得:µ ≡ L(gλ(n) mod n2)-1 ≡ {λ(n)·[g](1+n) mod n,L(cλ(n) mod n2) ≡ λ(n)·[c](1+n) mod n。即L(cλ(n) mod n2)·µ ≡ λ(n)·[c](1+n)·λ(n)-1·[g](1+n)-1 ≡ [c](1+n)·[g](1+n)-1 ≡ m mod n。
我们注意到,对于给定公钥(n,g),µ总是相等的,只需要计算一次。意味着解密过程包含一个指数幂模n2,和固定值L(µ)相乘的结果模n。使得解密变成一个计算复杂度是指数幂模n2相对简单的过程。
paillier加密系统的加法同态
通过paillier加密系统加密的两个消息相乘的结果解密后得到的是两个消息相加的结果。
两个密文c1 ≡ gm1·r1n mod n2 , and c2 ≡ gm2·r2n mod n2
c1·c2≡ gm1·gm2·r1n ·r2n mod n2⇒ c1·c2 ≡gm1·gm2·r1n ·r2n ≡ gm1+m2·(r1·r2)nmod n2
r1和r2都是$ℤ^{*}_{n^{2}}$中元素,,因此r1·r2也属于$ℤ^{*}_{n^{2}}$,并且具有相同的性质,所以此处的值是r1还是r2亦或是ri并不重要,c1·c2可以看作是m=m1+m2加密的密文,c1·c2的解密结果为m。
总结
以上原理的讲解比较复杂与繁琐,这里总结一下上文中加解密推导的主要思路。
1.参数选择要求
2.加密实例
3.证明双射的条件
4.继而证明明文与密文是一一对应的
5.找到密文的原射,用以代入,可以推出一个解密得到的明文的表达式子
6.由于g也属于密文空间内,找到g的原射,把g用原射表示代入
7.把g的原射表达式代入µ,得到µ的另一种表达式
8.用正常的解密方式把之前的各种代换代入,得到和之前第5步找到的解密明文表达方式相等,证明解密方式是正确的。
如有我理解的不正确的地方,欢迎加以指正。
paillier加密算法原理详解的更多相关文章
- AES 加密算法的原理详解
AES 加密算法的原理详解 本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分. AES简介 高级加密标准( ...
- SSL/TLS 原理详解
本文大部分整理自网络,相关文章请见文后参考. SSL/TLS作为一种互联网安全加密技术,原理较为复杂,枯燥而无味,我也是试图理解之后重新整理,尽量做到层次清晰.正文开始. 1. SSL/TLS概览 1 ...
- [No0000126]SSL/TLS原理详解与WCF中的WS-Security
SSL/TLS作为一种互联网安全加密技术 1. SSL/TLS概览 1.1 整体结构 SSL是一个介于HTTP协议与TCP之间的一个可选层,其位置大致如下: SSL:(Secure Socket La ...
- [转帖]HTTPS系列干货(一):HTTPS 原理详解
HTTPS系列干货(一):HTTPS 原理详解 https://tech.upyun.com/article/192/HTTPS%E7%B3%BB%E5%88%97%E5%B9%B2%E8%B4%A7 ...
- 【转】HTTPS系列干货(一):HTTPS 原理详解
HTTPS系列干货(一):HTTPS 原理详解 前言 HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并 ...
- I2C 基础原理详解
今天来学习下I2C通信~ I2C(Inter-Intergrated Circuit)指的是 IC(Intergrated Circuit)之间的(Inter) 通信方式.如上图所以有很多的周边设备都 ...
- Zigbee组网原理详解
Zigbee组网原理详解 来源:互联网 作者:佚名2015年08月13日 15:57 [导读] 组建一个完整的zigbee网状网络包括两个步骤:网络初始化.节点加入网络.其中节点加入网络又包括两个 ...
- 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解
CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...
- 锁之“轻量级锁”原理详解(Lightweight Locking)
大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意. 原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖 ...
随机推荐
- Linux svn 服务器配置--转
转自 http://my.oschina.net/lionel45/blog/298305 留存备份. Linux搭建SVN 服务器 作者: 沈小然 日期:2014年 8月 5日 1 ...
- FactoryBean 和 BeanFactory
大佬勿喷,如果有什么地方理解错了欢迎吐槽 一 .BeanFacory 首先来看看下边的代码 package com.lhf.beanfactory; public class SingleBean { ...
- Codeforces Round #576 (Div. 2) D. Welfare State
http://codeforces.com/contest/1199/problem/D Examples input1 output1 input2 output2 Note In the firs ...
- Self-examination
第一次参加省赛,算是真正感受到比赛的残酷.拿到好成绩,需要平时大量的积累,甚至也需要一点运气,然后我还做的不够,但我觉得我可以做得更好. 我之前是没有任何基础,大一才刚刚从知码开门入门.然后刚开始一直 ...
- Leetcode7_整数反转
题目 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123输出: 321 示例 2: 输入: -123输出: -321 示例 3: 输入: 120输出: ...
- 学习python-20191108(1)Mysql、Flask
一.使用pymysql模块操作MYSQL 导入pymysql模块: pip install pymysql 1.增删改 import pymysql # 定义数据库连接信息 config = { ...
- Python opencv PIL numpy base64互相转化
PIL2numpy and numpy2PIL from PIL import Image import numpy image = Image.open('timg.jpeg')# image is ...
- leetcode第38题:报数
这是一道简单题,但是我做了很久,主要难度在读题和理解题上. 思路:给定一个数字,返回这个数字报数数列.我们可以通过从1开始,不断扩展到n的数列.数列的值为前一个数列的count+num,所以我们不断叠 ...
- 密码子演化假说|凝固事件假说|立体化学假说|共进化假说|代谢途径相关性假说|四重兼并|假四重兼并|最小损伤原则|AU-rich|GC-rich|逐步进化假说|分子机制进化假说
生命组学 将密码子表重排后发现,嘌呤嘧啶含量不同,密码子的氨基酸种类由第一二位决定,同时第三位变化大却没有蛋白质层面上实质性的改变,这说明第三位氨基酸是用于维持氨基酸组成不发生变化同时保证蛋白质稳定性 ...
- python 3新式类的多继承
因为我用的是python3,所以所用到的类都是新式类,这里我说的都是新式类,python2类的继承复杂一些,主要有新式类和老式类.python3类(新式类)的继承是是广度优先(BFS),实例如下: c ...