主页 > 华为imtoken无法安装 > web3:同态加密
web3:同态加密
web3相关的学习也收录在本博客:web3学习博客目录百科
目录
同态加密概念
同态加密(Homomorphic Encryption,简称HE)是密码学界很早以前提出的一种开放式加密。
问题。 时间回到 1978 年,Ron Rivest、Leonard Adleman 和 Michael L.
Dertouzos 在银行应用程序 [RAD78] 的背景下提出了这个概念。 罗恩·里维斯特和伦纳德
Adleman是著名的RSA算法(一种非对称加密算法)中的R和A。 至于中间的S,阿迪
Shamir,仍在为密码学贡献新的工作。
什么是同态加密?
最先构造完全同态加密(Fully Homomorphic Encryption)[Gen09]的Craig Gentry给出的直观定义是最好的:
A way to delegate processing of your data, without giving away access to it.
一种在不放弃访问权限的情况下委托数据处理的方法。
这是什么意思? 通用加密方案侧重于数据存储安全。 也就是说,如果我要向其他人发送数据,或者将数据存储在计算机上,我需要在发送或存储数据之前对数据进行加密。 没有密钥的用户无法从加密结果中获取原始数据的任何信息。 只有拥有密钥的用户才能正确解密,得到原始内容。 我们注意到,在此过程中,用户不能对加密结果进行任何操作,只能进行存储和传输。 对加密后的结果进行任何操作都会导致解密错误,甚至解密失败。
但同态加密方案侧重于数据处理的安全性。 同态加密提供了处理加密数据的功能。 也就是说,其他人可以对加密后的数据进行处理,但处理过程中不会泄露任何原始内容。 同时,拥有密钥的用户对处理后的数据进行解密后,得到的正是明文数据处理后的结果。
♂️理解
用户A买了一大块金子,她想让工人把这块金子做成一条项链。 但是工人在建造过程中可能会偷金,那么有没有办法让工人加工金块(delegate
处理您的数据),而不放弃对它的访问
A 可以这样做:
● 将黄金锁在装有手套的密闭箱中。
● 工人可戴上此手套处理箱内的黄金。 但是箱子是锁着的,不仅金块不在工人手中,而且在加工过程中掉落的黄金也无法接触到。
● 处理完成后。 A 拿回盒子,打开锁,得到金子。
盒子看起来像这样:
这里的对应关系是:
● 盒子:加密算法
● 箱子上锁:用户钥匙
● 将金块放入箱子并用锁锁住:使用同态加密方案对数据进行加密
● 处理:应用同态特征,在无法获取数据的情况下,直接对加密结果进行处理
● 解锁:解密结果,直接得到处理后的结果
同态加密是如何定义的?
我们以云计算应用场景为例:
Alice通过Cloud处理同态加密(以下简称HE)数据的整个过程大致如下:
爱丽丝加密数据。 并将加密后的数据发送到云端; Alice将数据处理方法提交给Cloud,这里用函数f表示; Cloud在函数f下对加密数据进行处理,并将处理结果发送给Alice; Alice 处理数据解密并得到结果。
据此,我们可以直观的得到一个HE方案应该具备的功能:
KeyGen函数:密钥生成函数。 这个函数应该由 Alice 运行来生成用于加密数据 Data 的密钥 Key。 当然,还应该有一些公共常量PP(Public Parameter);
Encrypt function:加密函数。 Alice也应该运行这个函数,用Key加密用户数据Data,得到密文CT(Ciphertext);
Evaluate function:评价函数。 该函数由Cloud运行,按照用户给定的数据处理方式f对密文进行运算,这样的结果就相当于用户用密钥Key对f(Data)进行了加密。
Decrypt function:解密函数。 这个函数由 Alice 运行以得到 Cloud 处理的结果 f(Data)。
那么,f 函数应该是什么样的呢? 根据函数f的不同约束,HE方案实际上分为两类:
● 全同态加密(Fully Homomorphic Encryption,简称FHE):即HE方案支持任意给定的f函数,只要该f函数可以用算法描述并由计算机实现即可。 显然,FHE方案是一个非常好的方案,但是计算开销巨大,暂时不能在实际中使用。
● Somewhat Homomorphic Encryption(简称SWHE)或部分同态加密(Partial Homomorphic Encryption,简称PHE):即HE方案只支持某些特定的f函数。 SWHE方案稍微弱一些,但也意味着开销会变小,更容易实现,现在可以实际使用了。
主流同态加密算法原理
满足有限运算同态但不满足任意运算同态的加密算法称为半同态加密。 典型的半同态加密特征包括乘法同态、加法同态、有限个数的全同态等。
乘法同态加密算法
简单理解:
将加密数据相乘:则(x13)∗(x23)(x_1^3)*(x_2^3)(x13 )∗(x23 ),即(x1∗x2)3(x_1*x_2)^3 ( x1 ∗x2 )3 对加密数据处理结果进行解密(此处简化示例为平方根数)
在实际应用中,密文乘法同态的需求场景并不多,因此乘法同态在现有经典加密算法中往往是偶然存在的。 典型的满足乘法同态性质的加密算法有1977年提出的RSA公钥加密算法和1985年提出的ElGamal公钥加密算法。
① RSA算法
RSA算法是最经典的公钥加密算法,已有40多年的历史。 它的安全性是基于大整数分解的难题。 在实际应用中,RSA算法可以采用RSA_PKCS1_PADDING、RSA_PKCS1_OAEP_PADDING等填充方式,根据密钥长度(一般为1024位或2048位)对明文组进行填充,只有不对明文进行填充的原始RSA算法才能满足乘同态性。 由于原始RSA不是随机加密算法,即加密过程中没有使用随机因素,所以每次用相同密钥加密相同明文的结果是固定的。 因此,利用RSA的乘法同态实现同态加密运算存在安全漏洞,攻击者可能通过选择明文攻击获取原始数据。
一些数学基础知识 欧拉定理:如果两个正整数a和n互质,则:a^φ(n)≡1 mod n。 特别地,当n为质数时: a^(n-1)≡1 mod n modulo inverse elements: 如果两个正整数a和n互质,则必须找到整数b,满足:a×b≡ 1 mod n(ab-1能被n整除,或者ab被n整除的余数为1)此时,b称为a的“模元”。 RSA的具体过程
假设alice想通过rsa算法加密发给公网bob的消息,该怎么办呢? 分为以下几个步骤:
1、bob生成公私钥,将公钥发布到网上,自己保存私钥
2、Alice用Bob的公钥加密明文消息m,得到密文c,将密文c传递给Bob
3. Bob用自己的私钥解密密文c得到明文m
秘钥的生成选择一个整数e,满足1< e < φ(n),且e和φ(n)互质,求解e关于φ(n)的模逆元d (因为e和φ(n)互质,所以d一定存在)n和e封装成公钥,n和d封装成私钥加密
假设alice要将明文信息m发送给bob,使用bob的公钥(n=3233,17,e=17)对m进行加密。
并且在加密的时候,必须将明文分组为比特串,保证每组对应的十进制数小于n,即保证mc ≡ m^e (mod n)
这里假设m为65,则可以计算出以下等式:65^17 ≡ 2790 (mod 3233)
因此,c 等于 2790,alice 将 2790 发送给 bob。
解密
bob得到c(2790)后,用自己的私钥(n=3233,d=2753)解密。
m ≡ c^d (mod n)
然后,bob 计算 2790^2753 ≡ 65 (mod 3233)
因此,bob知道alice加密前的原文是65。
验证了RSA算法的乘法同态性
给定两个明文m1和m2,用上述方法加密后得到两个密文,
c1 = E(m1) = m1^ ( ),
c2 = E(m2) = m2^ ( ),
将两个密文相乘得到: c1∗c2= E(m1) ∗E(m2) = m1^∗ m2^ ( ),
由于E(m1m2) = (m1m2)( ),可以得出E(m1m2) = E(m1) ∗ E(m2),
验证了RSA算法的乘法同态性。
Java代码实现简单
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.Random;
public class RSATest {
public static void main(String[] args) throws Exception{
// 1. 生成RSA密钥对
// 获取指定算法的密钥对生成器
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
// 初始化密钥对生成器(指定密钥长度, 使用默认的安全随机数源)
gen.initialize(512);
// 随机生成一对密钥(包含公钥和私钥)
KeyPair keyPair = gen.generateKeyPair();
// 获取 公钥 和 私钥
RSAPublicKey pubKey = (RSAPublicKey)keyPair.getPublic();
RSAPrivateKey priKey = (RSAPrivateKey)keyPair.getPrivate();
// 获得公私钥 和 公共模数
BigInteger E = pubKey.getPublicExponent();
BigInteger D = priKey.getPrivateExponent();
BigInteger N = pubKey.getModulus();
System.out.println("E:" + E);
System.out.println("D:" + D);
System.out.println("N:" + N);
BigInteger m1 = BigInteger.valueOf(new Random().nextInt(Integer.MAX_VALUE));
BigInteger m2 = BigInteger.valueOf(new Random().nextInt(Integer.MAX_VALUE));
// 加密
BigInteger C1 = m1.modPow(E, N);
BigInteger C2 = m2.modPow(E, N);
// 密文相乘
BigInteger C = C1.multiply(C2).mod(N);
// 解密
BigInteger Mc = C.modPow(D, N);
// 验证
BigInteger val = m1.multiply(m2);
System.out.println("原始数据数据m1:" + m1 + ",m2:" + m2);
System.out.println("m1加密后数据C1:" + C1);
System.out.println("m2加密后数据C2:" + C2);
System.out.println("C:" + C);
System.out.println("Mc:" + Mc);
}
}
python代码的简单实现
import rsa
import rsa.core
# pip install rsa
(public_key, private_key) = rsa.newkeys(256)
print('1.密钥生成')
print('生成公钥')
print('public key:', public_key)
print(public_key.n,public_key.e)
print()
print('生成私钥')
print('private key:', private_key)
print(private_key.n,private_key.d)
print()
print('2.加密')
enc1 = rsa.core.encrypt_int(2, public_key.e, public_key.n)
print('加密3 结果 enc1: ' + str(enc1))
enc2 = rsa.core.encrypt_int(20, public_key.e, public_key.n)
print('加密15 结果 enc2: ' + str(enc2))
print()
result = enc1 * enc2
print('3.同态运算')
print('相乘 result=' + str(enc1) + ' * ' + str(enc2) + '=' + str(result))
print()
decrypt_result = rsa.core.decrypt_int(result, private_key.d, public_key.n)
print('4.解密:' + str(decrypt_result))
print()
② ElGamal算法
ElGamal算法是一种基于Diffie-Hellman离散对数问题的公钥密码算法,可以实现公钥加密和数字签名功能,同时满足乘法同态性。 ElGamal 是一种随机加密算法。 即使每次用相同的密钥加密相同的明文,其密文结果也是不同的。 因此,不存在类似RSA算法的选择明文攻击问题。 是ISO同态加密国际标准中唯一的。 指定乘法同态加密算法。
加法同态加密算法
Paillier算法是1999年提出的一种基于合数余数问题的公钥加密算法,也是最常用、最实用的加法同态加密算法。 已经在很多有同态加密需求的应用场景中实现。 是ISO同态加密国际标准中唯一规定的加法同态加密算法。 此外,由于支持加法同态,Paillier算法还可以支持乘法同态,即支持密文与明文的乘法。
python代码的简单实现
import random
import phe
from phe import EncodedNumber, paillier
from phe.util import invert, powmod, getprimeover, isqrt
import numpy as np
# test
if __name__ == "__main__":
public_key, private_key = paillier.generate_paillier_keypair(n_length=10)
print('pub', public_key.g, public_key.n)
print('priv', private_key.p, private_key.q)
A=[3,32]
print('A', A)
enA=[public_key.encrypt(x) for x in A]
print(enA[0].ciphertext(False))
print(enA[0].ciphertext(False).bit_length())
B=[4,16]
print('B', B)
enB=[public_key.encrypt(x) for x in B]
print(enB[0].ciphertext(False))
print(enB[0].ciphertext(False).bit_length())
en=np.add(enA,enB)
print(en[0].ciphertext(False))
print(en[0].ciphertext(False).bit_length())
for x in en:
print(private_key.decrypt(x))
有限全同态加密算法
2005年提出的Boneh-Goh-Nissim方案是一种基于双线性映射的公钥密码方案,支持任意多个加法同态和一个乘法同态运算。 方案中的加法同态是基于类似于Paillier算法的思想,而乘法同态是基于双线性映射的运算性质。 由于双线性映射运算会改变密文的组,因此只能支持乘法同态运算,但仍支持对乘法后的密文进行进一步的加法同态运算。
同态加密的优点
我们目前的技术系统是基于密码学的。 项目中会用到很多密码学组件,比如非对称加密、交互加密等。在这一层之上,构建了很多安全算子,比如同态加密、无意传输、秘密共享等。
非全同态加密存在的问题 1. 非通用计算
非通用的计算标准需要根据具体问题制定不同的计算标准。 一言以蔽之,一件事就是一个协议,新的计算需要在参与合作的各方之间使用同一个协议。 one-thing-one-protocol non-universal computing,利用目前的密码学技术构造算子,在工程实践中并不是一个理想的解决方案。
2.计算逻辑的暴露
计算逻辑暴露的问题与一物一协议密切相关。 两个数据所有者需要遵循相同的协议来计算某些结果。 例如,如果一个数据拥有者想和对方比较一个统计值的大小,就需要告诉对方使用比较大的协议。 只有在对方确认自己有相同的约定后,才能进行比对操作。
这样,在任何一个参与者的计算过程中,计算逻辑都会暴露给其他参与者,参与者无法保护计算逻辑本身。 虽然计算逻辑听起来不重要,但实际上在真实的金融场景中,一些模型和方法的计算逻辑可能是公司的核心机密,所以计算逻辑的暴露是隐私计算非常重要的问题。
3、多轮互动
在进行多协议交互时btc解密,网络通信和交换的频率会更加频繁,这对网络带宽、网络速度和网络稳定性都有更高的要求。
在一些金融场景中,参与者和金融机构往往通过专线连接到信息系统。 当数据传输量很大,交换频率很高时,往往会拖慢整个计算过程。 另外,当网络交换频率很高时,对网络稳定性的要求也比较高,网络出现断线、延迟等波动可能会导致计算过程失败。
4. 可信执行环境
面对上述多轮交互带来的网络带宽、网络速度和网络稳定性问题,是否可以采用涉及硬件级安全计算的解决方案,比如使用可信执行环境。 在实际业务计划中推进这种可信执行环境的实施过程中,建设方可能会遇到一些非技术问题。 实际业务客户更关心专用硬件的成本和安全性:
金融机构通常自建计算集群来处理大数据业务btc解密,投入了大量成本。 如果他们要重建一个基于可信执行环境的集群,成本是巨大的。 另外,目前可信环境硬件厂商主要来自国外,如Intel、AMD等,根据厂商的描述,客户无法完全认可这套设备的可靠性,信任度较低。
因此,当我们遇到这样的场景,需要解决业务保密问题,又不能采用可信计算环境时,全同态加密的优势就体现出来了。
标准化进展 1. 半同态加密标准化
2019年5月,国际标准化组织ISO发布了同态加密标准(ISO/IEC 18033-6:2019)。 本标准仅涉及半同态加密,具体包括两种相对成熟的半同态加密机制:ElGamal乘法同态加密和Paillier加法同态加密,并规定了参数和密钥生成、数据加密、参与实体加密等。 文本数据的解密、密文数据的同态运算等步骤的具体过程。
2. 全同态加密标准化
2017年7月,来自学界、产业界、政界等相关领域的研究人员组成同态加密标准化开放联盟HomomorphicEncryption.org,在微软研究院举办了首届全同态加密标准化研讨会,开始共同推动全球加密。 编写同态加密标准草案,发布全同态加密安全标准、API标准、应用标准三份白皮书。 迄今为止,HomomorphicEncryption.org已经在三年内举办了五次全同态加密标准化会议。 参与成员包括微软、三星SDS、英特尔、IBM、谷歌、万事达卡等公司,以及NIST、ITU等机构的代表,以及高校的主要学者。 在标准化进展方面,HomomorphicEncryption.org分别于2018年3月和11月发布并更新了全同态加密标准草案。
同态加密应用场景
目前同态加密算法已经在区块链、联邦学习等需要数据隐私计算的场景实现。 由于全同态加密还处于方案探索阶段,现有算法存在运行效率低下、密钥过大、密文爆炸等性能问题,在性能上离可行的工程应用还有一定距离。 因此,实际应用中的同态加密算法大多选择半同态加密(如加法同态),用于在特定应用场景下实现有限的同态计算功能。
1.外包计算
当用户有数据但没有算力资源时,可以使用同态加密技术对自己的数据进行加密,依靠第三方云厂商的算力资源来计算结果。 这样既可以得到你想要的结果数据,又不会泄露你自己的数据隐私。
2.模型训练
在模型训练过程中,标签拥有者将自己的标签加密并传输给特征拥有者。 由于全同态加密算法允许对密文进行无限制的加乘运算,特征拥有者可以在密文空间中执行整个训练算法,并将训练好的模型返回给特征任务方进行解密。
这个过程只需要两轮网络通信,免去了一些频繁的网络交互。 同时,label owner的模型训练是完全自主可控的,模型可以灵活调整,不需要和feature owner有相同的协议,所以它的计算逻辑不会暴露。
3、联合风控
在联合风控场景下,数据提供者不希望自己的数据泄露给银行,银行也不希望自己的风控规则泄露给数据提供者。 在这种情况下,可以采用全同态加密,对数据提供者的数据和银行的风控规则进行加密,最终根据计算结构决定是否放贷。
4.金融工程
在金融工程场景中,客户不愿意向券商透露自己的持股情况,券商也不愿意向对方公开自己投入巨大资源的金融工程模型。 在这种情况下,可以采用全同态加密对客户持仓数据进行加密,作为券商金融工程模型的输入,最终解密计算出的模型结果进行资本运作。
参考