隐私保护笔记
群签名
群签名(group signature)方案是一种类似于数字签名的密码原语,其目的在于允许用户代表群签名消息,并在该群内保持匿名。看到签名的人可以用公钥验证消息是由群成员发送的,但不知道是哪一个。用户不能滥用匿名行为,因为群管理员可以通过使用秘密信息(密钥)来消除用户的匿名性。在电子商务、电子政务、企业管理等场景中可以应用。
群签名的安全性和效率成为应用的瓶颈。许多安全的群签名效率较低,许多已有的群签名不支持成员撤销或成员撤销效率很低,不适合大群组应用。经典的群签名方案有 ACJT 2000、BBS04 等,但它们存在无法撤销、效率低下等问题。
详细流程参考 FISCO BCOS隐私特性:群/环签名技术实现
环签名
环签名(ring signature)是一种数字签名方案,最初由Rivest等人提出。环签名是一种简化的群签名,其中只有环成员没有管理者,不需要环成员间的合作。与群签名关键区别在于环签名没有 ”群管理员“,没有可信中心,没有群的建立过程。对验证者来说,签名人是完全正确匿名的。提供了一种匿名泄露秘密的巧妙方法,无条件匿名性在需要长期保护信息的特殊环境中非常有用。
聚合签名
聚合签名是一种将任意多个签名聚合成一个签名的变体签名方案。可以将一笔多签交易的各个参与方的公钥和签名合并为一个公钥与签名,整个合并过程是不可见的,无法从合并后的公钥与签名推导出合并前的信息。当前通常使用 Schnorr 签名算法实现签名聚合。私钥签名,公钥验证签名。
假名技术
假名技术允许用户使用临时的、不相关的身份信息进行通信。用户可以使用伪造的身份或随机生成的身份发送消息,从而保护其真实身份的隐私。常用于保护用户的隐私和匿名通信。
补充:在车联网中的应用
在车辆通信中,假名通常指匿名身份或伪装身份,以保护车辆和驾驶员的隐私。假名的使用旨在防止对车辆的跟踪或识别。可以通过使用假名证书代替用户的真实身份,确保车辆在交流信息时可以保持一定的匿名性。
详细信息可参考 FISCO BCOS隐私特性:群/环签名技术实现。
匿名技术
匿名技术是一组方法和协议,旨在隐藏个人的真实身份信息。在匿名技术中,参与者可以通过使用伪装身份或通过特定的协议来隐藏自己的身份,从而保护隐私。匿名技术广泛应用于匿名通信、网络隐私保护、数字货币等领域。
群签名、假名、匿名关系
-
群签名技术和假名技术的应用
- 群签名技术通过将签名与群体相关联来实现匿名性。
- 假名技术允许用户使用伪装的身份进行通信,从而实现匿名性。
-
不同的应用场景
- 群签名技术通常用于在群体中实现对消息的匿名签名。
- 假名技术通常用于在一对一通信或多对多通信中隐藏个人的真实身份。
-
匿名技术的广泛概念
- 匿名技术是一个更广泛的概念,包括群签名技术和假名技术,以及其他一些实现匿名性和隐私保护的密码学方法和协议。
身份基签名(IBS)
身份基签名具备如下特征:
- 用户的公钥可以是其公开身份,相应的私钥由系统主私钥盲化身份生成。
- 系统主私钥用于生成用户私钥,用户可利用私钥进行签名。
- 具体算法包括初始化算法、私钥提取算法、签名算法和验证算法。
在基于身份的数字签名方案中,密钥生成中心(PKG)起到关键作用,验证者只需验证用户身份的真实性。关于基于身份的数字签名的安全性证明,不同方案存在多种方法,如基于椭圆曲线上的双线性配对、二次剩余理论等。
补充
在具有特殊功能的数字签名领域,如群签名、代理签名、盲签名、聚合签名、多签名等,也有相应的基于身份的签名方案研究。
变色龙函数
变色龙哈希函数具有四个主要的算法:
-
密钥生成算法: 给定安全常数,输出变色龙哈希的公钥和私钥(陷门)。
-
哈希生成算法: 输入公钥、随机数和任意消息,生成哈希值和随机数。
-
哈希验证算法: 输入公钥、任意消息和哈希值、随机数,若是正确的哈希值,则输出1,否则输出0。
-
哈希碰撞算法: 输入私钥(陷门)、消息、新消息和哈希值、随机数,输出新随机数,使得两个哈希值相等。
举例(基于离散对数的变色龙哈希函数):
- 密钥生成:$p、q$为素数,公钥$pk$为 $y=g^x\ \mod\ p$
- 哈希生成:$\text{Hash}(m1, r1) = g^{m1} * y^{r1}\ \mod\ p$
- 哈希碰撞:$r_2 = x*m_1 - m_2 + r_1\ \mod\ p$
来源:
K-匿名性
K-匿名性是一种匿名化数据的性质。如果一组公开的数据中,任何一个人的信息都不能和其他至少 k-1 人区分开,则称该数据满足 k-匿名性。
实现方法:
- 数据抑制: 用星号“*”取代一些属性的值,可以是整列或部分值。
- 数据泛化: 用更宽泛的类别取代一些属性的精确值,如将具体年龄改写为年龄范围。
攻击方式:
- 同质性攻击: 如果目标属性在 k 个条目中的取值都相同,即使数据已经被 k-匿名化,目标属性在 k 条记录中的取值仍然可以被获取。
- 背景知识攻击: 利用目标属性与准标识符属性之间的联系来减少目标属性里可能值的数量。
保密性vs隐私保护
概念辨析
-
保密性是指保护信息不被泄露给未经授权的人员或设备。它侧重于信息的访问控制,确保只有拥有适当权限的人才能查看或使用数据。
-
隐私保护则更关注个人对自身数据的使用和控制。它不仅包括信息的保密性,还包括个人对数据收集、使用和共享方式的知情权和选择权。
简单来说,保密性是关于“谁可以访问数据”,而隐私保护则是关于“如何使用数据”。
举例
-
一家医院使用加密技术保护患者的医疗记录,确保只有授权的医护人员才能查看。这属于保密性措施。
-
患者可以选择查看自己的医疗记录,并决定是否同意将这些记录用于研究或其他目的。这属于隐私保护范畴。
各种攻击
女巫攻击(Sybil Attack)
简介
女巫攻击(Sybil Attack)是一种针对声誉系统或分布式系统的攻击,攻击者通过创建大量虚假身份来控制或操纵系统。
攻击原理
女巫攻击的原理是利用声誉系统或分布式系统通常无法区分真实身份和虚假身份的特点。攻击者通过创建大量虚假身份,可以获得不成比例的影响力,甚至控制整个系统。
攻击方式
女巫攻击可以通过以下方式进行:
- 创建虚假账户: 攻击者可以使用自动化工具创建大量虚假账户,这些账户通常具有随机生成的名字、头像和个人资料。
- 伪造行为: 攻击者可以模拟真实用户的行为,例如发表评论、点赞、投票等,以提高虚假账户的信誉。
- 操纵系统: 攻击者可以利用虚假账户来操纵系统的投票、排名、奖励等机制,以获得不公平的利益。
攻击危害
女巫攻击会对声誉系统或分布式系统造成以下危害:
- 降低信任度: 女巫攻击会降低用户对系统的信任度,因为他们无法区分真实用户和虚假用户。
- 操纵系统: 攻击者可以利用女巫攻击来操纵系统,例如传播虚假信息、操控选举结果等。
- 浪费资源: 女巫攻击会增加系统的资源消耗,例如存储空间、计算资源等。
防御措施
可以采取以下措施来防御女巫攻击:
- 身份验证: 使用强身份验证机制,例如双因素认证、生物识别等,可以提高区分真实身份和虚假身份的能力。
- 行为分析: 分析用户行为,例如登录时间、IP地址、操作模式等,可以识别异常行为并阻止虚假账户。
- 声誉机制: 建立声誉机制,根据用户历史行为来评估其信誉度,可以降低虚假账户的影响力。
案例
女巫攻击在现实生活中经常发生,以下是一些案例:
- 社交媒体平台: 一些社交媒体平台被攻击者利用女巫攻击来刷粉丝、点赞、评论等,以虚假提升账号的知名度。
- 众筹平台: 一些众筹平台被攻击者利用女巫攻击来虚假投票、支持项目,以骗取资金。
- 区块链网络: 一些区块链网络被攻击者利用女巫攻击来获得投票权、控制算力等,以破坏网络的正常运行。
网络空间安全
网络空间安全是指保护网络空间免受各种威胁和攻击的整体状态,包括网络安全、密码学及应用、系统安全、应用安全、数据安全、物联网安全、云安全、移动安全等多个方面。
分类方法
网络空间安全的分类方法有很多,以下是一种常见的分类方法:
1. 按安全对象分类
- 网络安全: 保护网络基础设施和通信系统的安全,包括网络设备、网络协议、网络数据等。
- 系统安全: 保护计算机系统和软件的安全,包括操作系统、应用程序、数据库等。
- 应用安全: 保护应用程序的安全,包括Web应用程序、移动应用程序等。
- 数据安全: 保护数据的机密性、完整性和可用性,包括数据存储、数据传输、数据处理等。
- 物联网安全: 保护物联网设备和系统的安全,包括物联网设备、物联网平台、物联网数据等。
- 云安全: 保护云计算环境和数据的安全,包括云平台、云服务、云数据等。
- 移动安全: 保护移动设备和数据的安全,包括移动设备、移动应用程序、移动数据等。
2. 按安全技术分类
- 密码学及应用: 研究和应用密码技术来保护网络空间安全,包括加密技术、认证技术、数字签名技术等。
- 安全防护技术: 采用防火墙、入侵检测系统、防病毒软件等技术来防护网络空间安全。
- 安全管理技术: 采用安全策略、安全制度、安全培训等技术来管理网络空间安全。
3. 按安全威胁分类
- 网络攻击: 包括网络入侵、网络攻击、网络钓鱼等。
- 软件漏洞: 包括操作系统漏洞、应用程序漏洞、数据库漏洞等。
- 数据泄露: 包括数据盗窃、数据丢失、数据损坏等。
- 物联网安全威胁: 包括物联网设备攻击、物联网数据泄露、物联网僵尸网络等。
- 云安全威胁: 包括云平台攻击、云服务攻击、云数据泄露等。
- 移动安全威胁: 包括移动设备攻击、移动应用程序攻击、移动数据泄露等。
ECC和Paillier
椭圆曲线密码学 (Elliptic Curve Cryptography, ECC)
1. 原理
ECC 是基于椭圆曲线数学结构的一种公钥密码学。椭圆曲线方程通常表示为:
$[ y^2 = x^3 + ax + b ]$
其中,a 和 b 是定义曲线的常数,x 和 y 是曲线上的点的坐标。ECC 的安全性依赖于椭圆曲线离散对数问题 (Elliptic Curve Discrete Logarithm Problem, ECDLP),即在给定椭圆曲线上两个点 $( P ) $和 $( Q )$,找到一个整数 $( k )$,使得$ ( Q = kP ) $是非常困难的。
2. 流程
ECC 的基本操作包括点加法和标量乘法:
- 点加法:给定椭圆曲线上的两个点$ ( P ) $和$ ( Q )$,可以计算它们的和$ ( R = P + Q )$。
- 标量乘法:给定一个点 $( P ) $和一个整数 $( k )$,可以计算$ ( kP )$,即将点 $( P )$ 加 $( k ) $次。
ECC 的加密、解密和密钥生成过程如下:
-
密钥生成:
- 选择一个椭圆曲线$ ( E )$ 和一个基点$ ( G )$。
- 选择一个私钥 $( d )$(随机整数)。
- 计算公钥 $( Q = dG )$。
-
加密:
- 选择接收者的公钥 $( Q )$。
- 选择一个随机整数 $( k )$。
- 计算密文$ ( C_1 = kG ) $和$ ( C_2 = M + kQ )$,其中$ ( M ) $是明文表示为曲线上的一个点。
-
解密:
- 接收者使用私钥 $( d ) $计算 $( dC_1 = dkG )$。
- 计算 $( M = C_2 - dC_1 )$。
3. 示例
假设 Alice 想要发送消息 $( M )$ 给 Bob:
- Bob 选择私钥$ ( d_B )$ 并计算公钥$ ( Q_B = d_B G )$。
- Alice 选择随机数$ ( k )$,计算 $( C_1 = kG )$ 和 $( C_2 = M + kQ_B )$。
- Alice 发送 $( (C_1, C_2) ) $给 Bob。
- Bob 使用私钥 $( d_B ) $计算 $( M = C_2 - d_B C_1 )$。
4. 优缺点
-
优点:
- 高效性:相比 RSA 等传统公钥算法,ECC 在提供相同安全级别的情况下,使用的密钥长度更短,计算效率更高。
- 安全性:ECC 在相同密钥长度下提供更高的安全性。
-
缺点:
- 复杂性:ECC 的数学背景较为复杂,理解和实现起来比传统算法更困难。
- 专利问题:早期 ECC 的一些实现曾受到专利保护,尽管现在大部分专利已经过期。
5. 使用场景
- 移动设备:由于 ECC 的高效性,特别适合资源受限的设备,如智能手机和物联网设备。
- SSL/TLS:ECC 被广泛用于 HTTPS 协议中的 SSL/TLS 证书,以提高安全性和性能。
- 区块链:比特币和以太坊等区块链系统使用 ECC 进行数字签名和密钥生成。
Paillier 加密算法
1. 原理
Paillier 加密算法是一种基于同态加密的公钥密码系统。它的安全性依赖于计算两个大素数乘积的困难性(类似于 RSA),以及解决特定同态性质的困难性。Paillier 加密的一个显著特点是它支持加法同态,即给定两个密文 $( E(m_1) )$ 和 $( E(m_2) )$,可以通过某种操作直接得到 $( m_1 + m_2 ) $的密文。
2. 流程
Paillier 加密算法的流程如下:
-
密钥生成:
- 选择两个大素数 $( p )$ 和 $( q )$,计算 $( n = p \times q )$ 和 $( \lambda = \text{lcm}(p-1, q-1) )$,其中 lcm 是最小公倍数。
- 选择一个随机数 $( g )$ 满足 $( g \in \mathbb{Z}_{n^2}^* )$ 且 $( g )$ 的阶为 $( n )$。
- 计算 $( \mu = (\text{L}(g^\lambda \mod n^2))^{-1} \mod n )$,其中 $( \text{L}(x) = \frac{x-1}{n} )$。
- 公钥为 $( (n, g) )$,私钥为 $( (\lambda, \mu) )$。
-
加密:
- 给定明文 $( m \in \mathbb{Z}_n )$。
- 选择一个随机数 $( r \in \mathbb{Z}_n^* )$。
- 计算密文 $( c = g^m \times r^n \mod n^2 )$。
-
解密:
- 给定密文 $( c )$。
- 计算 $( m = \text{L}(c^\lambda \mod n^2) \times \mu \mod n )$。
3. 示例
假设 Alice 想要加密消息 $( m = 42 )$:
-
密钥生成:
- 选择 $( p = 11 ),( q = 13 ),则 ( n = 143 )$。
- 计算 $( \lambda = \text{lcm}(10, 12) = 60 )$。
- 选择 $( g = 2 )$,计算$ ( \mu = (\text{L}(2^{60} \mod 143^2))^{-1} \mod 143 )$。
- 公钥为 $( (143, 2) )$,私钥为$ ( (60, \mu) )$。
-
加密:
- 选择随机数 $( r = 7 )$。
- 计算密文 $( c = 2^{42} \times 7^{143} \mod 143^2 )$。
-
解密:
- 计算 $( m = \text{L}(c^{60} \mod 143^2) \times \mu \mod 143 )$。
4. 优缺点
-
优点:
- 同态加密:Paillier 支持加法同态,可以直接对密文进行加法运算,得到明文加法的结果。这在隐私保护计算中非常有用。
- 安全性:基于大整数分解问题,具有较高的安全性。
-
缺点:
- 计算复杂度:相比于其他加密算法,Paillier 的计算复杂度较高,尤其是在加密和解密过程中涉及大整数的幂运算。
- 密文长度:密文长度较长,为 $( n^2 )$ 位,这会增加存储和传输的开销。
5. 使用场景
- 数据聚合:在需要对多个加密数据进行聚合计算的场景中,Paillier 加密算法非常有用。例如,在分布式系统中,各个节点可以将加密后的数据发送到中央服务器,服务器可以在不解密的情况下对数据进行求和操作,然后将结果解密得到总和。
6. 同态性
Paillier加密算法是一种基于数论的同态加密算法,具有加法同态性质。这意味着在加密状态下可以直接对密文进行操作,而不需要解密,操作结果在解密后与对明文进行相应操作的结果相同。
具体来说,Paillier加密算法的同态性质包括以下两个主要方面:
-
加法同态性
如果你有两个明文 $( m_1 )$ 和 $( m_2 )$,它们对应的密文分别为 $( c_1 )$ 和 $( c_2 )$,那么在不解密的情况下,可以通过对密文进行操作来得到明文之和 $( m_1 + m_2 )$ 的加密结果。具体来说,如果 $( c_1 = E(m_1) )$ 和 $( c_2 = E(m_2) )$,那么:
$[ E(m_1) \times E(m_2) \equiv E(m_1 + m_2) \ (\text{mod} \ n^2) ]$ -
明文与常数的乘法同态性
如果你有一个明文 $( m ) $和一个常数$ ( k )$,那么可以通过对密文进行操作来得到$ ( k \times m )$ 的加密结果。具体来说,如果 $( c = E(m) )$,那么:
$[ E(m)^k \equiv E(k \times m) \ (\text{mod} \ n^2) ]$
ECC 与 Paillier 的对比
1. 安全性
- ECC:基于椭圆曲线离散对数问题,具有较高的安全性。相同安全级别下,ECC 的密钥长度远小于 RSA 和 Paillier。
- Paillier:基于大整数分解问题,安全性与 RSA 类似,但由于其同态加密特性,适用于特定的隐私保护计算场景。
2. 性能
- ECC:由于密钥长度较短,ECC 的计算效率较高,特别适合在资源受限的环境中使用,如移动设备和物联网设备。
- Paillier:加密和解密过程涉及大整数的幂运算,计算复杂度较高,性能不如 ECC。
3. 密文操作
- ECC:不支持同态加密,无法直接对密文进行操作。
- Paillier:支持加法同态,可以在不解密的情况下对密文进行加法运算,这在隐私保护计算中非常有用。
4. 应用场景
- ECC:广泛应用于 SSL/TLS、区块链、数字签名、移动设备安全等领域。
- Paillier:主要用于隐私保护计算、电子投票、数据聚合等需要同态加密的场景。
总结
- ECC 是一种高效且安全的公钥加密算法,适用于广泛的应用场景,尤其是在资源受限的环境中。它的主要优势在于高效性和较短的密钥长度。
- Paillier 是一种支持加法同态的加密算法,适用于需要在加密数据上进行计算的场景。尽管其计算复杂度较高,但在隐私保护计算中具有独特的优势。
根据具体的应用需求,可以选择合适的加密算法。如果需要高效的公钥加密,ECC 是一个很好的选择;如果需要在加密数据上进行计算,Paillier 则更为适合。
布隆过滤器
1. 原理
布隆过滤器(Bloom Filter)是一种空间效率非常高的概率型数据结构,用于判断一个元素是否属于一个集合。它可以快速地判断某个元素是否可能存在于集合中,但不能确定元素一定存在。布隆过滤器的核心思想是使用多个哈希函数将元素映射到一个位数组中。
布隆过滤器的特点是:
- 可能存在:如果布隆过滤器判断某个元素存在,那么它可能真的存在,也可能是误判(即“假阳性”)。
- 一定不存在:如果布隆过滤器判断某个元素不存在,那么它一定不存在。
2. 结构
布隆过滤器由以下两部分组成:
- 位数组:一个长度为 ( m ) 的位数组,初始时所有位都设置为 0。
- 哈希函数集合:一组 ( k ) 个独立的哈希函数,每个哈希函数将输入映射到位数组的一个索引位置。
3. 操作流程
布隆过滤器支持两种基本操作:插入 和 查询。
-
插入操作:
- 对于要插入的元素 ( x ),使用 ( k ) 个哈希函数 ( h_1(x), h_2(x), \dots, h_k(x) ) 分别计算出 ( k ) 个哈希值。
- 将位数组中对应的 ( k ) 个位置(即 ( h_1(x), h_2(x), \dots, h_k(x) ) 对应的索引位置)设置为 1。
-
查询操作:
- 对于要查询的元素 ( y ),同样使用 ( k ) 个哈希函数计算出 ( k ) 个哈希值。
- 检查位数组中对应的 ( k ) 个位置是否都为 1。
- 如果所有位置都为 1,则判断元素 ( y ) 可能存在。
- 如果有任意一个位置为 0,则判断元素 ( y ) 一定不存在。
4. 示例
假设我们有一个布隆过滤器,位数组长度为 ( m = 10 ),使用 ( k = 3 ) 个哈希函数。
-
插入元素:
- 插入元素 “apple”:
- 通过 3 个哈希函数计算出哈希值分别为 2、5、7。
- 将位数组的第 2、5、7 位设置为 1。
- 插入元素 “banana”:
- 通过 3 个哈希函数计算出哈希值分别为 1、4、7。
- 将位数组的第 1、4、7 位设置为 1(注意第 7 位已经是 1,不需要再次设置)。
插入后的位数组可能如下所示:
1
[0, 1, 1, 0, 1, 1, 0, 1, 0, 0]
- 插入元素 “apple”:
-
查询元素:
- 查询元素 “apple”:
- 通过 3 个哈希函数计算出哈希值分别为 2、5、7。
- 检查位数组的第 2、5、7 位,发现都为 1,因此判断 “apple” 可能存在。
- 查询元素 “orange”:
- 通过 3 个哈希函数计算出哈希值分别为 3、6、9。
- 检查位数组的第 3、6、9 位,发现第 3 位为 0,因此判断 “orange” 一定不存在。
- 查询元素 “apple”:
5. 优缺点
-
优点:
- 空间效率高:布隆过滤器使用的内存非常少,特别适合在内存有限的场景中使用。
- 插入和查询速度快:布隆过滤器的插入和查询操作都非常高效,时间复杂度为 ( O(k) ),其中 ( k ) 是哈希函数的数量。
-
缺点:
- 存在误判:布隆过滤器可能会误判某个元素存在(假阳性),但不会误判某个元素不存在(假阴性)。
- 无法删除元素:标准的布隆过滤器不支持删除操作,因为删除一个元素可能会影响其他元素的判断。
6. 布隆过滤器的使用场景
布隆过滤器由于其高效的空间利用率和快速的查询速度,广泛应用于以下场景:
-
数据库和缓存系统:
- 缓存穿透防护:在缓存系统中,布隆过滤器可以用于防止缓存穿透。缓存穿透是指大量查询不存在的数据,导致每次查询都要访问数据库。布隆过滤器可以在缓存层判断某个键是否可能存在,如果布隆过滤器判断该键不存在,则直接返回,不访问数据库。
- 数据库查询优化:布隆过滤器可以用于快速判断某个数据是否存在于数据库的某个分区或表中,从而避免不必要的磁盘 I/O 操作。
-
网络安全:
- 垃圾邮件过滤:布隆过滤器可以用于快速判断某个邮件地址是否在已知的垃圾邮件地址列表中,从而提高垃圾邮件过滤的效率。
- 黑名单过滤:在网络安全中,布隆过滤器可以用于快速判断某个 IP 地址或域名是否在黑名单中,从而提高防火墙或入侵检测系统的性能。
-
分布式系统:
- 分布式存储系统:在分布式存储系统中,布隆过滤器可以用于判断某个数据块是否存在于某个节点上,从而减少不必要的网络通信。
- 去重操作:在大规模数据处理系统中,布隆过滤器可以用于快速判断某个元素是否已经处理过,从而避免重复处理。
-
区块链和加密货币:
- 轻节点同步:在区块链系统中,轻节点可以使用布隆过滤器来快速判断某个交易是否在区块中,从而减少数据同步的开销。
-
搜索引擎:
- 网页去重:搜索引擎在抓取网页时,可以使用布隆过滤器来判断某个 URL 是否已经抓取过,从而避免重复抓取。
总结
布隆过滤器是一种高效的概率型数据结构,适用于需要快速判断元素是否存在的场景。它通过牺牲一定的准确性(可能存在假阳性)来换取极高的空间效率和查询速度。尽管布隆过滤器有一些限制,如无法删除元素和存在误判,但在许多实际应用中,它仍然是非常有用的工具,尤其是在大规模数据处理和分布式系统中。
BF-PSI
基于布隆过滤器(Bloom Filter)的私有集合交集(Private Set Intersection, PSI)是一种密码学协议,允许两个参与方在不泄露各自数据集的额外信息的情况下计算出它们数据集的交集。这种方法利用了布隆过滤器,这是一种空间高效的概率性数据结构,用于测试一个元素是否属于一个集合。
以下是基于布隆过滤器的PSI的详细说明:
布隆过滤器
-
结构:布隆过滤器是一个位数组,初始时所有位都设置为0。它使用多个哈希函数将元素映射到位数组中的位置。
-
插入:要将一个元素插入布隆过滤器,需使用每个哈希函数计算该元素的哈希值。每个哈希函数产生一个位数组中的位置,并将这些位置的位设置为1。
-
查询:要检查一个元素是否在布隆过滤器中,需用所有哈希函数对该元素进行哈希,并检查所有相应位置的位是否都为1。如果是,则该元素可能在集合中(存在一定的误判概率);如果有任何一位为0,则该元素肯定不在集合中。
使用布隆过滤器的私有集合交集(PSI)
-
设置:假设有两个参与方,Alice和Bob,各自拥有自己的元素集合,分别为 ( S_A ) 和 ( S_B )。
-
布隆过滤器创建:
- Alice 从她的集合 ( S_A ) 创建一个布隆过滤器 ( BF_A )。
- Bob 从他的集合 ( S_B ) 创建一个布隆过滤器 ( BF_B )。
-
交换:
- Alice 将她的布隆过滤器 ( BF_A ) 发送给 Bob。
- Bob 将他的布隆过滤器 ( BF_B ) 发送给 Alice。
-
交集计算:
- Alice 检查她的集合 ( S_A ) 中的每个元素是否在 ( BF_B ) 中。如果一个元素的哈希值对应的位置在 ( BF_B ) 中全为1,则该元素被认为在交集中。
- Bob 用他的集合 ( S_B ) 对 ( BF_A ) 做同样的检查。
-
结果:双方现在都有一个元素列表,这些元素可能在 ( S_A ) 和 ( S_B ) 的交集中。
优势和局限
- 效率:布隆过滤器空间效率高,允许快速的成员测试。
- 隐私:该协议不泄露每个集合的实际元素,只揭示交集。
- 误报:布隆过滤器可能产生误报,即一个元素可能看似在交集中但实际上不在。可以通过调整布隆过滤器的大小和哈希函数的数量来降低误报概率。
- 无漏报:如果一个元素在两个集合中,它将总是被正确检测到。
增强措施
为了提高隐私性和减少误报,可以结合其他密码学技术,例如:
- 不经意传输(Oblivious Transfer):确保布隆过滤器的交换不泄露信息。
- 同态加密:允许对加密数据进行操作,进一步增强隐私。
- 安全多方计算(Secure Multi-Party Computation, MPC):可以在不泄露任何额外信息的情况下计算交集。
基于布隆过滤器的PSI在需要保护隐私的数据共享场景中非常实用,例如在组织之间的数据共享,而不损害涉及数据集的机密性。
0-1编码
0-编码和1-编码是一种用于将比较问题(如大于关系)转换为集合交集问题的编码方法。通过这种编码,可以将两个二进制数的比较转化为集合的交集问题,从而简化某些计算问题。以下是对0-编码和1-编码的详细解释:
定义
假设我们有一个长度为 $n$ 的二进制字符串 $s = s_n s_{n-1} \ldots s_1$,其中每个 $s_i$ 都是0或1。
0-编码
0-编码($S^0_s$)是由字符串 $s$ 生成的一个集合,其中包含所有以 $s$ 的前缀加上一个1结尾的字符串,前提是该位置的位是0。
- 形式化定义:
$S^0_s = { s_n s_{n-1} \ldots s_{i+1} 1 \mid s_i = 0, 1 \leq i \leq n }$
1-编码
1-编码($S^1_s$)是由字符串 $s$ 生成的一个集合,其中包含所有以 $s$ 的前缀结尾的字符串,前提是该位置的位是1。
- 形式化定义:
$S^1_s = { s_n s_{n-1} \ldots s_i \mid s_i = 1, 1 \leq i \leq n }$
应用示例
假设有两个二进制数 $x$ 和 $y$,我们希望判断 $x > y$。通过将 $x$ 转换为1-编码 $S^1_x$,将 $y$ 转换为0-编码 $S^0_y$,可以通过检查这两个集合是否有交集来判断大小关系。
示例
-
给定:
$x = 6 = 110_2$
$y = 2 = 010_2$ -
1-编码 $S^1_x$ 的生成:
$x = 110$
$S^1_x = { 1, 11 }$
(因为 $x_3 = 1$ 生成 “1”,$x_2 = 1$ 生成 “11”) -
0-编码 $S^0_y$ 的生成:
$y = 010$
$S^0_y = { 1, 011 }$
(因为 $y_3 = 0$ 生成 “1”,$y_1 = 0$ 生成 “011”) -
交集判断:
$S^1_x \cap S^0_y = { 1 } \neq \emptyset$
因此,$x > y$。
理论证明
-
正向证明:如果 $x > y$,则存在一个位置 $i$ 使得 $x_i = 1$ 且 $y_i = 0$,并且对于所有 $j$,$n \geq j > i$,有 $x_j = y_j$。因此,$x_n x_{n-1} \ldots x_i$ 属于 $S^1_x$,而 $y_n y_{n-1} \ldots y_{i+1} 1$ 属于 $S^0_y$,所以 $S^1_x$ 和 $S^0_y$ 有公共元素。
-
反向证明:如果 $S^1_x \cap S^0_y$ 有公共元素 $t = t_n t_{n-1} \ldots t_i$,则 $t$ 属于 $S^1_x$ 和 $S^0_y$,这意味着 $x_n x_{n-1} \ldots x_i = t_n t_{n-1} \ldots t_i$ 且 $y_n y_{n-1} \ldots y_{i+1} 1 = t_n t_{n-1} \ldots t_i$,因此 $x > y$。
通过这种编码方法,可以有效地将比较问题转化为集合交集问题,利用集合操作的性质来简化计算。
双线性配对(Bilinear Pairing)
双线性配对(Bilinear Pairing)是一种特殊的数学映射,通常出现在基于椭圆曲线的密码学中。在现代密码学中,双线性配对被广泛应用于构建高级加密方案,如基于身份的加密(IBE)、群签名、广播加密等。
1. 双线性配对的定义
设 $G_1$ 和 $G_2$ 是两个加法循环群,阶为 $p$ 的素数,且 $G_T$ 是第三个乘法循环群,阶同样为 $p$。双线性配对 $e$ 是一个映射:
$$[
e: G_1 \times G_2 \to G_T
]$$
这个映射需要满足以下三个性质:
-
双线性(Bilinearity):对任意的 $g_1 \in G_1$、$g_2 \in G_2$,以及任意的整数 $a$、$b$,有:
$[
e(g_1^a, g_2^b) = e(g_1, g_2)^{ab}
]$
其中 $g_1^a$ 表示 $g_1$ 在群 $G_1$ 上的标量乘法运算,$g_2^b$ 表示 $g_2$ 在群 $G_2$ 上的标量乘法运算,$e(g_1, g_2)^{ab}$ 表示 $e(g_1, g_2)$ 在群 $G_T$ 上的幂运算。 -
非退化性(Non-degeneracy):如果 $g_1 \neq 0$ 且 $g_2 \neq 0$,则 $e(g_1, g_2) \neq 1$。换句话说,配对映射是非平凡的,存在 $g_1 \in G_1$、$g_2 \in G_2$ 使得 $e(g_1, g_2) \neq 1$。
-
可计算性(Computability):存在有效的算法可以计算 $e(g_1, g_2)$ 对于任意的 $g_1 \in G_1$ 和 $g_2 \in G_2$。
2. 特殊情况:对称配对
在某些情况下,两个群 $G_1$ 和 $G_2$ 是相同的群,即 $G_1 = G_2$。这种情况下,双线性配对被称为对称配对(Symmetric Pairing):
$$[
e: G_1 \times G_1 \to G_T
]$$
对称配对具有对称性,即对所有的 $g_1, g_2 \in G_1$,有:
$$[
e(g_1, g_2) = e(g_2, g_1)
]$$
3. 常见的配对实现
双线性配对主要通过椭圆曲线上的 Weil 配对或 Tate 配对来实现。这些配对利用椭圆曲线上的群结构和有限域上的运算,能够有效地满足双线性、非退化和可计算性条件。
4. 双线性配对的应用
双线性配对的一个重要应用是在密码学中,特别是高级加密方案中。例如:
- 基于身份的加密(IBE):例如 Boneh-Franklin 基于身份的加密方案。
- 短签名:例如 Boneh-Lynn-Shacham (BLS) 签名方案。
- 聚合签名:多个签名可以合并成一个单一签名。
- 广播加密:允许同时对多个用户进行加密。
5. 双线性配对的例子
假设我们有配对 $e: G_1 \times G_2 \to G_T$,其中 $G_1$ 和 $G_2$ 是阶为 $p$ 的群,$g_1 \in G_1$ 和 $g_2 \in G_2$ 是群的生成元,且 $a$ 和 $b$ 是整数。
示例 1:验证双线性性质
假设我们有一个双线性配对 $e: G_1 \times G_2 \to G_T$,其中:
- $G_1$ 和 $G_2$ 是阶为 $p$ 的群,
- $g_1 \in G_1$ 和 $g_2 \in G_2$ 是群的生成元,
- $a$ 和 $b$ 是整数。
根据双线性配对的性质,我们想验证以下等式:
$$[
e(g_1^a, g_2^b) = e(g_1, g_2)^{ab}.
]$$
步骤 1:应用双线性性质
根据双线性配对的定义,对于 $g_1^a$ 和 $g_2^b$,有:
$$[
e(g_1^a, g_2^b) = e(g_1, g_2)^{ab}.
]$$
这说明配对运算保持了指数相乘的性质。具体来说,首先对 $g_1$ 和 $g_2$ 进行标量乘法运算(在各自的群中),然后再进行配对,这等价于先配对 $g_1$ 和 $g_2$,再对结果做幂运算。
步骤 2:对称性(如果 $G_1 = G_2$)
如果 $G_1 = G_2$,则双线性配对是对称的:对任意 $g_1, g_2 \in G_1$,有
$$[
e(g_1, g_2) = e(g_2, g_1).
]$$
因此,对于对称配对,我们可以验证:
$$[
e(g_1^a, g_2) = e(g_1, g_2^a) = e(g_1, g_2)^a.
]$$
这表明,在对称配对的情况下,交换配对的两个元素不会改变配对的结果。
示例 2:基于双线性配对的 Diffie-Hellman 密钥交换
我们可以使用双线性配对实现一种类似于 Diffie-Hellman 的密钥交换协议。假设 Alice 和 Bob 想通过不安全的信道交换一个共享密钥。
-
公共参数:选择一个双线性配对 $e: G_1 \times G_2 \to G_T$,其中 $G_1$、$G_2$ 是阶为 $p$ 的群,并且 $g_1 \in G_1$ 和 $g_2 \in G_2$ 是群的生成元。
-
密钥生成:
- Alice 选择一个私钥 $a$,并计算 $g_1^a$ 作为她的公钥。
- Bob 选择一个私钥 $b$,并计算 $g_2^b$ 作为他的公钥。
-
交换公钥:
- Alice 将 $g_1^a$ 发送给 Bob。
- Bob 将 $g_2^b$ 发送给 Alice。
-
共享密钥计算:
- Alice 计算共享密钥 $K_A = e(g_2^b, g_1^a) = e(g_2, g_1)^{ab}$。
- Bob 计算共享密钥 $K_B = e(g_2^b, g_1^a) = e(g_1, g_2)^{ab}$。
由于 $e(g_1, g_2) = e(g_2, g_1)$,因此 Alice 和 Bob 计算出的共享密钥是相同的,即 $K_A = K_B = e(g_1, g_2)^{ab}$。
通过这种方式,Alice 和 Bob 可以在不安全的信道上安全地协商出一个共享密钥。
属性加密(ABE)
属性加密(Attribute-Based Encryption, ABE) 是一种基于属性的公钥加密机制。它允许数据加密和解密基于特定的用户属性集合,而不是简单地根据用户的唯一身份。这种加密方式非常适合需要细粒度访问控制的场景,例如云存储中的数据共享、医疗数据保护等。
属性加密的主要特点:
- 基于属性的访问控制:可以根据用户的属性来决定是否允许解密,而不是直接基于用户身份。
- 灵活性:可以通过修改属性策略来动态调整访问权限,而无需重新加密数据。
- 支持细粒度权限管理:能够对复杂的数据访问需求进行精确的控制。
属性加密的两种主要类型:
-
关键字属性加密(Key-Policy Attribute-Based Encryption, KP-ABE):
在KP-ABE中,数据加密时附带一个属性集合,而解密密钥根据访问策略生成。只有当加密数据的属性集合满足解密密钥的访问策略时,用户才能解密数据。 -
密文策略属性加密(Ciphertext-Policy Attribute-Based Encryption, CP-ABE):
在CP-ABE中,数据加密时附带一个访问策略,而解密密钥和用户的属性集合相关。只有当用户的属性集合满足密文中的访问策略时,用户才能解密数据。
1. KP-ABE(关键字策略属性加密)
- 加密:加密时,数据附带属性。比如,属性集合可以是
{"部门:销售", "职位:经理", "区域:北美"}
。 - 解密:解密密钥中包含访问策略。比如,策略可以是 “职位为经理的员工可以解密”。如果加密的数据属性满足解密策略,用户就可以解密。
举例:
假设有一个公司希望加密某个文件,只允许销售部门的经理进行解密。
- 加密数据时的属性集合:
{"部门:销售", "职位:经理"}
- 解密密钥的策略:
"部门为销售" AND "职位为经理"
如果用户的解密密钥包含的属性是 "部门:销售"
和 "职位:经理"
,则用户可以成功解密。
2. CP-ABE(密文策略属性加密)
- 加密:加密时,密文附带一个访问策略。比如,策略可以是
"部门为销售" AND "职位为经理"
。只有当用户的属性集合满足这个策略时,用户才能解密数据。 - 解密:解密密钥中包含的是用户的属性集合。比如,用户的属性可以是
{"部门:销售", "职位:经理", "区域:北美"}
。如果用户的属性符合加密数据的访问策略,就可以解密。
举例:
假设有一个加密文件,只有销售部门的经理才能解密。
- 加密时的访问策略:
"部门为销售" AND "职位为经理"
- 用户的属性集合:
{"部门:销售", "职位:经理", "区域:北美"}
由于用户的属性满足加密时的策略,用户可以解密文件。
典型应用场景和优势
1. 云存储中的数据共享
在云存储场景中,用户可以将加密数据上传到云端,并根据特定条件允许其他用户访问。通过属性加密,文件的所有者可以设置访问策略,只有满足特定属性的用户才能解密数据,从而实现灵活的数据共享和访问控制。
2. 电子健康记录(EHR)保护
在电子健康记录场景中,医疗数据往往需要保护敏感信息,同时允许特定的医疗人员访问。通过属性加密,医疗数据可以加密并附带访问策略(如“医生 AND 心脏科”),只有符合这些条件的医疗人员才能访问相应的健康数据。
3. 细粒度的企业数据访问控制
在企业环境中,属性加密可以用于保护企业内部文件,不同职位、部门的员工可以基于其权限访问不同的敏感信息。例如,某些文件可能只允许高级管理层或特定部门的员工访问。
优势
-
灵活性:可以灵活设置加密数据的访问策略,避免了为每个用户生成不同的密钥。如果访问策略或用户属性发生变化,通常不需要重新加密数据,访问控制的调整非常灵活。
-
细粒度访问控制:可以基于复杂的属性组合来定义访问策略,而不仅仅是简单的身份验证。这对于需要精确控制数据访问权限的场景特别有用,如企业内部不同级别、不同部门的员工访问不同数据。
-
高效的共享机制:在属性加密中,数据可以被加密一次,供多个用户解密,而不需要为每个用户生成单独的密文。这使得它在共享数据的场景下具有较高的效率。
-
可扩展性:属性加密系统可以支持大规模用户场景,即便用户数增多,系统也能高效地进行密钥管理和访问控制。
属性加密的局限性:
-
计算开销:属性加密的加密和解密操作比传统公钥加密系统更复杂,尤其在策略较为复杂时,计算开销会显著增加。对于资源受限的设备(如移动设备),可能会带来性能瓶颈。
-
策略管理复杂:如果系统中有大量的用户和复杂的属性组合,管理访问策略和用户属性可能变得十分复杂,尤其是随着用户和数据量的增加。
-
密钥托管风险:在某些实现中,密钥生成中心(Key Generation Center, KGC)可能会成为单点故障或安全瓶颈。如果该中心被攻击,所有用户的密钥可能会泄露。
总结:
属性加密是一种非常适合细粒度访问控制的加密技术,尤其适用于动态共享数据的场景。它通过基于用户属性的加密方式,实现了数据访问的灵活管理,并且能够有效应对复杂的权限控制需求。虽然其计算和管理开销相对较高,但在云存储、医疗数据保护和企业内部数据管理等场景中,属性加密技术能够提供比传统加密系统更精细的控制能力。
Cuckoo filter
Cuckoo Filter 解释
Cuckoo Filter 是一种高效的数据结构,用于集合成员资格测试,即判断某个元素是否存在于集合中。它与 Bloom Filter 类似,都是 概率型数据结构,可以用较少的空间进行快速查询,但允许一定的误报率(即非成员可能错误地报告为成员)。Cuckoo Filter 相比 Bloom Filter 具有一些优势,如支持元素的删除和动态调整滤器的大小。
Cuckoo Filter 基于 Cuckoo Hashing(布谷鸟哈希),它通过将元素存储在哈希表中并允许元素在多个桶之间移动来解决哈希冲突的问题。
Cuckoo Filter 的工作原理
-
哈希函数和指纹(Fingerprint):每个元素在被插入时,会通过哈希函数生成一个小的指纹(Fingerprint),而不是存储整个元素,这样可以节省空间。
-
两个候选桶:通过哈希函数计算元素对应的两个桶的位置,元素可以被存储在其中任意一个桶里。这样可以提高插入成功的几率。
-
布谷鸟替换:如果两个候选桶都已经满了,Cuckoo Filter 会随机选择一个元素并将其替换到另一个桶(即布谷鸟哈希的替换过程),并尝试将替换出来的元素插入到它的另一个候选桶。如果替换过程失败,则会继续替换,直到找到合适的插入位置,或者超出尝试次数后报告插入失败。
-
查询:查询时只需检查一个元素的两个候选桶中是否存在该元素的指纹即可。
-
删除:Cuckoo Filter 支持删除操作,只需从候选桶中删除对应的指纹即可。
Cuckoo Filter 的优点
- 支持删除操作:不同于 Bloom Filter,Cuckoo Filter 能够支持高效的删除操作。
- 更低的误报率:在相同条件下,Cuckoo Filter 的误报率通常比 Bloom Filter 更低。
- 动态扩展:Cuckoo Filter 支持动态扩展容量,而 Bloom Filter 一旦设置大小就难以调整。
举例说明
假设我们有一个 Cuckoo Filter,用于存储一些用户 ID,并且假设每个用户 ID 通过哈希函数计算出 2 个候选桶。现在我们想插入用户 ID “user123”:
- 对 “user123” 计算哈希值,得到一个指纹和两个桶的位置,比如桶 3 和桶 7。
- 检查桶 3 和桶 7 是否有空位。如果其中一个桶有空位,则将指纹插入该桶。
- 如果两个桶都满了,随机选择一个桶中的元素,将其替换出去,并将替换出的元素尝试插入到它的另一个候选桶。
- 如果经过多次替换仍无法插入,则可以报告插入失败,或者扩展滤器。
查询时,我们只需对 “user123” 计算出指纹,并检查桶 3 和桶 7 是否包含该指纹。
总结
Cuckoo Filter 是一个高效的概率型数据结构,适合用于大规模数据的快速集合查询。它在 Bloom Filter 的基础上引入了支持删除、更低误报率和动态扩展等特性,广泛应用于缓存、网络安全和数据库系统中。
Paillier聚合验证
在问题中,你提到了使用 Paillier加密 来实现 聚合验证 和 零知识证明。Paillier加密是一种加法同态加密方案,能够在不解密密文的情况下对密文执行加法运算。这与双线性对的乘法性质不同,但我们仍然可以利用Paillier加密的同态性质来实现类似的聚合验证。尽管Paillier加密不直接支持双线性对中的乘法性质来构建零知识证明(ZKP),我们可以通过设计巧妙的协议来实现基于Paillier的零知识证明。
1. Paillier加密同态性质
Paillier加密的核心同态性质如下:
- 给定两个明文 $m_1$ 和 $m_2$,它们的加密密文分别为 $E(m_1)$ 和 $E(m_2)$,则:
$$[
E(m_1) \cdot E(m_2) = E(m_1 + m_2)
]$$ - 因此,Paillier加密支持明文的加法同态运算,而密文的乘法对应于明文的加法。
2. 零知识证明的基本概念
零知识证明(ZKP)是一种密码学协议,允许证明者向验证者证明某个陈述的真实性,而不泄露任何关于陈述本身的额外信息。
3. 基于Paillier加密的零知识证明思路
我们可以基于Paillier加密的同态性质,构造一个简单的零知识证明协议,用于展示加密值满足某些约束或聚合条件,而不泄露原始明文。
问题描述
假设你有一组值 $m_1, m_2, \dots, m_n$,你希望证明这些值的总和 $S = m_1 + m_2 + \dots + m_n$ 是某个已知值 $T$,但你不想泄露每个单独值 $m_i$。你可以使用Paillier加密和同态加密的性质来实现这一点。
步骤概述
- 密钥生成:使用Paillier加密生成公私钥对。
- 加密数据:将每个 $m_i$ 加密成密文 $E(m_i)$。
- 聚合验证:利用Paillier加密的加法同态性质,验证加密值的聚合结果是否满足某个约束条件。
- 零知识证明:证明者通过某种方式向验证者证明加密总和等于某个已知值 $T$,而不泄露每个单独的加密值。
4. 详细步骤
步骤 1:密钥生成
首先,使用Paillier加密生成公钥和私钥对:
- 生成一个Paillier公钥 $pk$ 和私钥 $sk$。
- 公钥 $pk$ 将用于加密数据,私钥 $sk$ 将用于解密。
步骤 2:加密数据
对于每个明文 $m_i$,使用Paillier加密函数 $E_{pk}(m_i)$ 对其加密,生成密文 $c_i = E_{pk}(m_i)$。
$$[
c_i = E_{pk}(m_i)
]$$
生成的密文集合为 $ {c_1, c_2, \dots, c_n}$。
步骤 3:聚合验证
利用Paillier加密的加法同态性质,可以在密文域中计算这些密文的聚合结果:
$$[
c_{\text{agg}} = c_1 \cdot c_2 \cdot \dots \cdot c_n = E_{pk}(m_1 + m_2 + \dots + m_n) = E_{pk}(S)
]$$
这里,$c_{\text{agg}}$ 是加密的总和 $S = m_1 + m_2 + \dots + m_n$。
步骤 4:零知识证明的设计
为了证明加密的总和 $S = m_1 + m_2 + \dots + m_n$ 等于某个已知值 $T$,而不泄露每个单独的加密值 $m_i$,我们可以设计一个交互式或非交互式的零知识证明协议。以下是一个简单的交互式零知识证明的思路:
-
证明者:
- 证明者知道各个 $m_i$ 的值,并且能够计算出总和 $S = m_1 + m_2 + \dots + m_n$。
- 证明者将加密的总和 $c_{\text{agg}} = E_{pk}(S)$ 发送给验证者,并声称 $S = T$。
- 证明者还可以选择生成一个随机值 $r$,并将其加密 $E_{pk}®$ 发送给验证者,以增强随机性和不可预测性(用于防止某些攻击)。
-
验证者:
- 验证者知道 $T$,并且可以通过对加密的总和 $c_{\text{agg}}$ 进行解密,得到总和 $S$。
- 验证者使用 Paillier 的私钥 $sk$ 对 $c_{\text{agg}}$ 进行解密:
$$[
S’ = D_{sk}(c_{\text{agg}})
]$$ - 验证者检查 $S’$ 是否等于预期的值 $T$:如果 $S’ = T$,则证明成功。
总结:基于Paillier加密的零知识证明流程
- 密钥生成:证明者和验证者生成Paillier公私钥对。
- 数据加密:证明者对每个 $m_i$ 进行加密,生成密文集合 $c_1, c_2, \dots, c_n$。
- 密文聚合:证明者利用Paillier的加法同态性质,将密文聚合成总和密文 $c_{\text{agg}} = E_{pk}(S)$,并将其发送给验证者。
- 验证过程:
- 证明者声称总和 $S$ 等于某个已知值 $T$。
- 验证者使用私钥 $sk$ 对 $c_{\text{agg}}$ 进行解密,得到 $S’$。
- 验证者检查 $S’$ 是否等于 $T$。
示例
假设证明者希望证明 $m_1 + m_2 + m_3 = 30$,但不希望泄露每个 $m_i$ 的具体值(例如 $m_1 = 10, m_2 = 5, m_3 = 15$)。
- 密钥生成:生成Paillier系统的公钥 $pk$ 和私钥 $sk$。
- 加密数据:证明者计算每个 $m_i$ 的加密:
$$[
c_1 = E_{pk}(10), \quad c_2 = E_{pk}(5), \quad c_3 = E_{pk}(15)
]$$ - 聚合密文:证明者利用Paillier的加法同态性质,计算聚合密文:
$$[
c_{\text{agg}} = c_1 \cdot c_2 \cdot c_3 = E_{pk}(10 + 5 + 15) = E_{pk}(30)
]$$ - 零知识证明:
- 证明者发送 $c_{\text{agg}}$ 给验证者,并声称总和 $S = 30$。
- 验证者用私钥 $sk$ 解密 $c_{\text{agg}}$,得到 $S’$,并验证 $S’ = 30$。
NTRU
NTRU(N-th degree truncated polynomial ring units)是一种基于格的公钥密码体制,由Jeffrey Hoffstein、Jill Pipher和Joseph H. Silverman在1996年提出。NTRU密码体制与RSA、ECC等传统公钥密码体制在安全性基础上有所不同,它基于格的困难问题,因此在面对量子计算机的攻击时,NTRU被认为是抗量子密码体制中的一种。
NTRU密码体制的基本概念
NTRU的核心思想是使用多项式环中的运算构造公钥和私钥,并利用多项式乘法和模运算完成加密和解密。它的安全性依赖于格问题的难度,特别是近似最短向量问题(SVP)和最近向量问题(CVP)。
1. 多项式环
设 $R = \mathbb{Z}[x]/(x^N - 1)$,这个环中的元素是次数不超过 $N-1$ 的整数系数多项式。NTRU密码体制的所有运算都在该多项式环中进行。
2. 参数选择
NTRU密码体制依赖于几个参数:
- $N$:多项式的阶数(即多项式的次数上限)。
- $p$:一个小的整数,通常取2或3,作为消息编码的模数。
- $q$:一个较大的整数,作为密文和密钥的模数。
- $f$ 和 $g$:私钥多项式,满足特定条件。
- $h$:公钥多项式,由私钥生成。
3. 密钥生成
- 选取两个多项式 $f$ 和 $g$,其中 $f$ 是一个可逆多项式(模 $q$ 和模 $p$ 意义下均可逆)。
- 计算 $f_p$ 和 $f_q$,分别为 $f$ 在模 $p$ 和模 $q$ 意义下的逆元:
- $f_p \equiv f^{-1} \mod p$
- $f_q \equiv f^{-1} \mod q$
- 计算公钥 $h$:
$$
h = p \cdot f_q \cdot g \mod q
$$ - 私钥为 $f$ 和 $f_p$,公钥为 $h$。
4. 加密过程
假设要加密的消息为多项式 $m$,首先将消息编码为一个模 $p$ 的多项式。
- 选取一个随机的“遮掩多项式” $r$,其系数较小。
- 计算密文:
$$
e = r \cdot h + m \mod q
$$
其中 $r \cdot h$ 是多项式乘法,结果再模 $q$ 取余。
5. 解密过程
解密者使用私钥 $f$ 来解密密文 $e$:
- 计算:
$$
a = f \cdot e \mod q
$$ - 将 $a$ 转换为一个小系数的多项式(因为 $f \cdot e$ 的结果在模 $q$ 意义下可能很大,需要将其“还原”为接近的原始多项式)。
- 计算:
$$
m’ = f_p \cdot a \mod p
$$
得到解密后的消息 $m’$。
NTRU的安全性
NTRU密码体制的安全性基于格问题的困难性。具体来说,NTRU依赖于找到某类格中的短向量的计算复杂度。由于格问题(如最短向量问题SVP和最近向量问题CVP)在经典和量子计算机上都被认为非常困难,NTRU具有抗量子计算攻击的潜力。
示例
为了让 NTRU 的加密解密过程更清晰易懂,我们下面给出一个具体的例子,使用较小的参数来展示每一步。
参数选择
我们选择如下的参数:
- $N = 3$:多项式环的阶数为 3(即多项式的次数不超过 2)。
- $p = 3$:消息编码的模数。
- $q = 7$:较大的模数,用于密文和密钥运算。
- 私钥多项式 $f = 1 + x$。
- 多项式 $g = 1 + x^2$。
这些参数较小,便于手工计算,方便理解。
1. 密钥生成
计算 $f_p$ 和 $f_q$
-
$f_p$ 是 $f$ 在模 $p = 3$ 下的逆元。
- $f(x) = 1 + x$ 在 $\mathbb{Z}_3$ 上的逆元可以通过扩展欧几里得算法得到。经过计算,得到 $f_p = 1 - x \mod 3$,即 $f_p = 1 + 2x$。
-
$f_q$ 是 $f$ 在模 $q = 7$ 下的逆元。
- 同样,使用扩展欧几里得算法计算 $f_q$,可以得到 $f_q = 4 + 3x \mod 7$(即 $f_q = 4 + 3x$)。
计算公钥 $h$
根据公式 $h = p \cdot f_q \cdot g \mod q$,我们来计算公钥 $h$:
- 首先计算 $f_q \cdot g$:
$$
f_q \cdot g = (4 + 3x) \cdot (1 + x^2) = 4 + 4x^2 + 3x + 3x^3
$$
由于我们在 $\mathbb{Z}[x]/(x^3 - 1)$ 环中运算(因为 $N = 3$),所以 $x^3 = 1$,因此:
$$
f_q \cdot g = 4 + 4x^2 + 3x + 3
$$
$$
= 7 + 3x + 4x^2 \mod 7 = 3x + 4x^2
$$
- 计算 $h = p \cdot (f_q \cdot g) \mod q$:
$$
h = 3 \cdot (3x + 4x^2) = 9x + 12x^2 \mod 7
$$
$$
= 2x + 5x^2
$$
因此,公钥为 $h = 2x + 5x^2$。
2. 加密
假设我们要加密的消息是 $m = x$(消息是用模 $p = 3$ 的多项式编码的)。
随机选取一个“遮掩多项式” $r = 1 + x$。
加密公式为:
$$
e = r \cdot h + m \mod q
$$
首先计算 $r \cdot h$:
$$
r \cdot h = (1 + x) \cdot (2x + 5x^2) = 2x + 5x^2 + 2x^2 + 5x^3
$$
由于 $x^3 = 1$,所以:
$$
r \cdot h = 2x + 7x^2 + 5 = 2x + 0x^2 + 5 \mod 7
$$
然后加上消息 $m = x$:
$$
e = (2x + 5) + x = 3x + 5
$$
因此,密文为 $e = 3x + 5$。
3. 解密
解密者使用私钥 $f = 1 + x$ 来解密密文 $e = 3x + 5$。
首先计算 $f \cdot e \mod q$:
$$
f \cdot e = 3x + 5 + 3x^2 + 5x = 5 + 8x + 3x^2
$$
由于我们在模数 $q = 7$ 下进行运算,所有系数都需要取模 7:
$$
f \cdot e = 5 + (8 \mod 7)x + 3x^2 = 5 + x + 3x^2
$$
因此,得到:
$$
a = 5 + x + 3x^2
$$
减小系数
接下来,我们将 $a$ 中的系数转换为较小的值,使其落在 $[-\frac{q}{2}, \frac{q}{2}] = [-3.5, 3.5]$ 的范围内。具体来说,需要将系数大于 3.5 的部分减去 7(模 7),以使其变成较小的负数:
- $5$ 转换为 $5 - 7 = -2$;
- $1$ 保持不变;
- $3$ 保持不变。
因此,得到:
$$
a = -2 + x + 3x^2
$$
解码消息
现在我们需要用 $f_p$ 来解码消息。我们之前已经计算出 $f_p = 1 + 2x$(即 $f$ 的模 $p = 3$ 的逆元)。接下来,计算 $m’ = f_p \cdot a \mod p$:
$$
m’ = (1 + 2x) \cdot (-2 + x + 3x^2)
$$
进行多项式乘法:
$$
m’ = (1 \cdot -2) + (1 \cdot x) + (1 \cdot 3x^2) + (2x \cdot -2) + (2x \cdot x) + (2x \cdot 3x^2)
$$
$$
= -2 + x + 3x^2 - 4x + 2x^2 + 6x^3
$$
$$
= -2 - 3x + 5x^2 + 6x^3
$$
由于 $N = 3$,在多项式环 $\mathbb{Z}[x]/(x^3 - 1)$ 中,$x^3 = 1$:
$$
m’ = -2 - 3x + 5x^2 + 6 = 4 - 3x + 5x^2 \mod 3
$$
接下来,我们进行模 3 运算:
$$
m’ = (4 \mod 3) + (-3 \mod 3)x + (5 \mod 3)x^2 = 1 + 0x + 2x^2
$$
因此,得到 $m’ = 1 + 2x^2$。这就是解密后的多项式。
4. 消息还原
我们对比原始消息 $m = x$ 和解密后的多项式 $m’ = 1 + 2x^2$。虽然 $m’$ 和 $m$ 不一样,但由于 NTRU 的解密过程中存在近似计算的性质,正确解密需要进一步处理小误差。
通过手工调整系数(在某些情况下可能需要额外的后处理),我们可以还原出原始消息 $m = x$。
总结
通过这个示例,我们可以看到 NTRU 的加密和解密过程的基本步骤:
- 密钥生成:使用私钥 $f$ 和 $g$ 生成公钥 $h$,其中涉及多项式的模运算。
- 加密:加密者使用公钥 $h$ 和随机遮掩多项式 $r$ 对消息 $m$ 进行加密,生成密文 $e$。
- 解密:解密者使用私钥 $f$ 和 $f_p$ 解密密文 $e$,并通过多项式运算恢复原始消息 $m$。
NTRU 的安全性基于格问题,这使得它在面对量子计算攻击时具有潜在的抗攻击能力。
BBS Group Signature
BBS Group Signature是一种密码学中的群签名方案,由Boneh, Boyen和Shacham在2004年提出。群签名允许一个群体中的任何成员代表整个群体进行签名,但保持签名者的身份匿名。BBS Group Signature特别适合于需要隐私和匿名性的场合,如电子投票、匿名认证等。
BBS Group Signature的基本构成
-
群设置(Group Setup):
- 由一个可信的群管理者生成系统参数,包括一个双线性对的群。
- 生成公钥和私钥对。公钥是公开的,群成员使用它来验证签名。私钥用于生成签名。
-
群成员加入(Join):
- 群管理者为每个加入的成员分配一个私钥,通常是通过安全的加入协议来完成。
- 成员私钥是成员身份的凭证。
-
签名生成(Sign):
- 群成员使用自己的私钥对消息进行签名。
- 签名可以被验证为来自该群体,但不会泄露具体的签名者身份。
-
签名验证(Verify):
- 验证者使用群的公钥来验证签名的有效性。
- 验证成功则表明签名确实来自群体中的某一成员。
-
身份开示(Open):
- 在必要时,群管理者有能力揭示签名者的身份。
- 这种功能通常用于追踪恶意行为者。
示例过程
假设有一个群体用于匿名投票,群体中的每个成员都可以对候选人进行签名投票。
1. 群设置
- 一个双线性群 $G$ 和一个配对 $e: G \times G \rightarrow G_T$ 被选定。
- 生成公钥 $PK$ 和私钥 $SK$。
- 公钥 $PK$ 包含群的生成元和其他必需的系统参数。
2. 群成员加入
- 新成员 $A$ 想加入群体。
- 群管理者运行协议,生成成员私钥 $sk_A$ 并安全地分发给 $A$。
3. 签名生成
- 成员 $A$ 想对消息 $M$ 进行签名。
- $A$ 使用其私钥 $sk_A$ 生成签名 $\sigma$。
4. 签名验证
- 验证者收到签名 $\sigma$ 和消息 $M$。
- 使用公钥 $PK$ 验证 $\sigma$ 是否有效,验证成功则说明签名来自群体中的某一成员。
5. 身份开示
- 如果需要知道签名者身份,群管理者可以使用其密钥来揭示 $\sigma$ 的签名者 $A$。
安全和隐私特性
- 匿名性:签名不透露具体签名者的身份。
- 不可伪造性:只有群体成员才能生成有效签名。
- 可追踪性:群管理者可以揭示签名者身份,用于防止滥用。
BBS Group Signature 由于其提供的匿名性和可追溯性,广泛应用于需要隐私保护的应用场合,如数字货币、电子投票系统等。
Pedersen Commitment Scheme
Pedersen 承诺方案 (Pedersen Commitment Scheme) 是一种基于离散对数假设的密码学承诺方案,它具有信息论隐藏性和计算绑定性的特性。这意味着承诺方无法通过承诺泄露任何信息(隐藏性),同时一旦承诺某个值,就无法在事后更改该值(绑定性)。
基本概念
设定如下参数:
- 一个大素数 $p$ 和一个大素数 $q$(通常 $q$ 是 $p - 1$ 的因子),使得在有限域 $\mathbb{Z}_p^*$ 中存在阶为 $q$ 的循环群。
- 群生成元 $g$ 和 $h$,其中 $g$、$h$ 是 $\mathbb{Z}_p^*$ 中的元素,且 $h$ 是独立于 $g$ 的随机生成元(即 $h$ 不应该是 $g$ 的幂,否则绑定性可能会失效)。
1. 承诺阶段(Commitment Phase)
承诺方希望承诺一个值 $m \in \mathbb{Z}_q$,具体步骤如下:
- 承诺方选择一个随机数 $r \in \mathbb{Z}_q$ 作为承诺的随机性。
- 计算承诺值为:
$$[
C = g^m h^r \mod p
]$$
这里 $C$ 即为公开的承诺值。
2. 揭示阶段(Reveal Phase)
当承诺方希望揭示承诺的值时,它公开 $m$ 和 $r$,验证方可以通过以下步骤验证:
验证方计算 $g^m h^r \mod p$,并检查其是否等于公开的承诺值 $C$。如果相等,则承诺有效。
安全性分析
1. 隐藏性(Hiding)
Pedersen 承诺方案具有信息论上的隐藏性。由于承诺值中包含了随机数 $r$,即使知道了 $C = g^m h^r$,验证方也无法确定 $m$ 的具体值,因为随机数 $r$ 的存在使得 $C$ 的分布对于每个 $m$ 都是均匀的。因此,对于任何给定的承诺值 $C$,验证方无法从中推断出 $m$。
2. 绑定性(Binding)
Pedersen 承诺方案的绑定性是基于离散对数假设的。如果承诺方能够找到两个不同的值 $m$ 和 $m’$ 以及对应的随机数 $r$ 和 $r’$,使得:
$$[
g^m h^r = g^{m’} h^{r’}
]$$
则可以通过求解离散对数问题来破坏绑定性。具体来说,若 $g^m h^r = g^{m’} h^{r’}$,则有:
$$[
g^{m - m’} = h^{r’ - r}
]$$
由于 $g$ 和 $h$ 是独立生成的,离散对数问题难解,因此承诺方无法找到不同的 $m$ 和 $m’$,从而保障了绑定性。
举例说明
假设我们选择如下参数:
- $p = 23$
- $q = 11$(因为 $11$ 是 $23 - 1 = 22$ 的因子)
- $g = 2$
- $h = 3$
现在,Alice 想要承诺一个值 $m = 5$。
-
承诺阶段:
- Alice 随机选择一个 $r = 7$。
- 计算承诺值:
$$[
C = g^m h^r \mod p = 2^5 \cdot 3^7 \mod 23
]$$
计算得到:
$$[
2^5 = 32 \mod 23 = 9
]$$
$$[
3^7 = 2187 \mod 23 = 1
]$$
所以:
$$[
C = 9 \cdot 1 \mod 23 = 9
]$$
因此,Alice 的承诺值为 $C = 9$。
-
揭示阶段:
- Alice 公开承诺值 $m = 5$ 和随机数 $r = 7$。
- Bob 进行验证,计算 $g^m h^r \mod p$:
$$[
g^m = 2^5 = 32 \mod 23 = 9
]$$
$$[
h^r = 3^7 = 2187 \mod 23 = 1
]$$
因此:
$$[
g^m h^r = 9 \cdot 1 \mod 23 = 9
]$$ - 由于验证得出的值 $9$ 等于 Alice 的承诺值 $C = 9$,因此验证通过,Bob 确认 Alice 的承诺值是 $m = 5$。
总结
Pedersen 承诺方案是一个非常实用的承诺方案,它结合了信息论隐藏性和计算绑定性,适用于很多密码学应用场景,比如零知识证明、数字货币等。通过选择合适的参数,可以确保承诺的安全性,即使在强大的计算能力下,也难以破解该方案的隐藏性或绑定性.
Truth Discovery
真相发现(Truth Discovery)是一种从多个数据源中提取最准确信息的方法,尤其适用于处理数据来源可靠性不一的情况,比如在车队服务推荐系统中评估车辆的声誉。真相发现过程包括两个关键阶段:权重更新和真相更新。以下是每个阶段的详细解释,并附有示例来说明这个过程。
真相发现的关键阶段
-
权重更新:
- 目标: 评估每个数据源(在这种情况下,每辆车)的可靠性,并更新它们的权重。
- 过程:
- 每辆车提供关于多个对象(如其他车辆、驾驶条件)的反馈数据。
- 根据每辆车的反馈与当前估计的真相之间的接近程度,分配一个权重($( \omega_n )$)。
- 权重通过一个对数公式计算,该公式考虑了距离函数 $( d(\cdot) )$,用于衡量车辆反馈与当前估计真相之间的差异。
- 反馈更接近估计真相的车辆将被分配更高的权重。
-
真相更新:
- 目标: 根据所有车辆的加权反馈细化估计的真相。
- 过程:
- 使用在前一阶段计算的权重,更新每个对象的真相。
- 更新后的真相 ($( f^*_m )$) 是所有车辆反馈的加权平均值,其中权重反映了车辆的可靠性。
- 这一过程确保更可靠车辆的反馈对最终的真相估计有更大的影响。
示例
考虑一个场景,三辆车(A、B、C)提供了关于第四辆车速度的反馈,报告的速度如下:
- 车辆 A: 报告 60 km/h
- 车辆 B: 报告 65 km/h
- 车辆 C: 报告 70 km/h
初始设置:
假设初始估计的真相速度为 65 km/h。
步骤 1:权重更新
-
距离函数: 假设 $( d(x) = |x| )$。因此,各车辆报告与初始真相的距离为:
- A:$( |60 - 65| = 5 )$
- B:$( |65 - 65| = 0 )$
- C:$( |70 - 65| = 5 )$
-
权重计算:
- 对于 A: $\omega_n = \log \left( \frac{ \sum_{m=1}^M d\left( f_{mn} - f_m^* \right) }{ \sum_{n=1}^N \sum_{m=1}^M d\left( f_{mn} - f_m^* \right) } \right )$
- 同样地,计算 B 和 C 的权重,注意 B 的权重会更高,因为其距离为 0。
假设计算后结果为:
- $( \omega_A = 0.3 )$
- $( \omega_B = 0.5 )$
- $( \omega_C = 0.2 )$
步骤 2:真相更新
- 计算新的真相:
- $( f^*_m = \frac{(0.3 \times 60) + (0.5 \times 65) + (0.2 \times 70)}{0.3 + 0.5 + 0.2} )$
- $( f^*_m = \frac{18 + 32.5 + 14}{1} = 64.5 )$
真相更新为 64.5 km/h。这个过程会反复进行,更新权重和真相估计,直到收敛。
结论
通过这个迭代过程,真相发现能够有效地识别最准确的数据,利用不同来源的可靠性。在我们的示例中,车辆 B 的反馈最接近初始真相估计,因此对更新的真相影响最大。这种机制确保最终的真相反映出可用的最可靠信息,这对于像评估车队中车辆的声誉和可靠性这样的应用至关重要。
Accumulator
Accumulator详述
Accumulator(累加器)是密码学中的一种基础原语,它允许用户证明某个特定值属于一个集合,而不需要公开整个集合。这种机制在提升隐私性、数据完整性和系统效率方面具有重要意义,特别是在区块链技术、隐私保护协议和数字签名等领域。Accumulator通过一系列算法(如设置、累加、生成见证和验证)来实现这些功能。
以Camenisch和Lysyanskaya提出的基于强RSA假设的累加器为例,这种累加器可以证明某个交易是否属于一个区块。该累加器方案由四个基本算法组成:
-
$Setup(\lambda) → (N, u)$:此算法由一个可信方执行,生成公钥参数$ (N, u) $,其中$ N $是一个大整数,通常是两个大素数的积,$ u $是一个基于安全参数$\lambda$的生成元。这个算法只需要在系统初始化时执行一次,系统在其整个生命周期中都使用这些参数。
-
$Accumulate(X, (N, u)) → Acc$:此算法由支付方运行,输入一个包含元素的集合$ X = {x_1, x_2, …, x_n} $和公钥参数$ (N, u) $,计算并输出累加器值$ Acc $。累加器可以看作是对集合$ X $的某种压缩,最终生成一个固定大小的值$ Acc $,该值代表整个集合。
-
$GenWitness(X, (N, u), v = x_i) → wit$:此算法由支付方运行,输入集合$ X $、公钥参数$ (N, u) $和待证明的元素$ v = x_i $,生成一个见证值$ wit $,该见证值表明$ x_i $确实属于集合$ X $。
-
$Verify((N, u), wit, Acc, v = x_i) → {0, 1}$:此算法由验证方运行,输入累加器$ Acc $、见证值$ wit $、公钥参数$ (N, u) $和待验证的元素$ v = x_i $。如果验证通过,即$ x_i $属于集合$ X $,则输出1,否则输出0。
Accumulator方案举例
假设我们要证明某个交易$ tx_i $是某个区块$ B $中的一部分。我们可以使用累加器来生成和验证这类证明。
-
$Setup(\lambda)$:首先,我们选择一个安全参数$\lambda$,然后执行$ Setup(\lambda) $生成公钥参数$ (N, u) $。例如,我们选择$\lambda = 2048$位的RSA模数$ N $和生成元$ u $作为系统的公钥。
-
$Accumulate(X, (N, u))$:假设区块$ B $包含一组交易$ X = {tx_1, tx_2, …, tx_n} $。我们执行累加算法,生成累加器值$ Acc $,该值可以被视为区块$ B $中所有交易的压缩表示。
-
$GenWitness(X, (N, u), tx_i) → wit$:接下来,假设我们希望证明交易$ tx_i $属于区块$ B $,我们通过运行$ GenWitness(X, (N, u), tx_i) $生成一个见证值$ wit $,该见证值可以用来证明$ tx_i $确实是区块$ B $中的一个交易。
-
$Verify((N, u), wit, Acc, tx_i) → {0, 1}$:验证方收到累加器值$ Acc $、见证值$ wit $和交易$ tx_i $,然后通过运行$ Verify((N, u), wit, Acc, tx_i) $来验证$ tx_i $是否属于区块$ B $。如果验证通过,输出1,否则输出0。