📄 ec.java
字号:
import java.math.*;
public class EC
{
BigInteger a;
BigInteger b;
BigInteger p;
static BigInteger gn;//基点G的阶
public void initialize()//初始化一条椭圆曲线
{
ECInitialize eci=new ECInitialize();
eci.setAB();//这个方法在生成椭圆曲线时,要保证只用一次
eci.setEllipticCurve();
this.a=eci.setEllipticCurve().getA();
this.b=eci.setEllipticCurve().getB();
this.p=eci.getP();
}
public ECPoint getECPoint()//取一个符合椭圆曲线要求条件的点
{
ECInitialize eci=new ECInitialize();
BigInteger right;
BigInteger left;
BigInteger x=eci.setBigSeed();
BigInteger y=BigInteger.valueOf(0);
do
{
right=x.multiply(x.multiply(x)).add(a.multiply(x)).add(b);
left=this.nrsqrt(right);//一般都是left.pow(2)<right 如5开平方得2,而2^2<5一样.
x=x.add(BigInteger.ONE);
}
while(!(left.pow(2).compareTo(right)==0));
return new ECPoint(x,y);
}
public BigInteger getGOrdor()
{
ECPoint G=this.getECPoint();
if(this.isCurvePoint(G))
{
BigInteger x=G.x;
for(BigInteger i=BigInteger.ONE;G.x.compareTo(x)==0;i=i.add(BigInteger.ONE))
{
G=G.multiply(i,a,p);
if(G.x.compareTo(x)==0)
{
gn=i;
}
}
return gn;
}
else
{
return null;
}
}
private static BigInteger nrsqrt(BigInteger n) //求数的平方根,移位实现
{
BigInteger t = n.shiftRight(BigInteger.valueOf(n.bitLength()).shiftRight(1).intValue()),
result = null;
for (;;)
{
result = t.add(n.divide(t)).shiftRight(1);
if (t.compareTo(result) == 0) break;
t = result;
}
return result;
}
boolean isCurvePoint(ECPoint P)//是否为曲线上的点
{
BigInteger x=P.x;
BigInteger y=P.y;
BigInteger left;
BigInteger right;
left=x.multiply(x.multiply(x)).add(a.multiply(x).add(b));
left=left.mod(p);
right=y.multiply(y);
right=right.mod(p);
if (left.compareTo(right)==0)
return true;
else return false;
}
public static void main(String args[])
{
EC ec=new EC();
ECPoint p=new ECPoint(BigInteger.TEN,BigInteger.ONE);
ec.initialize();
System.out.println("*************************输出椭圆曲线参数的值*************************");
System.out.println("椭圆曲线参数a的值:a="+ec.a);
System.out.println();
System.out.println("椭圆曲线参数b的值:b="+ec.b);
System.out.println();
System.out.println("有限域p的值p="+ec.p);
System.out.println("***************************椭圆曲线参数的值***************************");
//输出以下结果的计算非常耗时
/*System.out.println(ec.isCurvePoint(p));
System.out.println(ec.getECPoint());
System.out.println(ec.gn);
System.out.println(ec.getGOrdor());
*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -