双线性映射(Bilinear Maps)实现(有限域、循环群)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

对于学习双线性映射知识过程中的一些理解


一、前置知识

如果对这部分知识比较了解可略过

1.域

域中元素进行加法、减法、乘法、除法之后运算的结果依然在域内
ex: 有理数集合,实数集合 反例:整数集合

1.1有限域

域F只包含有限个元素
:有限域中元素的个数称为有限域的阶;每个有限域的阶必为素数的幂,即有限域的阶可表示为 p n p^n pn(p为素数,n是正整数),记为GF( p n p^n pn)

2.群

2.1 群

群G有四个特性(设该群为乘法群)
1.封闭性,群中元素进行乘法运算后的结果依然在群中
2.结合律 ∀ \forall a,b,c ∈ \in G, a × \times ×(b × \times ×c) = (a × \times ×b) × \times ×c
3.存在单位元(幺元) ∃ \exists e ∈ \in G, ∀ \forall a ∈ \in G, a × \times ×e = e × \times ×a = e (加法的单位元是0,乘法的单位元是1)
4.任意元素都存在逆元 ∃ \exists e ∈ \in G, ∀ \forall a ∈ \in G, ∃ \exists a − 1 a^{-1} a1 ∈ \in G , a × \times × a − 1 a^{-1} a1 = a − 1 a^{-1} a1 × \times ×a = e

2.2 循环群

循环群中所有的元素都是由一个元素生成,也就是所有的元素都是形如 g n g^n gn = g ⋅ \cdot g ⋅ \cdot ⋅ \cdot ⋅ \cdot ⋅ \cdot ⋅ \cdot g(n个g),n为任意整数。这个生成所有元素的元素g称为生成元

循环群的阶:设G是由g ∈ \in G生成的循环群,使得 g n = e g^n=e gn=e成立的最小正整数n称为群G的阶,记作|G|=n
如果|G|=n,则 g n g^n gn=e(单位元),群G为有限循环群
G={ g g g, g 2 g^2 g2, g 3 g^3 g3, ⋅ \cdot ⋅ \cdot ⋅ \cdot , g n = e g^n=e gn=e}

二、什么是双线性映射?


双线性映射有三个特性:
1、双线性, 即 ∀ \forall u , v u,v u,v ∈ \in G, a , b a,b a,b ∈ \in Z p Z_p Zp , e( u a , v b u^a,v^b ua,vb) = e( u , v ) a b u,v)^{ab} u,v)ab
2、非退化性, e ( g , g ) e(g,g) e(g,g) ≠ \neq = 1
3、可计算性,存在有效的算法实现该映射

三、验证

1.导包

导入JPBC相关jar包
在这里插入图片描述

2.实现代码

import it.unisa.dia.gas.jpbc.Element;
import it.unisa.dia.gas.jpbc.Field;
import it.unisa.dia.gas.jpbc.Pairing;
import it.unisa.dia.gas.plaf.jpbc.pairing.PairingFactory;

public class JPBCDemo {

    public static void main(String[] args) {
        Pairing bp = PairingFactory.getPairing("a.properties");


        Field Zr = bp.getZr();
        Field G1 = bp.getG1();
        Field G2 = bp.getG2();

        Element g1 = G1.newRandomElement();
        Element g2 = G2.newRandomElement();
    
        Element a = Zr.newRandomElement();
        Element b = Zr.newRandomElement();

        Element g_a = g1.duplicate().powZn(a);
        Element g_b = g2.duplicate().powZn(b);
        Element egg_ab = bp.pairing(g_a, g_b);

        Element egg = bp.pairing(g1, g2);
        Element ab = a.duplicate().mul(b);
        Element egg_ab_p = egg. duplicate().powZn(ab);


        if (egg_ab .isEqual(egg_ab_p))
            System.out.println("Yes");
        else
            System.out.println("No");


    }
}



3.运行结果

在这里插入图片描述


  • 16
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
在PBC库中,使用C语言可以通过以下步骤来初始化双线性映射: 1. 首先,需要引入PBC头文件和标准头文件,如下所示: ```c #include <stdio.h> #include <stdlib.h> #include <pbc/pbc.h> ``` 2. 接下来,需要定义一些变量来存储双线性映射的信息,如下所示: ```c pairing_t pairing; char param[1024]; size_t count; ``` 其中,pairing_t是一个结构体类型,用于存储双线性映射的信息;param是一个字符数组,用于存储双线性映射的参数;count是一个整型变量,用于存储参数的长度。 3. 然后,需要从文件中读取双线性映射的参数,并初始化pairing_t结构体,如下所示: ```c FILE *fp = fopen("a.param", "r"); count = fread(param, 1, 1024, fp); fclose(fp); if (!count) pbc_die("input error"); pairing_init_set_buf(pairing, param, count); ``` 其中,a.param是存储双线性映射参数的文件名,通过fread函数从文件中读取参数,然后使用pairing_init_set_buf函数初始化pairing_t结构体。 4. 最后,需要释放资源,如下所示: ```c pairing_clear(pairing); ``` 完整的代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <pbc/pbc.h> int main() { pairing_t pairing; char param[1024]; size_t count; FILE *fp = fopen("a.param", "r"); count = fread(param, 1, 1024, fp); fclose(fp); if (!count) pbc_die("input error"); pairing_init_set_buf(pairing, param, count); // do something with pairing pairing_clear(pairing); return 0; } ``` 注意:在使用PBC库时,需要链接libpbc库和GMP库,例如使用以下命令编译代码: ```bash gcc -o test test.c -lpbc -lgmp ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

echo-dundun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值