Пример #1
0
        if sk is None:
            sk = [random.randint(0, 1) for _ in range(self.n)]
        pk = [self.g**t for t in self.k]
        h  = reduce(lambda a, b: a * b, [g**s for g, s in zip(pk, sk)])**(-1)
        pk += [h]

        return {"public_key": pk, "secret_key": sk}

    def encrypt(self, pk, m):
        return [g**self.r for g in pk[0:-1]] + [m * pk[-1]**self.r]

    def decrypt(self, sk, c):
        return c[-1] * reduce(lambda a, b: a * b, [g**s for g, s in zip(c[0:-1], sk)])


if __name__ == '__main__':
    from charm.toolbox.integergroup import IntegerGroup
    groupObj = IntegerGroup()
    groupObj.paramgen(1024)
    r = groupObj.random()

    k  = [groupObj.random() for _ in range(4)]
    g1 = groupObj.randomGen()

    bhho = BHHO(groupObj, g1, k, r)
    keys = bhho.generate_key()
    m1 = groupObj.random()
    c = bhho.encrypt(keys["public_key"], m1)
    m2 = bhho.decrypt(keys["secret_key"], c)
    print(m1==m2)
Пример #2
0
def random_zr(group: IntegerGroup, r):
    """ Generate a random element in Zr
    """
    return group.random(max=int(r))
Пример #3
0
def benchmark_hve_sigle_operation():
    """
    """
    group_params = dict()
    group_params[256] = parse_params_from_string(
        pairingcurves.PAIRING_CURVE_TYPE_A1_256_SAMPLE)
    group_params[512] = parse_params_from_string(
        pairingcurves.PAIRING_CURVE_TYPE_A1_512_SAMPLE)
    group_params[1024] = parse_params_from_string(
        pairingcurves.PAIRING_CURVE_TYPE_A1_1024_SAMPLE)
    group_params[2048] = parse_params_from_string(
        pairingcurves.PAIRING_CURVE_TYPE_A1_2048_SAMPLE)

    num_runs = 10
    headers = [
        'bitLen', 'time_random_element', 'time_power_g',
        'time_random_element_subgroup', 'time_random_element_zr', 'time_pair',
        'time_power_gt', 'time_mul_two_subgroup', 'time_div_gt'
    ]
    with open('benchmark_operation.csv', 'w') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(headers)
        for bitLen, groupParam in group_params.items():
            print('--------------------------------------------')
            print('bitLen=', bitLen)
            int_group = IntegerGroup()

            p = int(groupParam[hvehelper.PARAM_KEY_N0])
            q = int(groupParam[hvehelper.PARAM_KEY_N1])

            group = pairinggroup.PairingGroup()
            group.init_from_str(
                pairinggroup.convert_params_to_string(groupParam))

            start_time = time.time()
            for _ in range(num_runs):
                tmp = group.random(pairinggroup.G1)
            end_time = time.time()
            time_random_element = (end_time - start_time) / num_runs
            print('time_random_element=', time_random_element)
            tmp = group.random(pairinggroup.G1)
            print('base_1:', tmp)

            start_time = time.time()
            for i in range(num_runs):
                _ = tmp**p
            end_time = time.time()
            time_power_g = (end_time - start_time) / num_runs
            print('time_power_g=', time_power_g)
            time_random_element_subgroup = time_random_element + time_power_g
            print('time_random_element_subgroup=',
                  time_random_element_subgroup)

            start_time = time.time()
            for _ in range(num_runs):
                a = int_group.random(max=int(p))
            end_time = time.time()
            time_random_element_zr = (end_time - start_time) / num_runs
            print('time_random_element_zr=', time_random_element_zr)
            a = int(hve.random_zr(int_group, p))

            g = hve.random_gp(group, p, q)
            v = hve.random_gp(group, p, q)

            start_time = time.time()
            for _ in range(num_runs):
                tmp = hve.pair(g, v)
            end_time = time.time()
            time_pair = (end_time - start_time) / num_runs
            print('time_pair=', time_pair)
            A = hve.pair(g, v)
            print('base_2:', A)

            start_time = time.time()
            for _ in range(num_runs):
                tmp = A**p
            end_time = time.time()
            time_power_gt = (end_time - start_time) / num_runs
            print('time_power_gt=', time_power_gt)

            tmp = hve.random_gq(group, p, q)
            start_time = time.time()
            for _ in range(num_runs):
                v * tmp
            end_time = time.time()
            time_mul_two_subgroup = (end_time - start_time) / num_runs
            print('time_mul_two_subgroup=', time_mul_two_subgroup)

            g = hve.random_gp(group, p, q)
            v = hve.random_gp(group, p, q)
            t1 = hve.pair(g, v)
            g = hve.random_gp(group, p, q)
            v = hve.random_gp(group, p, q)
            t2 = hve.pair(g, v)

            start_time = time.time()
            for _ in range(num_runs):
                t1 / t2
            end_time = time.time()
            time_div_gt = (end_time - start_time) / num_runs
            print('time_div_gt=', time_div_gt)

            writer.writerow([
                bitLen, time_random_element, time_power_g,
                time_random_element_subgroup, time_random_element_zr,
                time_pair, time_power_gt, time_mul_two_subgroup, time_div_gt
            ])