eccurve.java
来自「bouncycastle 是一个JAVA安全提供者」· Java 代码 · 共 145 行
JAVA
145 行
package org.bouncycastle.math.ec;import java.math.BigInteger;/** * base class for an elliptic curve */public abstract class ECCurve{ BigInteger q; ECFieldElement a, b; public ECCurve(BigInteger q, BigInteger a, BigInteger b) { this.q = q; this.a = fromBigInteger(a); this.b = fromBigInteger(b); } public abstract ECFieldElement fromBigInteger(BigInteger x); public abstract ECPoint decodePoint(byte[] encoded); public ECFieldElement getA() { return a; } public ECFieldElement getB() { return b; } /** * Elliptic curve over Fp */ public static class Fp extends ECCurve { public Fp(BigInteger q, BigInteger a, BigInteger b) { super(q, a, b); } public BigInteger getQ() { return q; } public ECFieldElement fromBigInteger(BigInteger x) { return new ECFieldElement.Fp(this.q, x); } /** * decode a point on this curve which has been encoded using * point compression (X9.62 s 4.2.1 pg 17) returning the point. */ public ECPoint decodePoint(byte[] encoded) { ECPoint p = null; switch (encoded[0]) { // compressed case 0x02: case 0x03: int ytilde = encoded[0] & 1; byte[] i = new byte[encoded.length - 1]; System.arraycopy(encoded, 1, i, 0, i.length); ECFieldElement x = new ECFieldElement.Fp(this.q, new BigInteger(1, i)); ECFieldElement alpha = x.multiply(x.square()).add(x.multiply(a).add(b)); ECFieldElement beta = alpha.sqrt(); // // if we can't find a sqrt we haven't got a point on the // curve - run! // if (beta == null) { throw new RuntimeException("Invalid point compression"); } int bit0 = (beta.toBigInteger().testBit(0) ? 1 : 0); if (bit0 == ytilde) { p = new ECPoint.Fp(this, x, beta); } else { p = new ECPoint.Fp(this, x, new ECFieldElement.Fp(this.q, q.subtract(beta.toBigInteger()))); } break; case 0x04: byte[] xEnc = new byte[(encoded.length - 1) / 2]; byte[] yEnc = new byte[(encoded.length - 1) / 2]; System.arraycopy(encoded, 1, xEnc, 0, xEnc.length); System.arraycopy(encoded, xEnc.length + 1, yEnc, 0, yEnc.length); p = new ECPoint.Fp(this, new ECFieldElement.Fp(this.q, new BigInteger(1, xEnc)), new ECFieldElement.Fp(this.q, new BigInteger(1, yEnc))); break; default: throw new RuntimeException("Invalid point encoding 0x" + Integer.toString(encoded[0], 16)); } return p; } } /** * Elliptic curves over F2m */ public static class F2m extends ECCurve { public F2m(BigInteger c2, BigInteger a, BigInteger b) { super(c2, a, b); } /* (non-Javadoc) * @see org.bouncycastle.math.ec.ECCurve#fromBigInteger(java.math.BigInteger) */ public ECFieldElement fromBigInteger(BigInteger x) { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see org.bouncycastle.math.ec.ECCurve#decodePoint(byte[]) */ public ECPoint decodePoint(byte[] encoded) { // TODO Auto-generated method stub return null; } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?