2015-04-04 46 views
0

我使用NTRU的BouncyCastle的的执行力度,这是我的代码:如何获得NTRU参数

NTRUEncryptionKeyGenerationParameters ntruEncryptionKeyGenerationParameters = NTRUEncryptionKeyGenerationParameters.EES1087EP2; 
NTRUEncryptionKeyPairGenerator ntruEncryptionKeyPairGenerator = new NTRUEncryptionKeyPairGenerator(); 
ntruEncryptionKeyPairGenerator.init(ntruEncryptionKeyGenerationParameters); 
AsymmetricCipherKeyPair asymmetricCipherKeyPair = ntruEncryptionKeyPairGenerator.generateKeyPair(); 
NTRUEncryptionPrivateKeyParameters ntruEncryptionPrivateKeyParameters = (NTRUEncryptionPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate(); 

NTRUEncryptionPublicKeyParameters ntruEncryptionPublicKeyParameters = (NTRUEncryptionPublicKeyParameters) asymmetricCipherKeyPair.getPublic(); 
NTRUEngine ntruEngine = new NTRUEngine(); 
ntruEngine.init(true, ntruEncryptionPublicKeyParameters); 

的问题是我怎么能得到˚F多项式和基础,因为我发现只有FP(逆的f,而且他们没有反方法)和Basis?我查了javadocs但没有结果。

回答

0

您可以从类找到它NTRUEncryptionKeyPairGenerator

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); 
} 

f为你以后的多项式。 你是什么意思的基础? 几乎逆和快速NTRU密钥创建

https://www.securityinnovation.com/uploads/Crypto/NTRUTech014.pdf

它是通过以下几个步骤做了优化的F

  1. 发现逆:

    逆方法在NTRU报告014描述Z/2Z /(x^N-1)

  2. 将其抬升至Z/2^rZ /(x^N-1)

  3. 重复至2^r = q