Search in sources :

Example 1 with DenseTernaryPolynomial

use of com.github.zhenwei.core.pqc.math.ntru.polynomial.DenseTernaryPolynomial in project LinLong-Java by zhenwei1108.

the class NTRUEncryptionKeyPairGenerator method generateKeyPair.

/**
 * Generates a new encryption key pair.
 *
 * @return a key pair
 */
public AsymmetricCipherKeyPair generateKeyPair() {
    int N = params.N;
    int q = params.q;
    int df = params.df;
    int df1 = params.df1;
    int df2 = params.df2;
    int df3 = params.df3;
    int dg = params.dg;
    boolean fastFp = params.fastFp;
    boolean sparse = params.sparse;
    Polynomial t;
    IntegerPolynomial fq;
    IntegerPolynomial fp = null;
    // choose a random f that is invertible mod 3 and q
    while (true) {
        IntegerPolynomial f;
        // choose random t, calculate f and fp
        if (fastFp) {
            // if fastFp=true, f is always invertible mod 3
            t = params.polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE ? Util.generateRandomTernary(N, df, df, sparse, params.getRandom()) : ProductFormPolynomial.generateRandom(N, df1, df2, df3, df3, params.getRandom());
            f = t.toIntegerPolynomial();
            f.mult(3);
            f.coeffs[0] += 1;
        } else {
            t = params.polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_SIMPLE ? Util.generateRandomTernary(N, df, df - 1, sparse, params.getRandom()) : ProductFormPolynomial.generateRandom(N, df1, df2, df3, df3 - 1, params.getRandom());
            f = t.toIntegerPolynomial();
            fp = f.invertF3();
            if (fp == null) {
                continue;
            }
        }
        fq = f.invertFq(q);
        if (fq == null) {
            continue;
        }
        break;
    }
    // if fastFp=true, fp=1
    if (fastFp) {
        fp = new IntegerPolynomial(N);
        fp.coeffs[0] = 1;
    }
    // choose a random g that is invertible mod q
    DenseTernaryPolynomial g;
    while (true) {
        g = DenseTernaryPolynomial.generateRandom(N, dg, dg - 1, params.getRandom());
        if (g.invertFq(q) != null) {
            break;
        }
    }
    IntegerPolynomial h = g.mult(fq, q);
    h.mult3(q);
    h.ensurePositive(q);
    g.clear();
    fq.clear();
    NTRUEncryptionPrivateKeyParameters priv = new NTRUEncryptionPrivateKeyParameters(h, t, fp, params.getEncryptionParameters());
    NTRUEncryptionPublicKeyParameters pub = new NTRUEncryptionPublicKeyParameters(h, params.getEncryptionParameters());
    return new AsymmetricCipherKeyPair(pub, priv);
}
Also used : DenseTernaryPolynomial(com.github.zhenwei.core.pqc.math.ntru.polynomial.DenseTernaryPolynomial) ProductFormPolynomial(com.github.zhenwei.core.pqc.math.ntru.polynomial.ProductFormPolynomial) IntegerPolynomial(com.github.zhenwei.core.pqc.math.ntru.polynomial.IntegerPolynomial) Polynomial(com.github.zhenwei.core.pqc.math.ntru.polynomial.Polynomial) IntegerPolynomial(com.github.zhenwei.core.pqc.math.ntru.polynomial.IntegerPolynomial) DenseTernaryPolynomial(com.github.zhenwei.core.pqc.math.ntru.polynomial.DenseTernaryPolynomial) AsymmetricCipherKeyPair(com.github.zhenwei.core.crypto.AsymmetricCipherKeyPair)

Example 2 with DenseTernaryPolynomial

use of com.github.zhenwei.core.pqc.math.ntru.polynomial.DenseTernaryPolynomial in project LinLong-Java by zhenwei1108.

the class NTRUEngine method decrypt.

/**
 * @param e
 * @param priv_t  a polynomial such that if <code>fastFp=true</code>, <code>f=1+3*priv_t</code>;
 *                otherwise, <code>f=priv_t</code>
 * @param priv_fp
 * @return an IntegerPolynomial representing the output.
 */
protected IntegerPolynomial decrypt(IntegerPolynomial e, Polynomial priv_t, IntegerPolynomial priv_fp) {
    IntegerPolynomial a;
    if (params.fastFp) {
        a = priv_t.mult(e, params.q);
        a.mult(3);
        a.add(e);
    } else {
        a = priv_t.mult(e, params.q);
    }
    a.center0(params.q);
    a.mod3();
    IntegerPolynomial c = params.fastFp ? a : new DenseTernaryPolynomial(a).mult(priv_fp, 3);
    c.center0(3);
    return c;
}
Also used : IntegerPolynomial(com.github.zhenwei.core.pqc.math.ntru.polynomial.IntegerPolynomial) DenseTernaryPolynomial(com.github.zhenwei.core.pqc.math.ntru.polynomial.DenseTernaryPolynomial)

Example 3 with DenseTernaryPolynomial

use of com.github.zhenwei.core.pqc.math.ntru.polynomial.DenseTernaryPolynomial in project LinLong-Java by zhenwei1108.

the class NTRUEngine method generateBlindingPoly.

/**
 * Deterministically generates a blinding polynomial from a seed and a message representative.
 *
 * @param seed
 * @param M    message representative
 * @return a blinding polynomial
 */
private Polynomial generateBlindingPoly(byte[] seed, byte[] M) {
    IndexGenerator ig = new IndexGenerator(seed, params);
    if (params.polyType == NTRUParameters.TERNARY_POLYNOMIAL_TYPE_PRODUCT) {
        SparseTernaryPolynomial r1 = new SparseTernaryPolynomial(generateBlindingCoeffs(ig, params.dr1));
        SparseTernaryPolynomial r2 = new SparseTernaryPolynomial(generateBlindingCoeffs(ig, params.dr2));
        SparseTernaryPolynomial r3 = new SparseTernaryPolynomial(generateBlindingCoeffs(ig, params.dr3));
        return new ProductFormPolynomial(r1, r2, r3);
    } else {
        int dr = params.dr;
        boolean sparse = params.sparse;
        int[] r = generateBlindingCoeffs(ig, dr);
        if (sparse) {
            return new SparseTernaryPolynomial(r);
        } else {
            return new DenseTernaryPolynomial(r);
        }
    }
}
Also used : ProductFormPolynomial(com.github.zhenwei.core.pqc.math.ntru.polynomial.ProductFormPolynomial) SparseTernaryPolynomial(com.github.zhenwei.core.pqc.math.ntru.polynomial.SparseTernaryPolynomial) DenseTernaryPolynomial(com.github.zhenwei.core.pqc.math.ntru.polynomial.DenseTernaryPolynomial)

Aggregations

DenseTernaryPolynomial (com.github.zhenwei.core.pqc.math.ntru.polynomial.DenseTernaryPolynomial)3 IntegerPolynomial (com.github.zhenwei.core.pqc.math.ntru.polynomial.IntegerPolynomial)2 ProductFormPolynomial (com.github.zhenwei.core.pqc.math.ntru.polynomial.ProductFormPolynomial)2 AsymmetricCipherKeyPair (com.github.zhenwei.core.crypto.AsymmetricCipherKeyPair)1 Polynomial (com.github.zhenwei.core.pqc.math.ntru.polynomial.Polynomial)1 SparseTernaryPolynomial (com.github.zhenwei.core.pqc.math.ntru.polynomial.SparseTernaryPolynomial)1