公钥可搜索加密-双线性对

27 篇文章 7 订阅
19 篇文章 2 订阅

  我们将大数据存储在云服务器上,为了保护数据隐私,通常会选择先将数据加密后再上传。可搜索加密(Searchable Encryption)研究如何在密文上进行关键字搜索,分为对称可搜索加密(Searchable Symmetric Encryption)和公钥可搜索加密(Public-key Encryption with Keyword Search,PEKS)。

       虽然对称可搜索加密比较快,但在多用户数据共享方面,公钥可搜索加密的应用场景比对称可搜索加密更为广阔。双线性对(Bilinear Pairing)作为构造PEKS的常用工具,本文将贴出其相应开源函数库Pairing-based cryptography library (pbc library,链接)的python版本示例(pypbc), 目标是方便大家在做学术研究工程实验时能够对pypbc进行快速入门。 (注: 本文代码以2004年Boneh等人的方案为示例,仅面向研究人员,入门请结合该论文方案;因方案不能抵抗关键字猜测攻击,不保证商用安全性)

 

实验环境

       pypbc 基于GMP PBC,安装可以参考64位Ubuntu14.04下配置PBC环境一文。先给出完整依赖关系,pbc依赖gmp,gmp依赖M4,bison,flex,我们先安装M4、flex和bison。

 
  1. sudo apt-get install M4

  2. sudo apt-get install flex

  3. sudo apt-get install bison

安装gmp,下载https://gmplib.org/ ,转到下载目录运行如下命令。

 
  1. lzip -d gmp-6.1.0.tar.lz

  2. tar -zxvf gmp-6.1.0.tar

  3. cd gmp-6.1.0

  4.  
  5. ./configure

  6. make

  7. make check

  8. sudo make install

接下来安装pbc, 下载https://crypto.stanford.edu/pbc/download.html ,转到下载目录运行如下命令。

 
  1. tar -zxvf pbc-0.5.14.tar.gz

  2. cd pbc-0.5.14

  3.  
  4. ./configure

  5. make

  6. sudo make install

因为pypbc是用python3 语言,我们先安装python3和pip3。

 
  1. sudo apt-get install python3

  2. sudo apt-get install python3-pip

我们运行如下命令,从GitHub上下载pypbc代码。

git clone https://github.com/debatem1/pypbc

转到下载目录,运行如下代码,具体过程我不太记得了,请参考pypbc/INSTALL文件里的描述。

 
  1. sudo python3 setup.py install

  2. sudo pip3 install pypbc

 

Pypbc代码

       代码请结合2004年Boneh的论文方案来阅读,其中[params, g]公共参数,近来我在看学术论文时经常看到公共参数生成算法,该算法返回公共参数pp,pp作为方案其余各算法的隐含输入,这样写法是为了结合工程习惯。Pbc library公共参数生成算法中的qbits和rbits用法具体请阅读官方文档

 
  1. Generate type A pairing parameters and store them in p, where the

  2. group order r is rbits long, and the order of the base field q is

  3. qbits long. Elements take qbits to represent.

我对这块不熟悉,参数是根据官方示例设置的(再次强调代码示例不保证商用安全性)。

 
  1. #coding=utf-8

  2.  
  3. from pypbc import *

  4. import hashlib

  5.  
  6. Hash1 = hashlib.sha256

  7. Hash2 = hashlib.sha256

  8.  
  9. # 公钥可搜索加密-2004-Boneh

  10.  
  11.  
  12. # 密钥生成算法,输入安全参数qbits和rbits,返回[params, g, pk, sk]

  13. def KeyGen(qbits=512, rbits=160):

  14. params = Parameters(qbits=qbits, rbits=rbits)

  15. pairing = Pairing(params)

  16. g = Element.random(pairing, G2)

  17. sk = Element.random(pairing, Zr)

  18. pk = Element(pairing, G2, value = g ** sk)

  19. return [params, g, sk, pk]

  20.  
  21.  
  22. # PEKS算法,输入公共参数[params, g],公钥pk,关键字word,返回[A, B] (具体参考论文)

  23. def PEKS(params, g, pk, word):

  24. pairing = Pairing(params)

  25. hash_value = Element.from_hash(pairing, G1, Hash1(str(word).encode('utf-8')).hexdigest())

  26. r = Element.random(pairing, Zr)

  27. temp = pairing.apply(hash_value, pk ** r)

  28. return [g ** r, Hash2(str(temp).encode('utf-8')).hexdigest()]

  29.  
  30.  
  31. # 陷门生成算法,输入公共参数[params],私钥sk,待查关键字word,返回陷门td

  32. def Trapdoor(params, sk, word):

  33. pairing = Pairing(params)

  34. hash_value = Element.from_hash(pairing, G1, Hash1(str(word).encode('utf-8')).hexdigest())

  35. return hash_value ** sk

  36.  
  37.  
  38. # 测试算法,输入公共参数[params],公钥pk,S=[A, B],陷门td,返回布尔值True/False

  39. def Test(params, pk, cipher, td):

  40. pairing = Pairing(params)

  41. [A, B] = cipher

  42. td = Element(pairing, G1, value=str(td))

  43. temp = pairing.apply(td, A)

  44. temp = Hash2(str(temp).encode('utf-8')).hexdigest()

  45. return temp == B

 

