关于ECC-Elgamal同态加密

Posted 木子-欣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于ECC-Elgamal同态加密相关的知识,希望对你有一定的参考价值。

关于ECC-Elgamal同态加密

1.什么是ECC(elliptic curve)

1.有限域

首先我们要知道椭圆曲线加密是在有限域进行加密的(对于无限域上的加密我没有了解过),在椭圆曲线  
加密上有限域分为:1.GF(p)素数域2.GF(2^m)伽罗华域。本次我们讨论素数域上的椭圆曲线加密。

2.模运算

由于我们要在有限域上进行加密,而椭圆曲线是连续的,并不适合加密,所以必须把椭圆曲线变成离散的点,
要把椭圆曲线定义在有限域上,这时我们就要用到模运算,把点映射到有限域上。

模运算:运算符(mod n)将所有整数映射到集合{0,1,...,(n-1)}中。性质有如下
(1)[(a mod n) + (b mod n)] mod n = (a+b)mod n
(2)[(a mod n) - (b mod n)] mod n = (a-b)mod n
(3)[(a mod n) * (b mod n)] mod n = (a*b)mod n
这个运算在很多非对称加密中都要用到,像RSA,paillier等都会涉及。关于他们的证明还请读者去寻找初等数论知识。
还有一个知识点也要补充一下--同余

同余:设m是正整数,a和b是整数。如果m|a-b(|是整除的意思),则称a模m同余于b,或a与b模m同余,记作a≡b(mod n). 
在数论中 同余关系是等价关系(我也不知道为什么,反正他们规定的) 但是要满足下列三个属性

(1)自反性:a≡a(mod n)
(2)传递性:a≡b(mod n),b≡c(mod n),a≡c(mod n)
(3)对称性:a≡b(mod n) => b≡a(mod n)

后续我们会经常用到同余,所以当对于一个椭圆曲线公式左右值求出来不相等的时候(肯定是你忘记mod n)了!
左右两边都记得! y^2(mod n) = x^3+a*x+b(mod n) ((mod n)不是单单对bmod的,是x值带入全部计算出来之后在取mod,
我第一次就犯错误了!)

3.椭圆曲线上的加法运算

首先椭圆曲线并不是椭圆,在上面进行加法是有特殊的法则的,我们讨论GF(p)上的加法运算
设p=23,a=b=1,考虑曲线方程y^2 = x^3+a*x+b(a,b代入)

(1)P+O=P (其中P是椭圆曲线上的点,O是无穷远点)
(2)若P=(X1,Y1),则P+(X1,-Y1)=O.点(X1,-Y1)是点P的逆元,记作-P.
(3)若P=(X1,Y1),Q=(X2,Y2),且P≠-Q则R=P+Q=(Xr,Yr)有下列规则确定:
	Xr = (λ^2-X1-X2)mod p
	Yr = (λ(Xr-X1)-Y1)mod p
其中:
	若P≠Q  λ=[(Y2-Y1)/(X2-X1)]mod p
	若P=Q  λ=[(3*X1^2+a)/2*Y1]mod p
(4)乘法定义为重复相加:4P=P+P+P+P.

2.非同态加密的椭圆曲线加密

1.公私钥生成:

 1.Alice首先构造一条椭圆曲线E,在曲线上选择一点G作为生成元,并求G的阶为n,要求n必须为质数。
 2.Alice选择一个私钥(d<n),生成公钥Q=d*G(多次调用椭圆曲线上的加法运算)
 3.Alice将公钥组Ep(a,b),Q,G发送给Bob

https://zhuanlan.zhihu.com/p/40243602 很不错的一篇文章来讲解阶和基点

2.明文嵌入

 1.Bob拿到Alice的公钥组后,对消息m进行加密(如果是字符串的话,可以把明文信息存入char[]数组,逐个转换成ASCII
 在明文嵌入椭圆曲线),这里为了方便我直接假设明文消息m是一个整数。
 2.计算嵌入点Pm的x坐标
	step 1. 设m满足(m+1)K<p (K为Bob选择的一个大整数),明文m将用数字x=mK+j表示,其中0<=j<=K,计算(x^3+a*x+b)mod p
	step 2.当p为大于3的素数(奇素数)时,用勒让德符号来判断A=x^3+a*x+b是否**二次剩余**,若A是模p的二次剩余,则存在A的模p平方根,x可以作为哦明文m的植入点坐标。
	step3.若A是模p的二次非剩余,则返回step1,将j+1,用新的x值再试一次,重复上面的步骤,直到找到一个x使得A是模p的二次剩余或j=K,如果j始终等于K,则不能把信息映射到一点。
 3.计算G(x,y)的y坐标
	当A=x^3+a*x+b是模p二次剩余,那我们就要求解y^2 ≡A(mod p),我采用的是Tonelli-shanks算法。(后续我会讲解这个算法的,目前还请读者自行补充知识),此时我们就得到一个椭圆曲线上的坐标Pm(x,y).

