paillier
(1+n)n≡1+n·n≡1 mod n2
同态加密
1. 定义
一种加密算法E()和相应的解密算法D()。
⊕和⊙为某种数学运算。
如果加密算法满足:E(x + y) = E(x) ⊕ E(y),我们将这种加密函数叫做加法同态 。
如果加密算法满足:E(x * y) = E(x) ⊙ E(y),我们将这种加密函数叫做乘法同态 。
一个加密函数如果只满足加法同态,就只能进行加减法运算;如果只满足乘法同态,就只能进行乘除法运算;如果同时满足加法同态和乘法同态,称为完全同态。
2. 运用
将数据处理权与数据所有权分离,使得在不解密密文的情况对密文数据进行数学运算等同于对原文数据做运算。例如:某公司要计算员工平均新增,而员工薪资是隐私数据,以密文的形式存储。利用同态加密技术可以在不解密数据的情况下计算员工平均薪资。
定义:E(x + y) = E(x) ⊕ E(y)
原数据 密文
x E(x)
+ ⊕
y E(y)
‖ ‖
x + y D(E(x)⊕E(y))
1
2
3
4
5
6
7
8
9
3. 一种实现:Paillier密码体系
Paillier加密系统,是1999年Paillier发明的概率公钥加密系统。基于复合剩余类的困难问题。该加密算法是一种同态加密,满足加法和乘法同态。
3.1 秘钥生成
随机选择两个大质数p和q满足gcd(pq,(p−1)(q−1)=1
gcd(pq,(p−1)(q−1)=1。 这个属性是保证两个质数长度相等。
计算 n=pq
n=pq和λ=lcm(p−1,q−1)
λ=lcm(p−1,q−1)。
选择随机整数g(g∈ℤ∗n2
g∈Zn2∗),使得满足n整除g的阶。
定义 L(x)=(x−1)n
L(x)=n(x−1)
计算Unexpected text node: ' '
μ=(L(gλmodn2))−1modn
公钥为 (n,g)
(n,g)
私钥为(λ,μ)
(λ,μ)
3.2 加密
m为原文(0≤m<n)
(0≤m<n)
选择随机数r(0<r<n,r∈ℤ∗n2
r∈Zn2∗),且gcd(r,n)=1
gcd(r,n)=1
加密:Unexpected text node: ' '
c=gm∗rnmodn2
3.3 解密
解密:Unexpected text node: ' '
m=L(cλmodn2)∗μmodn
3.4 同态属性
加法同态(两个密文的乘积将解密为它们相应的明文之和)
Unexpected text node: ' '
D(E(m1)∗E(m2)modn2)=m1+m2modn
同态倍增
Unexpected text node: ' '
D(E(m1)m2modn2)=m1m2modn
Unexpected text node: ' 'D(E(m2)m1modn2)=m1m2modn
————————————————
版权声明:本文为CSDN博主「Danbu:)」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33885461/java/article/details/86555560
https://www.cnblogs.com/sssssaylf/archive/2020/03/04/12398133.html
paillier加密算法是一种公钥加密算法,基于复合剩余类的困难问题。满足加法同态,即密文相乘等于明文相加:D(E(m1)·E(m2))=m1+m2。这里详细介绍其加密解密是如何推导的,需要具备数论、代数系统、模运算的相关知识,同时理解起来可能需要多阅读几遍并加以思考。
先将密钥生成和加解密过程罗列便于直观看
截图来源于:https://blog.csdn.net/sinianluoye/article/details/82855059
加密过程
在进行加解密之前,必须先产生可以用来加密的公钥n和g。n是两个大小相近的两个大素数的乘积:n=p·q。g是ℤn2
中的半随机数,同时g的阶必须在ℤ∗n2中并且能被n整除。由于g必须符合一些特殊性质(我们将在解密部分提出)所以ℤ∗n2中会有很少一部分元素不能用作g,意味着g是一个半随机数。为了简单计算,我们先选取两个小素数p=7,q=11计算得到n=p·q=77。从ℤ∗n2中选择g(g的阶必须是ℤ∗n2中元素并且是n的倍数。除此之外,g需要满足的另一个性质将会在解密时详细描述),在这里我们先选择5652作为g。因为g模n2的阶是2310且是77的倍数,并且在ℤ∗n2
中。那么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 ∈ ℤn2
,就像我们之前选作公钥的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计算得到的值是ℤn2
中的一个元素,由卡迈克尔定理可知,该值 ≡ 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∈ℤ∗n2,g的阶∈ℤ∗n2
,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→ℤ∗n2
εg(x,y)→gx∗ynmodn2
定义εg(m, r) 是使用随机数对m进行加密的加密公式。回想一下在加密阶段选择g的时候,我们要求g模n2的阶必须是n的倍数。如果g符合这个条件,则εg是双射的。我们将引用下边的引理来证明这个结论。
引理:两个阶相同的有限集A、B构成的函数f:A→
B是满射的当且仅当这个函数是单射的。
定理:如果g的阶是n的非零倍数,则对于 εg(x, y) ≡ gx·yn mod n2 来说εg是双射的。
证明:假设g的阶是n的非零倍数。我们知道|ℤ∗n2
|=φ(n2) = n·φ(n)=| ℤn x ℤ∗n|,意味着ℤ∗n2和 ℤ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。卡迈克尔定理表明ℤ∗n2
中的元素,取λ(n)次幂模n与1同余。该定理同时也表明ℤ∗n2中的元素,取n·λ(n)次幂模n2与1同余。y1和y2-1都是ℤ∗n2中的元素,所以他们的乘积y1/y2也是ℤ∗n2
中的元素,由此我们可以得到 (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。
这意味着,给出任何一个属于ℤ∗n2
的元素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可以映射到ℤ∗n2
中所有元素,而且g本身也是ℤ∗n2中的一个元素,因此我们可以找到ℤ∗n2
中另一个阶是n的非零倍数的元素t能够通过相同计算得到g。
ℤn2中元素(1+n)的幂 |
基于(1+n)∈ℤ∗n2 |
: (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是它在ℤ∗n2
中的逆(表明(1+n)∈ℤ∗n2
)。(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∈ℤ∗n2
,由卡迈克尔定理可知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都是ℤ∗n2
中元素,,因此r1·r2也属于ℤ∗n2
,并且具有相同的性质,所以此处的值是r1还是r2亦或是ri并不重要,c1·c2可以看作是m=m1+m2加密的密文,c1·c2的解密结果为m。
总结
以上原理的讲解比较复杂与繁琐,这里总结一下上文中加解密推导的主要思路。
1.参数选择要求
2.加密实例
3.证明双射的条件
4.继而证明明文与密文是一一对应的
5.找到密文的原射,用以代入,可以推出一个解密得到的明文的表达式子
6.由于g也属于密文空间内,找到g的原射,把g用原射表示代入
7.把g的原射表达式代入µ,得到µ的另一种表达式
8.用正常的解密方式把之前的各种代换代入,得到和之前第5步找到的解密明文表达方式相等,证明解密方式是正确的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理