Beispiel #1
0
  public static PVSSEngine getInstance(int n, int t, int numBits) throws InvalidVSSScheme {

    if (t > n) {
      throw new InvalidVSSScheme("(t,n)=(" + t + "," + n + ")");
    }

    /** Fill in public information */
    BigInteger groupPrimeOrder = new BigInteger("2373168401");
    BigInteger generatorg = new BigInteger("1964832733");
    BigInteger generatorG = new BigInteger("1476385517");

    // System.out.println("groupPrimeOrder : " + groupPrimeOrder);
    // System.out.println("generatorg : " + generatorg);
    // System.out.println("generatorG : " + generatorG);

    /*
     * Initialize public information structure
     */
    PublicInfo publicInfo = new PublicInfo(n, t, groupPrimeOrder, generatorg, generatorG);

    /*
     * Generate interpolation points
     */
    publicInfo.setInterpolationPoints();

    return new PVSSEngine(publicInfo);
  }
Beispiel #2
0
 public static BigInteger hash(PublicInfo info, byte[] data) throws InvalidVSSScheme {
   try {
     if (md == null) {
       md = MessageDigest.getInstance(info.getHashAlgorithm());
     } else {
       md.reset();
     }
     return new BigInteger(md.digest(data));
   } catch (NoSuchAlgorithmException e) {
     throw new InvalidVSSScheme("Invalid hash algorithm " + info.getHashAlgorithm());
   }
 }
Beispiel #3
0
 public static boolean addMujiInfo(String accountNum, String password) {
   String sql = "insert into " + CreateWord.MUJITable + "(accountNum,password) values(?,?)";
   try {
     Class.forName(driver);
     conn = PublicInfo.getConnection();
     ps = conn.prepareStatement(sql);
     ps.setString(1, accountNum);
     ps.setString(2, password);
     ps.executeUpdate();
     return true;
   } catch (ClassNotFoundException | SQLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
   }
   return false;
 }
Beispiel #4
0
 public static PVSSEngine getInstance(PublicInfo publicInfo) throws InvalidVSSScheme {
   publicInfo.setInterpolationPoints();
   return new PVSSEngine(publicInfo);
 }
Beispiel #5
0
  public BigInteger combineShares(int x[], Share[] shares) throws Exception {
    int t = publicInfo.getT();
    int n = publicInfo.getN();
    BigInteger[] z = this.publicInfo.getInterpolationPoints();

    if (x.length != t) {
      throw new RuntimeException("There must be " + t + " diferent and valid shares");
    }

    for (int i : x) {
      if (shares[i] == null) {
        throw new RuntimeException("There must be " + t + " diferent and valid shares");
      }
    }

    BigInteger q = publicInfo.getGroupPrimeOrder();
    BigInteger qm1 = q.subtract(BigInteger.ONE);

    BigInteger secret = BigInteger.ONE;

    // System.out.print("PVSSEngine.combineShares: Using shares");
    for (int i = 0; i < t; i++) { // iterates over x[i]
      // System.out.print(" "+x[i]);

      /*
      * float lambda = 1; for(int j=0; j<t; j++) { //iterates over x[j]
      * if(j != i){ lambda = lambda*((float)(x[j]+1)/(float)(x[j]-x[i]));
      * } }
      *
      * secret = secret.multiply(shares[x[i]].getShare()
             .modPow(BigInteger.valueOf((long)lambda),q)).mod(q);
      */

      BigInteger lambda = BigInteger.ONE;
      BigInteger lambdadenom = BigInteger.ONE;
      BigInteger lambdanumer = BigInteger.ONE;
      BigInteger gcd = BigInteger.ONE;

      for (int j = 0; j < t; j++) { // iterates over x[j]
        if (j != i) {
          // It,s essential that mod is not done here, because of gcd
          lambdanumer = lambdanumer.multiply(z[x[j]]);
          lambdadenom = lambdadenom.multiply(z[x[j]].subtract(z[x[i]]));
        }
      }

      // System.out.println("lambdanumer " + lambdanumer + ", lambdadenom " + lambdadenom);

      gcd = lambdadenom.gcd(lambdanumer);
      lambdadenom = lambdadenom.divide(gcd);
      lambdanumer = lambdanumer.divide(gcd);

      /** Sanity check * */
      gcd = lambdadenom.gcd(qm1);

      // System.out.println("GCD :" + gcd.intValue());

      if (gcd.intValue() != 1) {
        // System.out.println("i :" + i);
        // System.out.println("lambdanumer " + lambdanumer);
        // System.out.println("lambdadenom " + lambdadenom);
        // System.out.println("z array :" + Arrays.toString(z));
        // System.out.println("x array :" + Arrays.toString(x));

        throw invalidLagrangeCoeff();
      }
      BigInteger invdenom = lambdadenom.modInverse(qm1);
      lambda = lambdanumer.multiply(invdenom).mod(qm1);
      // System.out.println("i = " + i + ", lambda = " + lambda + ", lambdanumer "
      //     + lambdanumer + ", lambdadenom " + lambdadenom);

      secret = secret.multiply(shares[x[i]].getShare().modPow(lambda, q)).mod(q);
    }

    /*
     * BigInteger secret = BigInteger.ONE;
     *
     * //System.out.print("PVSSEngine.combineShares: Using shares"); for(int
     * i=0; i<t; i++){ //iterates over x[i] //System.out.print(" "+x[i]);
     *
     * BigInteger lambda2 = BigInteger.valueOf(1); for(int j=0; j<t; j++) {
     * //iterates over x[j] if(j != i){
     *
     * BigInteger denominator = BigInteger.valueOf(x[j]-x[i]); lambda2 =
     * lambda2.multiply( BigInteger.valueOf((x[j]+1)).multiply(
     * denominator.modInverse(q)) ).mod(qm1); } }
     *
     * System.out.println("shares[x[i]].getShare()
     * ="+shares[x[i]].getShare()); System.out.println("Our lambda2 :
     * "+lambda2); System.out.println("q : "+q);
     *
     * BigInteger temp2 = (shares[x[i]].getShare()).modPow(lambda2,q);
     * System.out.println("temp2 ="+temp2);          *
     * float lambda = 1; for(int j=0; j<t; j++) { //iterates over x[j] if(j
     * != i){ lambda = lambda*((float)(x[j]+1)/(float)(x[j]-x[i])); } }
     *
     * BigInteger temp1 =
     * shares[x[i]].getShare().modPow(BigInteger.valueOf((long)lambda),q);
     * System.out.println("lambda : "+lambda); System.out.println("temp1
     * ="+temp1);
     *
     * System.out.println("q : "+q);
     *
     * secret =
     * secret.multiply(shares[x[i]].getShare().modPow(BigInteger.valueOf((long)lambda),q)).mod(q);
    }
     */

    // System.out.println("Secret returning from combine share :" + secret);
    return secret;
  }