⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eccurve.java

📁 kmlnjlkj nlkjlkjkljl okopokipoipo oipipipo i
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package org.bouncycastle.math.ec;import java.math.BigInteger;import java.util.Random;/** * base class for an elliptic curve */public abstract class ECCurve{    ECFieldElement a, b;    public abstract int getFieldSize();    public abstract ECFieldElement fromBigInteger(BigInteger x);    public abstract ECPoint createPoint(BigInteger x, BigInteger y, boolean withCompression);    public abstract ECPoint decodePoint(byte[] encoded);    public abstract ECPoint getInfinity();    public ECFieldElement getA()    {        return a;    }    public ECFieldElement getB()    {        return b;    }    /**     * Elliptic curve over Fp     */    public static class Fp extends ECCurve    {        BigInteger q;        ECPoint.Fp infinity;        public Fp(BigInteger q, BigInteger a, BigInteger b)        {            this.q = q;            this.a = fromBigInteger(a);            this.b = fromBigInteger(b);            this.infinity = new ECPoint.Fp(this, null, null);        }        public BigInteger getQ()        {            return q;        }        public int getFieldSize()        {            return q.bitLength();        }        public ECFieldElement fromBigInteger(BigInteger x)        {            return new ECFieldElement.Fp(this.q, x);        }        public ECPoint createPoint(BigInteger x, BigInteger y, boolean withCompression)        {            return new ECPoint.Fp(this, fromBigInteger(x), fromBigInteger(y), withCompression);        }        /**         * Decode a point on this curve from its ASN.1 encoding. The different         * encodings are taken account of, including point compression for         * <code>F<sub>p</sub></code> (X9.62 s 4.2.1 pg 17).         * @return The decoded point.         */        public ECPoint decodePoint(byte[] encoded)        {            ECPoint p = null;            switch (encoded[0])            {                // infinity            case 0x00:                p = getInfinity();                break;                // 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(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, true);                }                else                {                    p = new ECPoint.Fp(this, x,                        new ECFieldElement.Fp(this.q, q.subtract(beta.toBigInteger())), true);                }                break;                // uncompressed            case 0x04:                // hybrid            case 0x06:            case 0x07:                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;        }        public ECPoint getInfinity()        {            return infinity;        }        public boolean equals(            Object anObject)         {            if (anObject == this)             {                return true;            }            if (!(anObject instanceof ECCurve.Fp))             {                return false;            }            ECCurve.Fp other = (ECCurve.Fp) anObject;            return this.q.equals(other.q)                     && a.equals(other.a) && b.equals(other.b);        }        public int hashCode()         {            return a.hashCode() ^ b.hashCode() ^ q.hashCode();        }    }    /**     * Elliptic curves over F2m. The Weierstrass equation is given by     * <code>y<sup>2</sup> + xy = x<sup>3</sup> + ax<sup>2</sup> + b</code>.     */    public static class F2m extends ECCurve    {        /**         * The exponent <code>m</code> of <code>F<sub>2<sup>m</sup></sub></code>.         */        private int m;  // can't be final - JDK 1.1        /**         * TPB: The integer <code>k</code> where <code>x<sup>m</sup> +         * x<sup>k</sup> + 1</code> represents the reduction polynomial         * <code>f(z)</code>.<br>         * PPB: The integer <code>k1</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.<br>         */        private int k1;  // can't be final - JDK 1.1        /**         * TPB: Always set to <code>0</code><br>         * PPB: The integer <code>k2</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.<br>         */        private int k2;  // can't be final - JDK 1.1        /**         * TPB: Always set to <code>0</code><br>         * PPB: The integer <code>k3</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.<br>         */        private int k3;  // can't be final - JDK 1.1        /**         * The order of the base point of the curve.         */        private BigInteger n;  // can't be final - JDK 1.1        /**         * The cofactor of the curve.         */        private BigInteger h;  // can't be final - JDK 1.1                 /**         * The point at infinity on this curve.         */        private ECPoint.F2m infinity;  // can't be final - JDK 1.1        /**         * The parameter <code>&mu;</code> of the elliptic curve if this is         * a Koblitz curve.         */        private byte mu = 0;        /**         * The auxiliary values <code>s<sub>0</sub></code> and         * <code>s<sub>1</sub></code> used for partial modular reduction for         * Koblitz curves.         */        private BigInteger[] si = null;        /**         * Constructor for Trinomial Polynomial Basis (TPB).         * @param m  The exponent <code>m</code> of         * <code>F<sub>2<sup>m</sup></sub></code>.         * @param k The integer <code>k</code> where <code>x<sup>m</sup> +         * x<sup>k</sup> + 1</code> represents the reduction         * polynomial <code>f(z)</code>.         * @param a The coefficient <code>a</code> in the Weierstrass equation         * for non-supersingular elliptic curves over         * <code>F<sub>2<sup>m</sup></sub></code>.         * @param b The coefficient <code>b</code> in the Weierstrass equation         * for non-supersingular elliptic curves over         * <code>F<sub>2<sup>m</sup></sub></code>.         */        public F2m(            int m,            int k,            BigInteger a,            BigInteger b)        {            this(m, k, 0, 0, a, b, null, null);        }        /**         * Constructor for Trinomial Polynomial Basis (TPB).         * @param m  The exponent <code>m</code> of         * <code>F<sub>2<sup>m</sup></sub></code>.         * @param k The integer <code>k</code> where <code>x<sup>m</sup> +         * x<sup>k</sup> + 1</code> represents the reduction         * polynomial <code>f(z)</code>.         * @param a The coefficient <code>a</code> in the Weierstrass equation         * for non-supersingular elliptic curves over         * <code>F<sub>2<sup>m</sup></sub></code>.         * @param b The coefficient <code>b</code> in the Weierstrass equation         * for non-supersingular elliptic curves over         * <code>F<sub>2<sup>m</sup></sub></code>.         * @param n The order of the main subgroup of the elliptic curve.         * @param h The cofactor of the elliptic curve, i.e.         * <code>#E<sub>a</sub>(F<sub>2<sup>m</sup></sub>) = h * n</code>.         */        public F2m(            int m,             int k,             BigInteger a,             BigInteger b,            BigInteger n,            BigInteger h)        {            this(m, k, 0, 0, a, b, n, h);        }        /**         * Constructor for Pentanomial Polynomial Basis (PPB).         * @param m  The exponent <code>m</code> of         * <code>F<sub>2<sup>m</sup></sub></code>.         * @param k1 The integer <code>k1</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.         * @param k2 The integer <code>k2</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.         * @param k3 The integer <code>k3</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.         * @param a The coefficient <code>a</code> in the Weierstrass equation         * for non-supersingular elliptic curves over         * <code>F<sub>2<sup>m</sup></sub></code>.         * @param b The coefficient <code>b</code> in the Weierstrass equation         * for non-supersingular elliptic curves over         * <code>F<sub>2<sup>m</sup></sub></code>.         */        public F2m(            int m,            int k1,            int k2,            int k3,            BigInteger a,            BigInteger b)        {            this(m, k1, k2, k3, a, b, null, null);        }        /**         * Constructor for Pentanomial Polynomial Basis (PPB).         * @param m  The exponent <code>m</code> of         * <code>F<sub>2<sup>m</sup></sub></code>.         * @param k1 The integer <code>k1</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.         * @param k2 The integer <code>k2</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.         * @param k3 The integer <code>k3</code> where <code>x<sup>m</sup> +         * x<sup>k3</sup> + x<sup>k2</sup> + x<sup>k1</sup> + 1</code>         * represents the reduction polynomial <code>f(z)</code>.         * @param a The coefficient <code>a</code> in the Weierstrass equation         * for non-supersingular elliptic curves over

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -