def main(argv):
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawTextHelpFormatter, description=__doc__)
    parser.add_argument(
        '--version',
        action='version',
        version='%(prog)s {version}'.format(version=__version__))

    parser.add_argument(
        "keyfile",
        help="public key file from server that we are encrypting to")
    parser.add_argument("input", help="Input HLL")
    parser.add_argument(
        "output", help="binary output file to send to the central hub server")

    args = parser.parse_args(argv)

    print(args)
    sys.stdout.flush()

    output_string = None
    with open(args.keyfile, 'rb') as f:
        public_key = elgamal.deserialize_ElGamalPublicKey(f.read())

    with open(args.input, 'rb') as f:
        hll = hyperloglog.HyperLogLog.safe_import(f.read())

    ehll = elgamal.hospital_round1a_hll(public_key, hll)

    output_string = ehll['transmit']

    with open(args.output, 'wb') as f:
        f.write(output_string)
def main(argv):
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawTextHelpFormatter,
        description=__doc__)
    parser.add_argument('--version', action='version',
                        version='%(prog)s {version}'.format(version=__version__))

    # Shared arguments
    parser.add_argument("output", help="Encrypted combined output summed count")
    parser.add_argument("publickey", help="Public key that the encrypted counts were encrypted using")
    parser.add_argument("input", help="list of all files of hospital inputs corresponding to encrypted counts", nargs="*")

    args = parser.parse_args(argv)

    print(args)
    sys.stdout.flush()

    round1a = []

    for filename in args.input:
        with open(filename, 'rb') as f:
            buf = f.read()
        round1a.append(buf)

    with open(args.publickey, 'rb') as f:
        key_public = elgamal.deserialize_ElGamalPublicKey(f.read())

    round1b = sum([elgamal.CipherText.byte_init(key_public, x) for x in round1a]).export_val()

    with open(args.output, 'wb') as f:
        f.write(round1b)
def main(argv):
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawTextHelpFormatter,
        description=__doc__)
    parser.add_argument('--version', action='version',
                        version='%(prog)s {version}'.format(version=__version__))

    # Shared arguments
    parser.add_argument("publickey", help="Public key that the encrypted counts were encrypted using")
    parser.add_argument("esum", help="encrypted sum count from round 1")
    parser.add_argument("input", help="list of all files of hospital inputs corresponding to encrypted counts", nargs="*")

    args = parser.parse_args(argv)

    print(args)
    sys.stdout.flush()

    round2a = []

    for filename in args.input:
        with open(filename, 'rb') as f:
            buf = f.read()
        round2a.append(buf)

    with open(args.publickey, 'rb') as f:
        key_public = elgamal.deserialize_ElGamalPublicKey(f.read())

    with open(args.esum, 'rb') as f:
        encrypted_sum = elgamal.CipherText.byte_init(key_public, f.read())

    round2b_sec = elgamal.Integer(1)
    for sec in round2a:
        round2b_sec = (round2b_sec * elgamal.Integer.from_bytes(sec)) % key_public.p
    s_inv = pow(round2b_sec, key_public.p - 2, key_public.p)  # modular multiplicative inverse https://stackoverflow.com/questions/4798654/modular-multiplicative-inverse-function-in-python

    decrypted_sum = (s_inv * encrypted_sum.c2) % key_public.p

    elgamal.load_precomputed_discrete_log4_table()  # using precomputation instead of naive method

    logged_sum = elgamal.discrete_log4(key_public, decrypted_sum)

    print(decrypted_sum)
    print(logged_sum)
Beispiel #4
0
def main(argv):
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawTextHelpFormatter, description=__doc__)
    parser.add_argument(
        '--version',
        action='version',
        version='%(prog)s {version}'.format(version=__version__))

    parser.add_argument(
        "keyfile",
        help="public key file from server that we are encrypting to")
    parser.add_argument("query", help="List of patients who match a query")
    parser.add_argument(
        "output", help="binary output file to send to the central hub server")
    parser.add_argument(
        "--hospital-population",
        help=
        "npy numpy array of numeric patient IDs at the hospital. If unset, will assume that all patients listed in input query are at the hospital."
    )

    args = parser.parse_args(argv)

    print(args)
    sys.stdout.flush()

    output_string = None
    with open(args.keyfile, 'rb') as f:
        public_key = elgamal.deserialize_ElGamalPublicKey(f.read())
    query_results = query_results_fn(args.query, args.hospital_population)

    count = len(query_results)
    to_enc = pow(elgamal.Integer(4), elgamal.Integer(int(count)), public_key.p)

    output_string = elgamal.encrypt(public_key, to_enc).export_val()

    if output_string is not None:
        with open(args.output, 'wb') as f:
            f.write(output_string)
Beispiel #5
0
def main(argv):
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawTextHelpFormatter,
        description=__doc__)
    parser.add_argument('--version', action='version',
                        version='%(prog)s {version}'.format(version=__version__))

    # Shared arguments
    parser.add_argument("publickey", help="Public key that the encrypted HLLs were encrypted using")
    parser.add_argument("ehll", help="encrypted combined HLL from round 1")
    parser.add_argument("input", help="list of all files of hospital inputs corresponding to partial decryptions", nargs="*")

    args = parser.parse_args(argv)

    print(args)
    sys.stdout.flush()

    round2a = []

    for filename in args.input:
        with open(filename, 'rb') as f:
            buf = f.read()
        round2a.append(buf)

    with open(args.publickey, 'rb') as f:
        key_public = elgamal.deserialize_ElGamalPublicKey(f.read())

    with open(args.ehll, 'rb') as f:
        ehll_bytes = f.read()

    round2b = elgamal.hub_round2b_hll(key_public, ehll_bytes, round2a)

    combined_hll = hyperloglog.HyperLogLog(len(round2b['combined_buckets']))
    combined_hll.buckets = round2b['combined_buckets']

    print(combined_hll.count())