def secret_int_to_points(secret_int, point_threshold, num_points, prime=None): """ Split a secret (integer) into shares (pair of integers / x,y coords). Sample the points of a random polynomial with the y intercept equal to the secret int. """ if point_threshold < 2: raise ValueError("Threshold must be >= 2.") if point_threshold > num_points: raise ValueError("Threshold must be < the total number of points.") if not prime: prime = get_large_enough_prime([secret_int, num_points]) if not prime: raise ValueError("Error! Secret is too long for share calculation!") coefficients = random_polynomial(point_threshold-1, secret_int, prime) points = get_polynomial_points(coefficients, num_points, prime) return points
def secret_int_to_points(secret_int, point_threshold, num_points): """ Split a secret (integer) into shares (pair of integers / x,y coords). Sample the points of a random polynomial with the y intercept equal to the secret int. """ if point_threshold < 2: raise ValueError("Threshold must be >= 2.") if point_threshold > num_points: raise ValueError("Threshold must be < the total number of points.") prime = get_large_enough_prime([secret_int, num_points]) if not prime: raise ValueError("Error! Secret is too long for share calculation!") print 'Selected Prime Number = ', prime coefficients = random_polynomial(point_threshold-1, secret_int, prime) points = get_polynomial_points(coefficients, num_points, prime) return points
def points_to_secret_int(points): """ Join int points into a secret int. Get the intercept of a random polynomial defined by the given points. """ if not isinstance(points, list): raise ValueError("Points must be in list form.") for point in points: if not isinstance(point, tuple) and len(point) == 2: raise ValueError("Each point must be a tuple of two values.") if not isinstance(point[0], (int, long)) and \ isinstance(point[1], (int, long)): raise ValueError("Each value in the point must be an int.") x_values, y_values = zip(*points) prime = get_large_enough_prime(y_values) free_coefficient = modular_lagrange_interpolation(0, points, prime) secret_int = free_coefficient # the secret int is the free coefficient return secret_int
print '---' print 'Example: python additions.py 7 3 123 -556 3 -4' print '---' sys.exit() # Get inputs. Just trying this for 2 secrets and 2 coefficients num_points = int(sys.argv[1]) threshold = int(sys.argv[2]) secret1 = int(sys.argv[3]) secret2 = int(sys.argv[4]) coeff1 = int(sys.argv[5]) coeff2 = int(sys.argv[6]) # Determine a large-enough prime number prime = get_large_enough_prime([max(abs(secret1), abs(secret2))*max(abs(coeff1), abs(coeff2)), num_points]) # Compute shares of each secret shares1 = secret_int_to_points_given_prime(secret1, threshold, num_points, prime) print shares1 shares2 = secret_int_to_points_given_prime(secret2, threshold, num_points, prime) print shares2 # Reconstruct the shares of the linear combination of the secret shares3 = [] for i in range(1,num_points+1): shares3.append((i, (coeff1*shares1[i-1][1] + coeff2*shares2[i-1][1]) % prime)) print shares3 recovered_sum = points_to_secret_int(shares3[1:1+threshold])