测试代码

 
  1. if __name__ == '__main__':

  2. [params, g, sk, pk] = KeyGen(512, 160)

  3. cipher = PEKS(params, g, pk, "GQW")

  4. td = Trapdoor(params, sk, "GQW")

  5. assert(Test(params, pk, cipher, td))

  6. td = Trapdoor(params, sk, "GQK")

  7. assert(not Test(params, pk, cipher, td))

 

官方示例

pypbc的详细用法请参考官方示例(链接),测试代码中给出了BLS签名实现。共勉,愿科研人员前途似锦!

 

Acknowledgements

The main author of the PBC library is Ben Lynn.

Thanks to the many others who have contributed, including Hovav Shacham, Matt Steiner, Joe Cooley, Rob Figueiredo, Roger Khazan, Dmitry Kosolapov, John BethencourtPaul Miller, Michael Cheng, Ian Goldberg, Adam Aviv, Adam McLaurin, and Michael Adjedj.

 

Reference

64位Ubuntu14.04下配置PBC环境

Pypbc的GitHub地址

https://crypto.stanford.edu/pbc/download.html

Dan B, Crescenzo G D, Ostrovsky R, et al. Public Key Encryption with Keyword Search[C]// International Conference on the Theory and Applications of Cryptographic Techniques. 2004.

转载于:https://blog.csdn.net/weixin_34318272/article/details/91811741

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 公钥搜索加密是一种保护隐私的加密技术,可以在不暴露明文的情况下,对加密数据进行搜索和匹配。实现公钥搜索加密的代码需要使用一些加密算法和数据结构,如RSA加密算法、Bloom Filter等。具体实现方法可以参考相关的论文和开源代码。 ### 回答2: 公钥搜索加密(Public Key Searchable Encryption)是一种安全的加密方案,它可以在保证数据安全的同时,允许用户在加密数据中进行搜索操作。 实现公钥搜索加密的代码需要考虑以下几个方面。 首先,需要使用公钥加密算法,如RSA或椭圆曲线加密算法,生成公钥和私钥对。公钥用于加密搜索关键字,私钥用于解密搜索结果。 其次,需要考虑如何将搜索关键字加密后存储在数据中。可以使用加密哈希函数对搜索关键字进行加密,并将其与其他数据一起存储。加密哈希函数将关键字映射为固定长度的密文,保证了数据的安全性。 然后,需要实现一个搜索功能,使用户可以输入搜索关键字,并根据关键字对加密数据进行搜索。在搜索功能中,用户输入的搜索关键字需要先使用公钥加密算法加密,然后与数据中存储的加密关键字进行匹配。匹配成功后,使用私钥解密搜索结果,返回解密后的数据。 最后,需要考虑数据的访问控制。只有拥有私钥的用户才能解密搜索结果,其他人无法获取明文数据。因此,代码中需要实现访问控制机制,确保数据的安全性。 总结来说,公钥搜索加密的实现代码主要包括公钥加密算法的生成、搜索关键字的加密和存储、搜索功能的实现、搜索结果的解密以及数据的访问控制。这些代码的实现可以保证数据的安全性,并允许用户在加密数据中进行搜索操作。 ### 回答3: 公钥搜索加密(Public Key Encryption with Keyword Search, PEKS)是一种能够实现关键字搜索加密算法。在传统的公钥加密算法中,加密和解密是基于公钥和私钥的,只能通过私钥来进行解密操作。但是,当我们需要在大量加密数据中搜索包含特定关键字的文件时,传统的公钥加密算法就显得不太适用了。 公钥搜索加密算法通过引入一个陷门(trapdoor)的概念,能够实现在加密状态下进行关键字搜索。陷门是由用户的私钥生成的,用于加密指定的关键字。通过陷门,用户可以在不暴露私钥的情况下,在加密的数据集合中查询包含特定关键字的文件。 实现公钥搜索加密的代码通常由以下几个步骤组成: 1. 密钥生成:生成公钥和私钥对,公钥用于加密,私钥用于生成陷门。 2. 数据加密:将需要进行搜索的数据进行加密,并存储到云服务器或其他数据存储设备中。 3. 陷门生成:用户通过私钥生成陷门,将需要搜索的关键字加密成陷门的形式。 4. 关键字搜索:用户将生成的陷门发送到云服务器上,云服务器根据陷门与加密数据进行匹配,找出含有关键字的加密文件,并将其返回给用户。 需要注意的是,公钥搜索加密算法并不直接泄露私钥,因此仍然能够保证用户的数据安全性。同时,为了提高搜索效率,通常会引入一些优化算法,例如倒排索引等。 公钥搜索加密代码的实现需要理解公钥加密算法的基本原理,并结合关键字搜索的需求进行具体设计。近年来,该算法已经被广泛应用于云计算和数据隐私保护等领域,为数据安全和高效搜索提供了解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值