pypbc的使用与一个密码方案的实现
一、pypbc的安装
具体的安装过程可以见文章安装点这里。
讲一点自己的感受:安装其实比较简单,但对于不常使用linux的人来说,多少有一点困难,我是在deepin系统里安装的,但其实还是建议安装在ubuntu下;安装gmp、pbc等必须的依赖包的时候,可以先下载,再解压,然后运行什么./configure、make、make check、make install等相关操作,这个并不难,不过,我现在依然不是很熟练,慢慢来,总会安装好的。最近又试了一下在ubuntu下安装,好像是得输入sudo ldconfig才会安装成功。
二、包的相关情况
简单的使用可以参见github上的test.py文档。里面对于双线性对操作的几个函数如何使用演示的比较详细,耐心的一点,会看懂的。
可以进行如下操作,查看包的帮助信息,内容很全很多。
打开终端输入:python3
而后引入包:import pypbc
最后输入:help(pypbc)
在pypbc包中,有三种对象:Element,Pairing,Parameters。我们按照使用顺序来简单介绍一下。
1、初始化
首先,要对参数进行初始化,设定使用什么样的曲线,在pbc当中实现了好几种,有a.param,b.param……,在pbc里面,注意,不是在pypbc,是安装pbc的时候下载的pbc的包里面有一个param的文件夹,可以打开看看,就是一堆字母数字,都是格式化的东西。具体使用的时候有三种参数初始化的方式:
| Parameters(param_string=s) -> a set of parameters built according to s.
| Parameters(n=x, short=True/False) -> a type A1 or F curve.
| Parameters(qbits=q, rbits=r, short=True/False) -> type A or E curve.
这些参数如何设置,请参照pbc的使用文档,这对我来说有点难,不过并不妨碍使用。
例1:
#随机取两个256位的素数
q_1 = get_random_prime(256)
q_2 = get_random_prime(256)
#使用的是pbc中的a1_param参数,详见pbc_manul手册中的说明
params = Parameters( n = q_1 * q_2 )
#实例化双线性对对象,也就是经常表示的e(a,b),先这么理解吧。
pairing = Pairing( params )
这就基本完成了初始化了。
例2:
#这里的内容就可以换成pbc中param文件夹下的几种曲线参数了,但是“”“是要保留的哦。
stored_params = """type a
q 8780710799663312522437781984754049815806883199414208211028653399266475630880222957078625179422662221423155858769582317459277713367317481324925129998224791
h 12016012264891146079388821366740534204802954401251311822919615131047207289359704531102844802183906537786776
r 730750818665451621361119245571504901405976559617
exp2 159
exp1 107
sign1 1
sign0 1
"""
params = Parameters(param_string=stored_params) # type a
pairing = Pairing(params)
例3:
params = Parameters(qbits=512, rbits=160) # type a
pairing = Pairing(params)
2、函数介绍
初始化完成后,就可以做运算了,对我用到的几个函数或操作介绍一下。
先说一下,在上面提到了pypbc包的三个对象的两个,其实最重要的是Element,但大多数的操作也都与之相关,就放到这讲了;当然还有什么G1,G2,GT,Zr等相关知识,自行学习吧,我要实现的方案是基于对称的双线性群,所以并没有了解相关的非对称双线性群相关情况,也不多介绍。
#从G2中取一个随机数,并初始化一个元素,一般是取g的,也就是生成元。
g = Element.random( pairing, G2 )
#初始化一个GT元素
a = Element( pairing, GT )
#初始化一个G2元素
b = Element( pairing, G2 )
#初始化一个Zr元素
c = Element( pairing, Zr )
#初始化一个GT中的元素并置为1
Element.one( pairing, GT )
#初始化一个Zr中的元素并置为0
Element.zero( pairing, Zr )
#希望使用过程中元素的运算或赋值都使用这样的方式来进行,pairing是一定要写的,G2代表返回值的类型,
#value=就是值等于多少,也是一定要写的,G2中的元素做底数,Zr中的元素做指数,这个千万不能错。
#其实也能使用b = g ** c是同样的效果,但下面这样写更加工整,看着更明白,减少出错。
b = Element( pairing, G2, value = g ** c ) #b = g^c
注意,对运算就不能像上面那样了,得这样算,a = e(g,g)&#