3.加密

 椭圆曲线的密文形式为C = kG,Pm+kQ (其中k为Bob选取的随机正整数,Pm为明文嵌入的点,Q为Alice的公钥)
	令C1 = kG (椭圆曲线的标量乘法:k次调用椭圆曲线加法)
	令C2 = Pm+kQ(同上)
	发送密文给Alice

4.解密

 Alice拿到密文C后,计算Pm = C2-C1*d;(我觉得这个加密要把x嵌入点时的,K与j传送过来,方便解码)
 然后取Pm的x坐标计算:m=(x-j)/K,得到明文信息。
 (我们假设有一个敌手,获取到了以上信息;但是由于Alice的密钥时不可知的,那么Pm=C2-C1*d也是一个难题)

对于上述的明文嵌入的ECC加密是不支持同态加密的,假设存在Pm1与Pm2点,密文的相加时,进行的时椭圆曲线域上的加法,不满足代数域上的逻辑,得不到m1+m2的结果!

3.同态加密的椭圆曲线加密(ECC-Elgamal)

对比上述的非同态加密ECC加密算法,两者的区别在于明文嵌入的方式。

1.同态加密明文嵌入

Pm = m*G(其中m为明文消息转换而成的大整数,G为椭圆曲线的基点),由于G点是椭圆曲线的生成元,所以进行标量乘法
之后的点依旧在椭圆曲线上

2.加密

此时我们加密的密文变成C= kG,mG+kQ(mG既是明文嵌入点),将密文传输给Alice

3.解密

Alcie拿到密文后,计算mG=m*G+k*Q-k*G*d,然后求解mg的离散对数问题。目前我接触到的算法是BSGS(Baby Step Giant Step),
可以将他的原理引用到椭圆曲线中。(如果有时间的话,我会在后续写一下,还请读者自行查找信息)。

提供一篇论文进行参考:
https://kns.cnki.net/kcms/detail/detail.aspx?dbcode=CJFD&dbname=CJFD2009&filename=XDJS200904057&uniplatform=NZKPT&v=pRDZYuOSvHSZmOOdRSfbOP6_cX5qXtTmoSDIMGFvKECAuhzEB6X9F_zKZOj2OCYA

4.同态加密


当我们对上述运算过的密文进行解密时,得到的消息就是m1+m2;

3.关于椭圆曲线的选择

T(p,a,b,G,n,h)这六个椭圆曲线的主要参数 其中n是G点的阶,h是T上所有点个数m与n相除的整数部分
 1.一般来说p越大越安全,但是越大速度也就会下降,一般选取200位左右
 2.P≠n*h
 3.p*t 不同余 1(mod n) 1<=t<=20
 4.4a^3+27b^2 不同余 0 mod p
 5.n为素数
 6.h<=4

4.总结

其实上述的功能我用C++,粗略实现了。但是代码写的太差了,还有很多未知的bug。有一句说的好–存在缺点的战士好过完美的苍蝇!还是要把自己所学的分享出来,你们以后就是密码学大佬!(如果有错误的地方还请大佬多多指正!我虚心求教!)

同态加密之Paillier算法

同态加密之Paillier算法

0,背景介绍

同态加密,即原来在明文上的运算操作,经过同态加密后在密文上同样可以进行。一般有半同态和全同态加密之分:

  • 半同态加密 (Partial Homomorphic Encryption, PHE):只支持某些特定的运算法则 f ,PHE 的优点是原理简单、易实现,缺点是仅支持一种运算(加法或乘法)

  • 层次同态加密(Liveled HE,LHE):一般支持有限次数的加密算法,LHE 的优点是同时支持加法和乘法,并且因为出现时间比 PHE 晚,所以技术更加成熟、一般效率比 FHE 要高很多、和 PHE 效率接近或高于 PHE,缺点是支持的计算次数有限。

  • 全同态加密 (Fully Homomorphic Encryption, FHE):支持无限次的任意运算法则 f,FHE 有以下类别:基于理想格的 FHE 方案、基于 LWE/RLWE 的 FHE 方案等等。FHE 的优点是支持的算子多并且运算次数没有限制,缺点是效率很低,目前还无法支撑大规模的计算。

    第一个满足加法和乘法同态的同态加密方法直到2009年才由Craig Gentry提出。目前来说,全同态加密算法性能较差,应用较少。比较常用的是半同态加密算法,实现方式有 RSA (乘法同态)、Elgamal、Paillier (加法同态)等。

1,Paillier算法介绍

密钥生成

  1. 随机选择两个质数 p 和 q 满足 gcd(pq,(p-1)(q-1)) =1,这个条件保证了 p 和 q 的长度相等;
  2. 计算 N=pq 和 λ=lcm(p−1,q−1),其中 lcm 表示最小公倍数;
  3. 随机选择 g∈Z∗N^2,满足 g c d ( L ( g λ m o d N 2 ) , N ) = 1 gcd(L(g^λ mod N^2),N)=1 gcd(L(gλmodN2),N)=1,后面会发现这里的 g=n+1。其中 Z 表示整数,下标表示该整数集合里有多少个元素;L(x)= x − 1 N \\fracx-1N Nx1 μ = ( L ( g λ m o d N 2 ) ) − 1 m o d    N μ = (L(g^λ mod N^2))^-1 \\mod N μ=(L(gλmodN2))1modN
  4. 公钥为 (N,g);
  5. 私钥为(λ,μ)。

