精华内容
下载资源
问答
  • 双线性配对运算性质

    2020-12-01 09:50:08
    双线性运算性质: https://www.cnblogs.com/Erma/p/8319817.html

    双线性对运算性质:
    在这里插入图片描述

    https://www.cnblogs.com/Erma/p/8319817.html

    展开全文
  • 双线性插值运算实现

    2019-04-04 15:52:48
    在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值[1]。见下图: 假如我们想得到未知函数 f 在点 P = (x, y) 的值,假设我们已知函数 f 在 Q11 = (x1, y1)...

    一、原理

    双线性插值
    在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值[1]。见下图:

    è¿éåå¾çæè¿°

    假如我们想得到未知函数 f 在点 P = (x, y) 的值,假设我们已知函数 f 在 Q11 = (x1, y1)、Q12 = (x1, y2), Q21 = (x2, y1) 以及 Q22 = (x2, y2) 四个点的值。最常见的情况,f就是一个像素点的像素值。首先在 x 方向进行线性插值,得到

    è¿éåå¾çæè¿°
    然后在 y 方向进行线性插值,得到

    è¿éåå¾çæè¿°

    综合起来就是双线性插值最后的结果:

    è¿éåå¾çæè¿°
    由于图像双线性插值只会用相邻的4个点,因此上述公式的分母都是1。opencv中的源码如下,用了一些优化手段,比如用整数计算代替float(下面代码中的*2048就是变11位小数为整数,最后有两个连乘,因此>>22位),以及源图像和目标图像几何中心的对齐 
    SrcX=(dstX+0.5)* (srcWidth/dstWidth) -0.5 
    SrcY=(dstY+0.5) * (srcHeight/dstHeight)-0.5,

    二、C++代码

    uchar InterBilinear(float x,float y,cv::Mat &src)
    {
    	int x_L = cvFloor(x) - 1;
    	int x_R = cvFloor(x) + 1;
    	int y_T = cvFloor(y) - 1;
    	int y_B = cvFloor(y) + 1;
    
    	if (x_L <= 0) x_L = 0;
    	else if (x_L >= src.cols - 1) x_L = src.cols - 1;
    	if (x_R <= 0) x_R = 0;
    	else if (x_R > src.cols - 1) x_R = src.cols - 1;
    		
    	if (y_T <= 0) y_T = 0;
    	else if (y_T > src.rows - 1) y_T = src.rows - 1;
    	if (y_B <= 0) y_B = 0;
    	else if (y_B > src.rows - 1) y_B = src.rows - 1;
    
    	uchar grayTopL = src.at<uchar>(x_L, y_T);//左上角
    	uchar grayTopR = src.at<uchar>(x_R, y_T);//右上角
    	uchar grayBottonL = src.at<uchar>(x_L, y_B);//左下角
    	uchar grayBottonR = src.at<uchar>(x_R, y_B);//右下角
    	//1、计算X方向插值
    	float HLscale = 0.f, HRscale = 0.f, VTscale = 0.f, VBscale=0.f;
    	HLscale = 1 - (x - x_L) / (x_R - x_L);
    	HRscale = 1 - (x_R - x) / (x_R - x_L);
    	VTscale = 1 - (y - y_T) / (y_B - y_T);
    	VBscale = 1 - (y_B-y) / (y_B - y_T);
    	uchar Hpixel1= static_cast<uchar>(grayTopL*HLscale + grayTopR*HRscale);
    	uchar Hpixel2 = static_cast<uchar>(grayBottonL*HLscale + grayBottonR*HRscale);
    	//计算Y方向插值
    	uchar Vpixel = static_cast<uchar>(Hpixel1*VTscale + Hpixel2*VBscale);
    	return Vpixel;
    }
    
    void ImageZoom(cv::Mat &srcimg, cv::Mat &dst, float scale)
    {
    	cv::Mat resultimg, grayimg;
    	if (scale <= 1e-6)
    	{
    		cout << "Illegal Parameter!" << endl;
    		return;
    	}
    	if (!srcimg.data)
    	{
    		cout << "Image Is Null!" << endl;
    		return;
    	}
    	
    	grayimg = srcimg.clone();
    	int new_width = static_cast<int>(scale*srcimg.cols);
    	int new_height = static_cast<int>(scale*srcimg.rows);
    	getgrayMat(grayimg);
    	resultimg.create(cv::Size(new_width, new_height), grayimg.depth());
    	for (int i0 = 0; i0 < new_height; i0++)
    	{
    		for (int j0 = 0; j0 < new_width; j0++)
    		{
    				float j1 = (j0+0.1f) / scale;
    				float i1 = (i0+0.1f )/ scale;
    				if (j1 <= 1e-6)
    					j1 = 0.f;
    				if (i1 <= 1e-6)
    					i1 = 0.f;
    				uchar Interval=InterBilinear(i1, j1, grayimg);
    				resultimg.at<uchar>(i0, j0) = Interval;
    		}
    	}
    	dst = resultimg.clone();
    	resultimg.release();
    }
    
    展开全文
  • 基于双线性对的运算性质

    千次阅读 2018-01-20 08:36:00
    基于双线性对的运算性质 具体实现: 运用了Boneh的代码(基于C),我们在Boneh的基础上已将代码移植到C#平台。 转载于:https://www.cnblogs.com/Erma/p/8319817.html...

    基于双线性对的运算性质

    具体实现:

    运用了Boneh的代码(基于C),我们在Boneh的基础上已将代码移植到C#平台。

    转载于:https://www.cnblogs.com/Erma/p/8319817.html

    展开全文
  • 双线性群简介与基本运算

    千次阅读 2020-03-18 15:24:55
    现在密码学实现基本只使用Type A和Type A1的。前者为对称质数阶双线性群,后者为合数阶对称双线性群。本博客也只在这两类曲线上实验。其他类曲线的实现类似

    欢迎关注公众号:VenusBlockChain 致力于区块链技术研究,传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。
    在这里插入图片描述

    1.质数阶双线性群(Prime-Order Bilinear Groups)

    质数双线性群可以由五元组(p,G1,G2,GT,e)(p,G1,G2,GT,e)来描述。五元组中pp是一个与给定安全常数λλ相关的大质数,G1,G2,GTG1,G2,GT均是阶为pp的乘法循环群,ee为双线性映射e:G1×G2GTe:G1×G2→GT,它满足以下3个条件:

    • 双线性(Bilinearity):对于任意的gG1hG2a,bZpg∈G1,h∈G2,a,b∈Zp,有e(ga,hb)=e(g,h)abe(g^a,h^b)=e(g,h)^{ab}
    • 非退化性(Non-degeneracy):至少存在元素g1G1,g2G2g_1∈G1,g_2∈G2,满足e(g1,g2)1e(g_1,g_2)≠1
    • 可计算性(Efficiency):对于任意的uG1,vG2u∈G1,v∈G2,存在一个与给定安全常数λλ相关的多项式时间算法,可以高效地计算e(u,v)e(u,v)

    现在的密码学相关论文中,习惯将G1,G2G1,G2设置为乘法循环群。但是,基于椭圆曲线的双线性群构造中,G1,G2G1,G2是加法群。所以在大约2005年以前的论文中,双线性群一般写成加法群形式。JPBC中将G1,G2G1,G2表示称为了乘法循环群,因此在实现写成加法群形式的方案时,要注意将加法群改成乘法群的写法再进行实现。如何修改呢?很简单,把加法群中的加法运算写成乘法运算、把加法群中的乘法运算写成幂指数运算即可。

    2.合数阶双线性群(Composite-Order Bilinear Groups)

    合数阶双线性群和质数阶双线性群很类似,区别是G1,G2,GTG1,G2,GT的阶数是一个合数NN,其中NN是一些大质数的乘积,如N=p1p2pnN=p_1p_2⋯p_n。同样,e为双线性映射e:G1×G2GTe:G1×G2→GT,它满足双线性性、非退化性以及可计算性。

    与质数阶双线性群不同,合数阶双线性群中,GNGN有阶数分别为p1,p2,,pnp_1,p_2,⋯,p_n的子群Gp1,,GpnGp_1,⋯,Gp_n。这些子群进一步满足正交特性。

    对于所有的hiGpih_i∈Gp_ihjGpjh_j∈Gp_j,如果iji≠j,那么e(hi,hj)=1e(h_i,h_j)=1

    简单地说就是,子群之间进行双线性运算的结果必为1。

    2.1.一些说明

    首先,由于双线性群现在的构造是基于椭圆曲线的,而椭圆曲线上的元素是由坐标(x,y)(x,y)表示的,所以如果我们将G1,G2G1,G2的结果输出到Java的控制台,我们得到的是一个坐标。不过,GTGT是一个普通的ZnZ_n群,所以其元素的表示是一个数。

    其次,在密码学中,如果G1=G2G1=G2,我们称这个双线性群是对称双线性群(Symmetric Bilinear Group),否则称之为非对称双线性群(Asymmetric Bilinear Group)。

    是否为对称双线性群由选取的椭圆曲线种类决定。一般认为,非对称双线性群要比对称双线性群更安全。特别地,现在已经证明一些特定的对称双线性群是不安全的了。

    现在JPBC可以使用的曲线为如下几类:

    • Type A
    • Type A1
    • Type D
    • Type E
    • Type F
    • Type G

    现在密码学实现基本只使用Type A和Type A1的。前者为对称质数阶双线性群,后者为合数阶对称双线性群。本博客也只在这两类曲线上实验。其他类曲线的实现类似。由于是对称双线性群,本博客中G1,G2G1,G2统一写为GG

    3.双线性群初始化

    在JPBC中,双线性群的使用都是通过叫做Pairing的对象来实现的。双线性群的初始化在JPBC中就是对Pairing对象的初始化。双线性群有两种初始化的方法。第一种是通过代码动态产生一个双线性群,第二种是从文件中读取参数而产生群。

    3.1.通过代码动态产生

    动态产生的方法非常简单,大概有如下步骤:指定椭圆曲线的种类、产生椭圆曲线参数、初始化Pairing。Type A曲线需要两个参数:rBit是Zp中阶数p的比特长度;qBit是G中阶数的比特长度。代码为:

    //rBit是Zp中阶数p的比特长度,如160;qBit是G中阶数的比特长度,如512。
    TypeACurveGenerator pg = new TypeACurveGenerator(rBit, qBit);
    PairingParameters typeAParams = pg.generate();
    Pairing pairing = PairingFactory.getPairing(typeAParams);
    

    Type A1曲线需要二个参数:numPrime是阶数N中有几个质数因子;qBit是每个质数因子的比特长度。注意,Type A1涉及到的阶数很大,其参数产生的时间也比较长。代码为:

    TypeA1CurveGenerator pg = new TypeA1CurveGenerator(numPrime, qBit);
    PairingParameters typeA1Params = pg.generate();
    Pairing pairing = PairingFactory.getPairing(typeA1Params);
    

    3.2.通过文件读取产生

    我们也可以选择事先产生好参数,存放在文件中。以后再初始化的时候,直接从文件中读取参数,就可以非常快速的初始化双线性群。

    PairingParameters支持toString()函数。实际上,我们可以直接将PairingParametersd的toString()存放在文件中。读取的时候,通过读取文件就可以直接初始化双线性群了。

    Type A曲线从文件中读取参数初始化的代码为:

    TypeACurveGenerator pg = new TypeACurveGenerator(rBit, qBit);
    PairingParameters typeAParams = pg.generate();
    //将参数写入文件a.properties中,我用了Princeton大学封装的文件输出库
    Out out = new Out("a.properties");
    out.println(typeAParams);
    //从文件a.properties中读取参数初始化双线性群
    Pairing pairing = PairingFactory.getPairing("a.properties");
    

    Type A1曲线从文件中读取参数初始化的代码为:

    TypeA1CurveGenerator pg = new TypeA1CurveGenerator(numPrimes, qBit);
    PairingParameters typeA1Params = pg.generate();
    //将参数写入文件a1.properties中,同样使用了Princeton大学封装的文件输出库
    Out out = new Out("a1.properties");
    out.println(typeA1Params);
    //从文件a1.properties中读取参数初始化双线性群
    Pairing pairing = PairingFactory.getPairing("a1.properties");
    

    4.产生双线性群中的随机数

    Type A中产生随机数的方法很简单,代码为:

    //随机产生一个Z_p群的元素
    Element Z_p = pairing.getZr().newRandomElement().getImmutable();
    //随机产生一个G_1群的元素
    Element G_1 = pairing.getG1().newRandomElement().getImmutable();
    //随机产生一个G_2群的元素
    Element G_2 = pairing.getG2().newRandomElement().getImmutable();
    //随机产生一个G_T群的元素
    Element G_T = pairing.getGT().newRandomElement().getImmutable();
    

    Type A1中产生随机数的方法稍微有点麻烦。对于ZN和GT方法和Type A一样。代码为:

    //随机产生一个Z_N群的元素
    Element Z_N = pairing.getZr().newRandomElement().getImmutable();
    //随机产生一个G_T群的元素
    Element G_T = pairing.getGT().newRandomElement().getImmutable();
    

    但是对于G就不同了。因为G有子群Gpi,Type A1产生随机数时需要指定生成元,椭圆曲线的参数,产生哪个子群的元素,以及Type A1一共有多少个子群。

    假定我们产生的Type A1共有n个子群,这n个子群的阶分别为p1,⋯,pn,产生随机数的代码如下:

    TypeA1CurveGenerator pg = new TypeA1CurveGenerator(numPrimes, qBit);
    PairingParameters typeA1Params = pg.generate();
    Pairing pairing = PairingFactory.getPairing(typeA1Params);
    
    //设定并存储一个生成元。由于椭圆曲线是加法群,所以G群中任意一个元素都可以作为生成元
    Element generator = pairing.getG1().newRandomElement().getImmutable();
    //随机产生一个G_p_1中的元素
    Element G_p_1 = ElementUtils.getGenerator(pairing, generator, typeA1Params, 0, numPrimes).getImmutable();
    //随机产生一个G_p_2中的元素
    Element G_p_2 = ElementUtils.getGenerator(pairing, generator, typeA1Params, 1, numPrimes).getImmutable();
    // ...... 
    //随机产生一个G_p_n中的元素
    Element G_p_n = ElementUtils.getGenerator(pairing, generator, typeA1Params, 1, numPrimes).getImmutable();
    

    5.将指定的元素哈希到双线性群中

    由于双线性群最初是用在基于身份的加密(Identity-Based Encryption)系统中,我们经常会需要将一个特定的String或者byte[]哈希到双线性群中。

    JPBC支持将byte[]哈希到双线性群的Z,G,GT中。但是,JPBC说明文档中没有提到的是,byte[]数组长度不能太长,如果过长会抛出异常。因此,我建议首先将byte[]用一个SHA256或者其他通用哈希函数哈希到固定长度,再用JPBC提供的函数哈希到双线性群上。在这里我略去SHA256步骤,直接给出哈希到Z,G,GT群的代码:

    //将byte[] byteArray_Z_p哈希到Z_p群
    Element hash_Z_p = pairing.getZr().newElement().setFromHash(byteArray_Z_p, 0, byteArray_Z_p.length);
    //将byte[] byteArray_G_1哈希到G_1群
    Element hash_G_1 = pairing.getG1().newElement().setFromHash(byteArray_G_1, 0, byteArray_G_1.length);
    //将byte[] byteArray_G_2哈希到G_2群
    Element hash_G_2 = pairing.getG2().newElement().setFromHash(byteArray_G_2, 0, byteArray_G_2.length);
    //将byte[] byteArray_G_T哈希到G_T群
    Element hash_G_T = pairing.getGT().newElement().setFromHash(byteArray_G_T, 0, byteArray_G_T.length);
    

    注意,对于Type A1来说,这个代码无法指定哈希到指定子群Gpi中。解决方法是将byte[]先哈希到Z群,然后利用G,GT的生成元计算幂指数,从而达到哈希到G,GT上的效果。

    6.双线性群的运算

    双线性群之间有如下运算:

    • G相关运算:GZ, G×G;
    • GT相关运算:GZT, GT×GT;
    • Z相关运算:Z+Z, Z×Z;
    • Pairing运算

    做运算的时候要注意一下几点:

    1. Java的运算结果都是产生一个新的Element来存储,所以我们需要把运算结果赋值给一个新的Element;
    2. Java在进行相关运算时,参与运算的Element值可能会改变。所以,如果需要在运算过程中保留参与运算的Element值,在存储的时候一定要调用getImmutable(),具体方法见代码中的初始化相关参数部分。
    3. 其实为了保险起见,防止Element在运算的过程中修改了Element原本的数值,可以使用Element.duplicate()方法。这个方法将返回一个与Element数值完全一样的Element,但是是个新的Element对象。举例来说,如果做G1×G1的运算,可以写成:
    Element G_1_m_G_1 = G_1.duplicate().mul(G_1_p.duplicate());
    

    G和G其实也是可以进行幂指数运算的,即GG,调用的函数为Element e1.pow(Element e2)。特别注意,我们再写G群的Z次方运算时,用的函数为powZn(),而不是pow(),这个调用错误很容易使得程序的运算结果不正确。
    代码如下:

    //初始化相关参数
    Element G_1 = pairing.getG1().newRandomElement().getImmutable();
    Element G_2 = pairing.getG2().newRandomElement().getImmutable();
    Element Z = pairing.getZr().newRandomElement().getImmutable();
    Element G_T = pairing.getGT().newRandomElement().getImmutable();
    
    Element G_1_p = pairing.getG1().newRandomElement().getImmutable();
    Element G_2_p = pairing.getG2().newRandomElement().getImmutable();
    Element Z_p = pairing.getZr().newRandomElement().getImmutable();
    Element G_T_p = pairing.getGT().newRandomElement().getImmutable();
    
    //G_1的相关运算
    //G_1 multiply G_1
    Element G_1_m_G_1 = G_1.mul(G_1_p);
    //G_1 power Z
    Element G_1_e_Z = G_1.powZn(Z);
    
    //G_2的相关运算
    //G_2 multiply G_2
    Element G_2_m_G_2 = G_2.mul(G_2_p);
    //G_2 power Z
    Element G_2_e_Z = G_2.powZn(Z);
    
    //G_T的相关运算
    //G_T multiply G_T
    Element G_T_m_G_T = G_T.mul(G_T_p);
    //G_T power Z
    Element G_T_e_Z = G_T.powZn(Z);
    
    //Z的相关运算
    //Z add Z
    Element Z_a_Z = Z.add(Z_p);
    //Z multiply Z
    Element Z_m_Z = Z.mul(Z_p);
    
    //Pairing运算
    Element G_p_G = pairing.pairing(G_1, G_2);      
    

    参考

    [1] https://blog.csdn.net/liuweiran900217/article/details/45080653

    展开全文
  • 这几天研究的PLONK里验证的最后一步是关于双线性对的运算,所以找了一些相关公式,但是网上博客里的太官方了,大段大段的介绍背景,所以在这里我就不多说废话了,直接用在零知识证明里的推导过程总结一下。...
  • cv.imshow("input",src) #显示图像 h, w = src.shape[:2] #输出图像属性 print(h,w) dst = cv.resize(src,(w//2,h//2),interpolation = cv.INTER_LINEAR) #缩小图像并进行双线性插值计算 cv.imshow("output",dst) #...
  • 最近写深度学习网络需要对feature map进行双线性插值,opencv的resize不能对图像进行批处理,网上找到的双线性插值的代码基本都是三重for循环实现的,效率太低下,干脆自己用numpy库的矩阵运算实现了一个。...
  • 双线性插值

    2018-09-25 20:24:00
    1,原理 在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用...
  • 双线性对是构建密码体制的重要工具,但双线性运算是最耗时的运算,直接影响...利用双线性对提出的盲签名方案与己有方案的双线性运算相比,具有运算量少,计算效率高的特点。同时,方案具有盲性、不可伪造性等安全特性。
  • 双线性插值算法

    2020-01-31 15:57:43
    1、线性插值的解释 单线性插值法 双线性插值法 2、另一位牛人讲的比较易懂 1.双线性插值 2.存在的问题 3、又是另一位讲的通俗易懂 ...3.1 源图像和目标图像...在数学上,双线性插值是有两个变量的插值函数的线性插...
  • 快速双线性插值

    千次阅读 2013-09-29 22:02:52
    图像缩放是最常用的图像操作,最近实现了一次双线性插值,适用于单通道8位灰度图像,可以同时处理缩小,放大。加速手段有三个:1) 使用可分离方式,先后处理行和列, 2)构建缓冲区,以避免对某些行重复插值。3) 使用...
  • 提出了一种不含双线性对的无证书有序多重签名方案,即结合不含双线对运算的无证书签名和有序多重签名的思想。与一般无证书数字签名体制不同的是,不含双线性运算的无证书密码体制没有复杂的双线性对运算,且在计算...
  • 目录双线性插值(Bilinear Interpolation)线性插值双线性插值深入理解双线性插值我的插值理解代码官方插值办法源图像和目标图像几何中心的对齐将浮点运算转换成整数运算代码效果对比再次深入理解引用 双线性插值...
  • 在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值、双线性插值、双三次插值、兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广...
  • 双线性插值 一文全讲解

    千次阅读 2019-01-13 15:35:56
    在图像的仿射变换中,很多地方需要用到插值运算,常见的插值运算包括最邻近插值,双线性插值,双三次插值,兰索思插值等方法,OpenCV提供了很多方法,其中,双线性插值由于折中的插值效果和运算速度,运用比较广泛。...
  • 图像处理+双线性插值法

    千次阅读 2018-03-10 15:50:13
    1.双线性插值 2.存在的问题 3、又是另一位讲的通俗易懂 1,原理 2,计算方法 3,加速以及优化策略 3.1 源图像和目标图像几何中心的对齐  3.2 将浮点运算转换成整数运算 4,代码 1、线性插值的解释 ...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 263
精华内容 105
关键字:

双线性运算