提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
对于学习双线性映射知识过程中的一些理解
一、前置知识
如果对这部分知识比较了解可略过
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}
a−1
∈
\in
∈ G , a
×
\times
×
a
−
1
a^{-1}
a−1 =
a
−
1
a^{-1}
a−1
×
\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");
}
}