加密过程

对于任意明文消息 m ∈ Z N m∈Z_N mZN,任意选择一随机数 r ∈ Z N ∗ r∈Z_N^* rZN,计算得到密文 c :

c = E ( m ) = g m r N m o d    N 2 c=E(m)=g^mr^N \\mod N^2 c=E(m)=gmrNmodN2

解密过程

对于密文$ c∈Z_N2*$,计算得到明文 m :

m = D ( c ) = L ( c λ m o d N 2 ) L ( g λ m o d N 2 ) m o d    N = L ( c λ m o d N 2 ) ∗ μ m o d    N m=D(c)=\\fracL(c^λ mod N^2) L(g^λmod N^2) \\mod N=L(c^λ mod N^2)*μ \\mod N m=D(c)=L(gλmodN2)L(cλmodN2)modN=L(cλmodN2)μmodN

加法同态的性质

对于任意明文 m 1 , m 2 ∈ Z N m1,m2∈Z_N m1m2ZN和任意 r 1 , r 2 ∈ Z N ∗ r1,r2∈Z_N^* r1r2ZN,对应密文 c 1 = E [ m 1 , r 1 ] , c 2 = E [ m 2 , c 2 ] c1=E[m1,r1],c2=E[m2,c2] c1=E[m1,r1]c2=E[m2,c2]满足:

c 1 ⋅ c 2 = E [ m 1 , r 1 ] ⋅ E [ m 2 , r 2 ] = g m 1 + m 2 ⋅ ( r 1 ⋅ r 2 ) N   m o d   N 2 c_1 \\cdot c_2=E\\left[m_1, r_1\\right] \\cdot E\\left[m_2, r_2\\right]=g^m_1+m_2 \\cdot\\left(r_1 \\cdot r_2\\right)^N \\bmod N^2 c1c2=E[m1,r1]E[m2,r2]=gm1+m2(r1r2)NmodN2

解密后得到:

D [ c 1 ⋅ c 2 ] = D [ E [ m 1 , r 1 ] ⋅ E [ m 2 , r 2 ]   m o d   N 2 ] = m 1 + m 2   m o d   N D\\left[c_1 \\cdot c_2\\right]=D\\left[E\\left[m_1, r_1\\right] \\cdot E\\left[m_2, r_2\\right] \\bmod N^2\\right]=m_1+m_2 \\bmod N D[c1c2]=D[E[m1,r1]E[m2,r2]modN2]=m1+m2modN

即我们得到了: c 1 ∗ c 2 = m 1 + m 2 c1*c2=m1+m2 c1c2=m1+m2密文乘等于明文加。

通过分析发现,密文乘时,含有的明文是在指数上相加的,所以解密后就可以得到明文相加结果。

为什么叫加法同态呢?我们一般希望密文计算的结果和我们明文计算的结果相同,所以对于密文上是如何计算的不做要求。这时我们在明文上实现了加法的目的,就叫它加法同态。由此还扩展出了同态加和标量乘的性质。

算法理论

由上式结论不难知道: μ = λ − 1 μ=λ^-1 μ=λ1(g=n+1)。此外,还有 r λ n m o d    N 2 = 1 r^λn\\mod N^2=1 rλnmodN2=1

具体算法理论证明,参见:Paillier Cryptosystem理论与实践

2,pyhtotn—paillier算法演示

我们使用了 Python 实现的 paillier 算法来演示一些性质。你可以使用如下命令安装对应库:

pip install phe

具体使用可以参考:https://python-paillier.readthedocs.io/en/latest/usage.html

下面,我们使用 phe 演示 paillier 的同态加和标量乘的性质:

from phe import paillier # 开源库
import time # 做性能测试

# 测试paillier参数
print("默认私钥大小:",paillier.DEFAULT_KEYSIZE) #2048
# 生成公私钥
public_key,private_key = paillier.generate_paillier_keypair()
# 测试需要加密的数据
message_list = [3.1415926,100,-4.6e-12]
# 加密操作
time_start_enc = time.time()
encrypted_message_list = [public_key.encrypt(m) for m in message_list]
time_end_enc = time.time()
print("加密耗时ms:",time_end_enc-time_start_enc)
# 解密操作
time_start_dec = time.time()
decrypted_message_list FISCO BCOS 同态加密 实例

同态加密:实现数据的“可算不可见”

数据交易之数据信托,区块链差异隐私同态加密及智能合约等新 技术强化数据管理与保护的程度,全面提升个人数据利用的安全性合规性与保密性

同态加密实现数据隐私计算,能让你的小秘密更加秘密

区块链中的密码学之默克尔树(十五)

同态加密在加密机器学习中的应用