我是靠谱客的博主 大方水杯,最近开发中收集的这篇文章主要介绍JPBC库的使用--双线性配对,ECC加密1. 主要参数2. 双线性配对3. ECC加密4. 注意事项,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

JPBC简介

JPBC库是ABE加密以及椭圆曲线加密等常用的加密库。下载地址:http://gas.dia.unisa.it/projects/jpbc/index.html#.VTDrLSOl_Cw

1. 主要参数

a. 主要使用的椭圆曲线为TypeA型素数阶椭圆曲线,y² = x³ + x 参数如下:

public static String curveParams = "type an"
		+ "q 87807107996633125224377819847540498158068831994142082"
		+ "1102865339926647563088022295707862517942266222142315585"
		+ "8769582317459277713367317481324925129998224791n"
		+ "h 12016012264891146079388821366740534204802954401251311"
		+ "822919615131047207289359704531102844802183906537786776n"
		+ "r 730750818665451621361119245571504901405976559617n"
		+ "exp2 159n" + "exp1 107n" + "sign1 1n" + "sign0 1n";

TypeA1型为合数阶椭圆曲线,使用较少。

b.一般随机选择元素为从G1,G2,Gt以及Zp域选择,具体选择如下。

public Cpabe(String param){
	this.pp = new PP();
	this.mk = new MK();
	PairingParameters params = new PropertiesParameters().load(new ByteArrayInputStream(param.getBytes()));
	this.pp.p = PairingFactory.getPairing(params);
	this.pp.g = this.pp.p.getG1().newRandomElement();//从G1域随机选取元素
	
	//构造主密钥参数
	this.mk.beta = this.pp.p.getZr().newRandomElement();
	this.mk.g_alpha = this.pp.g.duplicate().powZn(this.pp.p.getZr().newRandomElement());
	
	//构造公钥参数
	this.pp.h = this.pp.g.duplicate().powZn(this.mk.beta);
	this.pp.y = this.pp.p.pairing(this.pp.g, this.mk.g_alpha);//双线性配对操作
}

c. JPBC库的基本元素为Element,有newElement方法,可以从byte构造Element元素。

2. 双线性配对

双线性配对基于DBDH假设,在密码学有很广泛的应用,与基于离散对数难解性的指数运算加密相比,具有更高的效率。在我的实验过程中,双线性配对操作为1ms,进行一次底数为1024为G1域上的元素,指数为160为Zp域的指数运算用时为13ms左右,双线性配对效率更高。
在这里插入图片描述
双线性配对操作主要代码

this.pp.y = this.pp.p.pairing(this.pp.g, this.mk.g_alpha);//双线性配对操作,通过pairing来进行

在ABE中,一般设定G1域和G2域为相等的域,将G1域和G2域的元素映射到Gt域。

3. ECC加密

ECC安全基础为一般群模型,即在计算K=kG过程中,知道k和G很容易计算K,但是在知道K的情况下很难得到k。(这一小节使用的椭圆曲线为y² = x³ + x)
椭圆曲线加密一般使用的为GF§域上的安全椭圆曲线y² = x³ + ax + b,设定好椭圆曲线参数,直接进行运算
  现在我们描述一个利用椭圆曲线进行加密通信的过程:
  
1、ALice选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G,G是系统公开参数
  在设定好安全椭圆曲线的前提下,随机选取元素作为生成元即可。

		Element G = cpabe.pp.p.getGT().newRandomElement(); //基点

2、Alice选择一个私有密钥k,并生成公开密钥K=kG。
  这里为使用大整数作为私钥

       
		Random random1=new Random();
		BigInteger SK1= new BigInteger(160, random1);//大整数作为私钥1
		//Element SK1 = cpabe.pp.p.getZr().newRandomElement(); //以Zp域随机元素作为私钥
		//System.out.println(SK1);
		//Date d1 = new Date();
		Element PK1=G.duplicate().mul(SK1);//公钥1

3、Alice将Ep(a,b)和点K,G传给用户B。公开参数
  4、Bob接到信息后 ,将待传输的明文m进行加密。这里m为随机选取的一个Element

Element encRc1 = m.duplicate().add(PK1.duplicate.mu.(r));//加密
Element encRc2 = G.duplicate().mul(r);

5、Bob将encRc1,encRc2传给用户A。
6、用户A接到信息后,计算encRc1-kencRc2,结果就是点m。
因为encRc1-kencRc2=m+rK-k(rG)=m+rK-r(kG)=m 。

4. 注意事项

         **在所有的代码过程中需要注意Element.duplicate()方法**

在这里插入图片描述
如上图所示,可以看到无论是乘法运算,还是指数运算,最终结果均为同一点。
在这里插入图片描述
如果加入Element.duplicate()方法,则结果为正确结果。这是因为Element本身的因素,加入duplicate()方法之后,相当于对Element本身加入一个复制,在计算时不会覆盖本身。

最后

以上就是大方水杯为你收集整理的JPBC库的使用--双线性配对,ECC加密1. 主要参数2. 双线性配对3. ECC加密4. 注意事项的全部内容,希望文章能够帮你解决JPBC库的使用--双线性配对,ECC加密1. 主要参数2. 双线性配对3. ECC加密4. 注意事项所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部